BoneMobile容器SDK为可选模块,提供了加载插件的功能。如果您需要开发或者使用插件,则需要在App中集成BoneMobile容器SDK。

依赖SDK 概述
API通道 提供API通道能力
说明 Google Play已于2019年8月1日停掉尚未支持64位体系的App,如果您App要在中国内地之外的国家和地区(包括港澳台地区)的Google Play应用商店上架,且用到了BoneKit SDK,那需要尽快升级,以免无法上架。后续如果推出新插件或老插件升级,仅针对已升级到v0.59 BoneKit SDK的自有App。

初始化

初始化前需确保已集成安全图片,初始化的操作请参见SDK初始化

使用方式

  • 打开插件面板
    
    // 第一参数,当前上下文,通常是 Activity
                // 第二参数,格式为“link://plugin/{插件 Id}”, 可以参见想要打开的插件的具体说明,以下以打开国内配网插件为例
                Router.getInstance().toUrl(context, "link://router/connectConfig"); // "link://plugin/a123kfz2KdRdrfYc"已不再推荐使用
                        
  • 打开插件面板并接收返回值

    请参见调用配网插件,并接受配网结果的示例。

    // 启动插件
    Bundle bundle = new Bundle();
    bundle.putString("productKey", pk);
    Router.getInstance().toUrlForResult(activity, "link://router/connectConfig",{your_request_code}, bundle);
    
    // 接收配网结果
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        ...
        if (REQUEST_CODE_PRODUCT_ADD == requestCode) {
            if (Activity.RESULT_OK != resultCode) {
                // 配网失败
                return;
            }
    
            String productKey = data.getStringExtra("productKey");
            String deviceName = data.getStringExtra("deviceName");
            // 配网成功
        } 
    
    }
                        
  • 打开调试面板

    请参见如下代码使用本地调试功能。

    String ip = "{IP地址}"; //开发电脑上要开启 Bone 调试服务
                new BoneDevHelper().getBundleInfoAsync(this, ip, new BoneDevHelper.OnBondBundleInfoGetListener() {
                @Override
                public void onSuccess(BoneDevHelper.BoneBundleInfo boneBundleInfo) {
                    BoneDevHelper.RouterInfo info = new BoneDevHelper().handleBundleInfo(MainActivity.this, boneBundleInfo);
    
                    if (null == info) {
                        return;
                    }
    
                    Router.getInstance().toUrl(MainActivity.this, info.url, info.bundle);
                }
    
                @Override
                public void onError(String message, Exception e) {
                    Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
    
                    if (null != e) {
                        e.printStackTrace();
                    }
                }
            });
                        

集成账号能力

插件中如果需要访问当前用户相关信息(例如:当前用户是否登录,用户的昵称是什么等),需要集成账号及用户 SDK,并注册API到容器。

账号SDK的集成请参见账号及用户SDK

API注册到容器,请参考如下代码如下。

BonePluginRegistry.register(BoneUserAccountPlugin.API_NAME, BoneUserAccountPlugin.class);

集成物模型能力

插件中如果需要使用物模型API(如设备面板的场景),则需要集成物模型SDK,并注册API到容器。

物模型SDK的集成,请参见物模型SDK

API注册到容器,请参考如下代码。

BonePluginRegistry.register("BoneThing", BoneThing.class);

集成配网能力

插件中如果需要使用配网能力,则需要集成配网SDK,并注册API到容器。

配网 SDK 的集成,请参见配网SDK

API 的注册,请参考如下代码。

BonePluginRegistry.register("BoneAddDeviceBiz",BoneAddDeviceBiz.class);
BonePluginRegistry.register("BoneLocalDeviceMgr",BoneLocalDeviceMgr.class);
BonePluginRegistry.register("BoneHotspotHelper",BoneHotspotHelper.class);

// 如果需要绑定蓝牙设备,需要添加如下代码
BonePluginRegistry.register("BoneThing", BoneThing.class);

集成长连接能力

插件中如果需要订阅云端消息,则需要集成长连接通道 SDK,并注册 API 到容器。

长连接通道 SDK 的基础,请参见长连接通道SDK

API 的注册,请参考如下代码:

BonePluginRegistry.register("BoneChannel", BoneChannel.class);

Native和JS共享配置

某些业务场景下, Native 端和 JS 端可能需要共享一些配置。为了满足这个需求,我们开辟了一个 Native 和 JS 都可以访问的配置区。

JS 端访问配置区,请参见:环境配置信息

Android 端访问配置区,可以参考如下代码:

// 设置
BoneConfig.set("region", "china");

// 获取
String region = BoneConfig.get("region");

图片库替换

为了减小BoneKit的SDK大小,降低接入成本及运行期的CPU/内存/文件系统资源消耗。BoneMobileRN容器允许开发者定制自己想用的图片库组件。

如果您已经有了成熟的APK包,并且使用了Fresco以外的图片库,请参见以下步骤替换图片库。

说明 各个图片库支持的图片格式有所差异,在替换图片库时,需要注意以下内容。
  • gif的支持,请使用支持gif动画的图片库或者自己实现gif的支持,否则可能导致使用了gif图片的页面显示异常。
  • 图片圆角的支持,请实现对于圆角的支持,否则设置了圆角的图片可能显示异常。
  1. 实现ImageLoaderModule

    实现 ImageLoaderModule,参见Facebook的官方文档Native Modules

    请参见Facebook基于Fresco实现的ImageLoaderModule, 来实现您的ImageLoaderModule。

  2. 实现 ReactImageManager

    实现 ReactImageManager,请参见 Facebook 的官方文档Native UI Components

    请参见Facebook基于Fresco实现的ReactImageManager.java,来实现您的ReactImageManager。

  3. 实现ReactTextInlineImageViewManager

    实现ReactTextInlineImageViewManager与实现ReactImageViewManager类似,都继承自ViewManager,但差别在于,这次需要实现ShadowNode。ShadowNode需要继承自ReactTextInlineImageShadowNode。

    请参见基于Fresco实现的 FrescoBasedReactTextInlineImageViewManagerFrescoBasedReactTextInlineImageShadowNode来实现您的ReactTextInlineImageViewManager。

  4. 实现ImagePackage

    ImagePackage的实现比较简单,把前面步骤实现的API和组件展现出来即可。参见下面的代码。

    public class FrescoPackage implements ReactPackage {
      @Override
      public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        return Arrays.<NativeModule>asList(
          new ImageLoaderModule(reactContext)
        );
      }
    
      @Override
      public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
      }
    
      @Override
      public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Arrays.<ViewManager>asList(
          new ReactImageManager(),
          new FrescoBasedReactTextInlineImageViewManager()
        );
      }
    }
  5. 注册ImagePackage

    最后把刚才实现的ImagePackage注册到BoneKit的全局配置即可。

    // 添加你自己的图片组件支持
            RNGlobalConfig.addBizPackage(new ImagePackage());
  6. 删除Fresco的相关依赖和代码

    删除Fresco的依赖,仅保留BoneKit的依赖,参见如下代码。

    compile ('com.aliyun.iot.aep.page:rn:0.0.3.2-SNAPSHOT'){
            exclude group:'com.aliyun.iot.aep.sdk', module:'rn-external-fresco' //移除Fresco的依赖
        }
        compile 'com.aliyun.alink.external:flog:1.0.0@aar'//ReactNative使用了Fresco内部的Flog相关类,Fresco移除后,需要额外添加flog

    删除FrescoPackage的添加代码如下。

    // 添加基于 Fresco 的图片组件支持
            // RNGlobalConfig.addBizPackage(new FrescoPackage());

注:仅支持apiLevel<=6

支持GIF WebP

Android平台下,默认不支持GIF、WebP格式。可以增加支持库如下。

dependencies {
    compile 'com.facebook.fresco:animated-gif:0.11.0'  //需要GIF动画支持添加本行语句
    compile 'com.facebook.fresco:webpsupport:0.11.0'   //需要WebP格式支持添加本行语句
    compile 'com.facebook.fresco:animated-webp:0.11.0'  //需要WebP动画支持添加本行语句
}

混淆配置

请参见混淆配置