Skip to content

MiEcosystem/ios-remote-resource

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

说明

资源包插件(MiHomeResoucePlugin)是为米家 iOS 合作开发(原生语言嵌入开发)的厂商推出地插件系统,旨在分离代码与资源文件,提供资源热更新功能,同时为米家 App 瘦身,减小用户下载量。native插件必须使用资源包。

资源包内容

图片图标,音频视频文件,本地json文件,隐私协议等html文件以及其他占用空间的本地文件,都需要放入资源包。

插件申请

  1. 米家开放平台登录自己的企业开发者账号;
  2. 进入 产品管理 ,找到对应产品,点击进入。选择 米家插件管理 下的 插件版本管理 ,选择 ios插件 ,点击创建创建
  3. 插件类型选择 ios资源包,填入信息。创建插件的过程中需要填写一个插件包名,命名规则一般为:若开发者标识为 aaa,设备 model 为aaa.bbb.v1,则 iOS 插件包名一般为 com.aaa.bbb.ios.iosr 。例如,xiaomi 公司开发了一款火箭筒,设备 modelxiaomi.rocketlauncher.v1,则该火箭筒在米家iOS客户端中的插件包名为 com.xiaomi.rocketlauncher.ios.iosr

插件创建

  1. 进入该项目根目录

  2. 运行 createPlugin 脚本

    ./createPlugin plugin_name

    其中 plugin_name 为之前申请创建时的名称 com.aaa.bbb.ios.iosr

  3. 插件创建后,会在 SDK 目录下,生成一个 plugin_name 目录。目录下包含:

    • packageInfo.json ,插件包信息文件
    • config.plist, 插件包配置文件,开发者无需修改,不必关心,随 SDK 更新
    • Resources目录,资源文件存放处

Resources目录

资源文件存放处,将自己项目中所有的资源文件放入该目录,不能有子目录

资源包中支持的图片类型: .png .jpg jpeg

代码中可以直接通过:

[UIImage imageNamed:"imagename.png"]

访问资源包中的图片

资源包中的其他资源(html,音视频文件等)可以通过如下接口访问:

- (NSString *)MHPathForResource:(NSString *)name ofType:(NSString *)ext;

资源包中暂不支持的资源文件类型: .xib, .strings, .nib, .storyboard

packageInfo.json

该文件关系到插件包的打包与上传,请用文本编辑器打开并编辑其中内容:

{
 "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,不用修改
}

插件包 asset_level 的确定

为配合资源包插件,合作开发提供的代码中**,有且只有一处需要额外修改**:

在入口 ViewController.m 中,该 VC 继承自 MHDeviceViewControllerBase,添加方法:

+ (NSInteger)getResourcePluginAssetLevel{
    return 1; //该数值需与packageInfo.json 中的 asset_level 值相同
}

米家 App 运行时,会根据该方法返回的值,去开放平台拉取相同值的插件包。 即,代码与插件包由 asset_level 形成一一对应的关系:

  1. 代码中未添加该方法,不会拉取资源包;
  2. 后续代码更新,涉及图片资源变更,需更新资源包,提高资源包中的 asset_level 值,代码中该方法的返回值相应提高。不涉及图片资源更变,则无需更新资源包,代码该方法的返回值也不用更改;
  3. 对于已经上线的版本,更新资源包,保持 asset_level 不变,则线上 App 会应用最新的对应 asset_level 值的资源包。保持资源名称不变,可实现图片替换,即资源的热更新。

更新原则

  1. 如果资源没有改动,发新版本可以重用之前的资源包,资源包不需要更新。
  2. 假如资源包有改动,assetLevel加1,保证老版本不受影响。
  3. assetlevel不变,但是资源变,仅用来热更新资源,做运营或者修复用途。
  4. 同 model,哪个包的 version 高,下哪个

Debug 建议

由于 合作开发包,没有资源包下载的逻辑,你调试的时候 可以将资源文件夹拷贝到app 的沙盒目录下, 然后改一下

  • (NSString *)MHPathForResource:(NSString *)name ofType:(NSString *)ext; 的实现,指向你手动拷贝的资源文件夹的路劲。这样就可以了。

插件的打包和签名

准备插件签名文件

  1. 生成属于米家开发者账号的 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
  2. 在小米 IoT 开发者平台,个人开发者选项中,填入公钥。即 keystore 文件的证书 MD5 指纹:

    keytool -list -v -keystore your.keystore

    取出其中的 MD5 指纹并去掉冒号。

  3. 使用 keystore 文件按照下述流程提取出 iOS 能够识别的公钥和私钥文件。

  4. 导出公钥文件 public.cer:(需要安装keytool)

    keytool -export -keystore your.keystore -alias yourKeyAlias -file public.cer

    其中 yourKeyAlias 与生成 keystore时的同名参数保持一致。如果是安卓生成的,可以通过下面的命令来查看设置的别名。

    keytool -list -keystore your.keystore
  5. 导出私钥 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
  6. 保留好生成的 public.cer 以及 private.pem,插件包签名时将用到这两个文件。

打包并给插件签名

  1. 修改本地插件包的 packageInfo.json 一般是将上一次成功上传的 version + 1,并确定 asset_level 等其他信息是否填写正确。

  2. 进入该项目根目录

  3. 运行 packagePluginAndSign 脚本进行打包:

    python packagePluginAndSign plugin_name /path/to/private.pem /path/to/public.cer yourDeveloperId

    其中 plugin_name 是插件包的目录名,private.pem 和 public.cer 分别是准备好的私钥和公钥文件,yourDeveloperId 是开发此插件的米家开发者账号(数字小米ID)

  4. 签名过程中会要求输入私钥文件的密码。

  5. 打包成功后会在当前目录下生成 plugin_name.signed.zip 的已签名插件包。

  6. 用开发者账号登录米家开放平台,在插件管理里选择相应的iOS插件,点击“上传插件包”进行上传。

  7. 成功后点击该插件包的“白名单测试”,即可用 appstore 版本的客户端下载在白名单范围内下载到此插件进行测试。

插件的测试和发布

插件的测试和发布流程请联系米家的工作人员。

About

support remote resource for iOS native development

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •