资源包插件(MiHomeResoucePlugin)是为米家 iOS 合作开发(原生语言嵌入开发)的厂商推出地插件系统,旨在分离代码与资源文件,提供资源热更新功能,同时为米家 App 瘦身,减小用户下载量。native插件必须使用资源包。
图片图标,音频视频文件,本地json文件,隐私协议等html文件以及其他占用空间的本地文件,都需要放入资源包。
- 在米家开放平台登录自己的企业开发者账号;
- 进入 产品管理 ,找到对应产品,点击进入。选择 米家插件管理 下的 插件版本管理 ,选择 ios插件 ,点击创建创建;
- 插件类型选择 ios资源包,填入信息。创建插件的过程中需要填写一个插件包名,命名规则一般为:若开发者标识为 aaa,设备 model 为aaa.bbb.v1,则 iOS 插件包名一般为 com.aaa.bbb.ios.iosr 。例如,xiaomi 公司开发了一款火箭筒,设备 model 为 xiaomi.rocketlauncher.v1,则该火箭筒在米家iOS客户端中的插件包名为 com.xiaomi.rocketlauncher.ios.iosr
-
进入该项目根目录
-
运行 createPlugin 脚本
./createPlugin plugin_name
其中 plugin_name 为之前申请创建时的名称 com.aaa.bbb.ios.iosr
-
插件创建后,会在 SDK 目录下,生成一个 plugin_name 目录。目录下包含:
packageInfo.json
,插件包信息文件config.plist
, 插件包配置文件,开发者无需修改,不必关心,随 SDK 更新Resources
目录,资源文件存放处
资源文件存放处,将自己项目中所有的资源文件放入该目录,不能有子目录。
资源包中支持的图片类型: .png
.jpg
jpeg
。
代码中可以直接通过:
[UIImage imageNamed:"imagename.png"]
访问资源包中的图片
资源包中的其他资源(html,音视频文件等)可以通过如下接口访问:
- (NSString *)MHPathForResource:(NSString *)name ofType:(NSString *)ext;
资源包中暂不支持的资源文件类型:
.xib
, .strings
, .nib
, .storyboard
该文件关系到插件包的打包与上传,请用文本编辑器打开并编辑其中内容:
{
"package_name":"com.aaa.bbb.ios.iosr", // 插件包名,不用修改
"developer_id":"123456789", // 企业开发者账号小米ID
"models":"aaa.bbb.v1|your_device_model2", // 插件支持的设备 model,一个插件包可以支持多个model,用|分割。合作开发提供的代码支持哪些产品 model ,需要全部填入
"asset_level":"1", // 与合作开发提供的原生代码中的 asset_level 对应,以1开始计数。具体更改规则见后续章节
"version":"1", // 插件包的版本,每个上传的插件包都要不同且递增,每次上传新的插件包之前都需要修改
"min_api_level":"1",//保留字段,默认为1,不用修改
"platform":"iphone" // 插件包支持的平台,目前只支持iphone,不用修改
}
为配合资源包插件,合作开发提供的代码中**,有且只有一处需要额外修改**:
在入口 ViewController.m 中,该 VC 继承自 MHDeviceViewControllerBase,添加方法:
+ (NSInteger)getResourcePluginAssetLevel{
return 1; //该数值需与packageInfo.json 中的 asset_level 值相同
}
米家 App 运行时,会根据该方法返回的值,去开放平台拉取相同值的插件包。 即,代码与插件包由 asset_level 形成一一对应的关系:
- 代码中未添加该方法,不会拉取资源包;
- 后续代码更新,涉及图片资源变更,需更新资源包,提高资源包中的 asset_level 值,代码中该方法的返回值相应提高。不涉及图片资源更变,则无需更新资源包,代码该方法的返回值也不用更改;
- 对于已经上线的版本,更新资源包,保持 asset_level 不变,则线上 App 会应用最新的对应 asset_level 值的资源包。保持资源名称不变,可实现图片替换,即资源的热更新。
- 如果资源没有改动,发新版本可以重用之前的资源包,资源包不需要更新。
- 假如资源包有改动,assetLevel加1,保证老版本不受影响。
- assetlevel不变,但是资源变,仅用来热更新资源,做运营或者修复用途。
- 同 model,哪个包的 version 高,下哪个
由于 合作开发包,没有资源包下载的逻辑,你调试的时候 可以将资源文件夹拷贝到app 的沙盒目录下, 然后改一下
- (NSString *)MHPathForResource:(NSString *)name ofType:(NSString *)ext; 的实现,指向你手动拷贝的资源文件夹的路劲。这样就可以了。
-
生成属于米家开发者账号的 keystore 证书文件。 注意此文件 iOS 与 android 通用并且需要保持一致,如果已经开发过 android 插件,请使用当时生成的 keystore 文件,并跳过步骤1和2。
keytool -genkey -dname CN=YourName,OU=YourCompany,O=YourCompany,L=Beijing,ST=Beijing,C=86 -alias yourKeyAlias -keypass 123456 -storepass 123456 -keystore ./your.keystore -validity 18000 -keyalg RSA -keysize 2048
-
在小米 IoT 开发者平台,个人开发者选项中,填入公钥。即 keystore 文件的证书 MD5 指纹:
keytool -list -v -keystore your.keystore
取出其中的 MD5 指纹并去掉冒号。
-
使用 keystore 文件按照下述流程提取出 iOS 能够识别的公钥和私钥文件。
-
导出公钥文件 public.cer:(需要安装keytool)
keytool -export -keystore your.keystore -alias yourKeyAlias -file public.cer
其中 yourKeyAlias 与生成 keystore时的同名参数保持一致。如果是安卓生成的,可以通过下面的命令来查看设置的别名。
keytool -list -keystore your.keystore
-
导出私钥 pem 文件 private.pem: (需要 openSSL)
keytool -importkeystore -srckeystore your.keystore -destkeystore private.pkcs -srcstoretype JKS -deststoretype PKCS12 -alias yourKeyAlias openssl pkcs12 -in private.pkcs -out private.pem
-
保留好生成的 public.cer 以及 private.pem,插件包签名时将用到这两个文件。
-
修改本地插件包的 packageInfo.json 一般是将上一次成功上传的 version + 1,并确定 asset_level 等其他信息是否填写正确。
-
进入该项目根目录
-
运行 packagePluginAndSign 脚本进行打包:
python packagePluginAndSign plugin_name /path/to/private.pem /path/to/public.cer yourDeveloperId
其中 plugin_name 是插件包的目录名,private.pem 和 public.cer 分别是准备好的私钥和公钥文件,yourDeveloperId 是开发此插件的米家开发者账号(数字小米ID)
-
签名过程中会要求输入私钥文件的密码。
-
打包成功后会在当前目录下生成 plugin_name.signed.zip 的已签名插件包。
-
用开发者账号登录米家开放平台,在插件管理里选择相应的iOS插件,点击“上传插件包”进行上传。
-
成功后点击该插件包的“白名单测试”,即可用 appstore 版本的客户端下载在白名单范围内下载到此插件进行测试。
插件的测试和发布流程请联系米家的工作人员。