国内站产品与国际站的开发存在差异,此文主要介绍针对国际站额外需要修改的内容。

设备端开发

在海外设备激活联网时,将统一连接到新加坡激活中心。在设备绑定时,平台将根据用户所在区域,自动将设备切换到相应的region。例如:用户注册时选择的国家为美国,平台会将该用户待绑定的设备切换到美国的服务器。

  • 请确认使用最新的生活物联网平台SDK( V1.1.0及以上版本),获取最新的生活物联网平台SDK请参见SDK概述与开发环境设置

    该版本SDK集成了设备端根据平台下发的指令切换到对应region的功能,无需额外修改代码。

  • 设备端固件需要修改以下两个配置来支持统一连接到新加坡激活中心。如果基于AliOS Things中的linkkitapp开发应用,需要进行如下手动修改。
    • 更改example下应用代码的domain type设定。在example/linkkitapp/linkkit_example_solo.c文件的linkkit_main()函数中,如下图所示将domain_type的赋值从IOTX_CLOUD_REGION_SHANGHAI改为IOTX_CLOUD_REGION_SINGAPORE参数修改
    • example/linkkitapp/make.settings文件中,将FEATURE_MQTT_DIRECT的状态设置为关闭(即如下图所示配置为n)。参数修改
    • example/linkkitapp/app_entry.c文件的函数application_start中,确认set_iotx_info()放在netmgr_init()前面,如下图所示。参数修改
  • 如果基于AliOS Things中的living_platform开发应用,example/living_platform/gen_firmware.sh编译脚本支持通过不同选项编译海外和国内的固件。编译时根据中国大陆和海外的不同选项,domain type变量和宏FEATURE_MQTT_DIRECT会被自动配置,无需再手动修改。

    以下介绍如何基于gen_firmware.sh脚本编译固件。

    1. 打开gen_firmware.sh文件,按红色标识指定board。参数修改
    2. 执行以下命令编译脚本。
      bash gen_firmware.sh
      参数选择
    3. 选择要编译的固件。
      • c:每次编译前需进行clean操作
      • 3:编译国内站固件
      • 5:编译国际站固件
    4. 查看编译结果。

      该示例编译输出的固件存放在out/living_platform@boardname/binary目录下。

配置控制台

按照以下操作,为您的产品分别在中国站与国际站创建产品和自有品牌App。

  1. 选择站点,设置为国际站
  2. 创建一个项目。详细参见创建项目
  3. 在项目中创建产品,并定义产品功能。详细参见创建产品并定义功能
  4. 设置App功能参数(详细参见概述)。其中,在多语言管理中配置英文(或其他语言)的产品名称与产品功能。
    多语言管理
  5. 在项目中创建自有品牌App,详细参见创建自有App
    说明 国际站中App创建的包名、签名(Android)、bundleID(iOS)需与中国站的一致。
  6. 站点选择为中国站,重复以上操作步骤,在中国站创建产品与自有品牌App。

客户端开发

  1. 集成安全图片。

    根据集成安全图片的操作,分别从中国站与国际站获取测试版、正式版,共四张安全图片,将4张安全图片集成到App工程中。

    - 测试版 正式版
    中国版 yw_1222_china_develop.jpg yw_1222_china_production.jpg
    国际版 yw_1222_oversea_develop.jpg yw_1222_oversea_production.jpg
    • Android放置安全图片
    • iOS
  2. 下载并集成SDK,详细请参见下载并集成SDK
  3. 初始化SDK,详细请参见SDK初始化(Android)SDK初始化(iOS)

    初始化时设置接入类型,国际站必须配置为REGION_ALL

  4. 设置国家信息。

    如果您App会运行在海外或者需要在中国大陆跟海外之间切换,那么需要用户在账号注册之前设置国家/区域。

    说明 App连接国内还是海外取决于账号注册时所选的国家。且当App在国内与海外相互切换时,需要重启App。
    • 获取国家/区域信息
      iOS篇:
      [[IMSIotSmart sharedInstance] getCountryList:^(NSError * _Nullable error, NSArray<IMSIotCountry *> * _Nullable countryList) {
              // 返回的 countryList 为原始数据
              
          }];
      Android篇:
      public static void getCountryList(final ICountryListGetCallBack callback)
          IoTSmartImpl.getInstance().getCountryList(callback);
        }
    • 设置国家/区域
      iOS篇:
      [[IMSIotSmart sharedInstance] setCountry:_selectCountry callback:^(BOOL needRestartApp) {
              if (needRestartApp) {
                  // 中国大陆与其他区域的切换需要重启app
              }
          }];
      Android篇:
      IoTSmart.setCountry(mSelectedCountry, needRestartApp -> {
                if (needRestartApp) {
                          }
      });
    • 获取已设置的国家/区域
      iOS篇:
      IMSIotCountry *country = [[IMSIotSmart sharedInstance] getCountry];
      Android篇:
      GlobalConfig.getInstance().getCountry()
  5. 设置国际语言。

    通过以下设置可更改SDK内部语言。目前可以支持中文(zh-CN)、 英文(en-US)、法文(fr-FR)、德文(de-DE)、日文(ja-JP)、韩文(ko-KR)、西班牙文(es-ES)、俄文(ru-RU)、意大利文(it-IT)、印地文(hi-IN)十种语言。

    Android篇:
    IoTSmart.setLanguage(languageName);
    // 查看sdk当前设置的语言
     public static String getLanguage() {
            return IoTSmartImpl.getInstance().getLanguage();
    }
    iOS篇:
    NSString *language = @"zh-CN";
    [[IMSIotSmart sharedInstance] setLanguage:language];
    
    // 查看sdk当前设置的语言
    NSString *language = [[IMSIotSmart sharedInstance] getLanguage];

    iOS可能还需要设置OA UI的语言。

    设置语言
     // 使用默认的翻译资源文件
        [[IMSiLopOALanguageManage shareInstance]
        setOpenAccountModuleLanguageWithLanguagePrefix:@"ko"];
    
    // 想使用自己的资源文件(xxxx):将 IMSOpenAccountCustom的IMSOpenAccountCustomResource.bundle的.lproj文件中的内容拷贝,自行整理一份相同key的八国语言翻译
        [[IMSiLopOALanguageManage shareInstance] 
        setOpenAccountModuleLanguageWithLanguagePrefix:@"ko" bundleName:@"xxxx"];

App调试说明

当您完成产品的国际站开发,在国内使用开发版App调试时,需要注意以下事项。

  • App的地区请选择除“中国大陆”以外的任意地区。
  • 使用手机号注册/登录时,需要选择国家区号,如中国大陆为”+86“。

云端开发

当您调用云端API,向国际站的云端发送请求时,需修改请求消息中的Host(默认为中国站的Host),否则调用请求会失败。调用云端API的详细介绍请参见准备工作

  • Java版如下。
    ApiResponse response = syncClient.postBody("api-iot.ap-southeast-1.aliyuncs.com",
    "/cloud/token", request, true);
  • PHP版如下。
    function example() { 
    $path = "/cloud/token"; 
    $host = "https://api-iot.ap-southeast-1.aliyuncs.com"; 
    $appKey = "你的"; 
    $appSecret = "你的"
    ...
    }