iOS 接入
小程序运行环境受限于 iOS 9.0 以上系统 WKWebView 的 API 调用,只能运行在 iOS 9.0 及以上;
小游戏运行环境受限于性能、API 限制等问题,只能运行在 iOS 10.0 及以上。
1. 宿主信息配置
下载宿主信息文件:union-cfg.json ,字段格式:
1 | // 在小程序开源官方平台上(注册、登录),设置-->开发设置入口获取。 |
在实现 BBASMPlatformAdapterProtocol 协议时,将下载的 json 内容设置到 hostConfig 接口中;每次更新开源小程序 SDK 时,宿主信息如有变动,注意修改 shareCallBackUrl、version 的值。
2. 工程信息配置
由于小程序 SDK 内部使用到了相机、相册、麦克风、定位、通讯录等权限,需要在宿主工程的 info.plist 中添加以下权限:
| 权限 | Key | 说明 | |
|---|---|---|---|
| 相机 | Privacy - Camera Usage Description | 使用相机的端能力:swan.camera.insert | |
| 相册 | Privacy - Photo Library Usage Description | 从相册选择(保存)图片:swan.chooseImage | |
| 相册 | Privacy - Photo Library Additions Usage Description | 保存图片(在 iOS 11 以上必须要加上) | |
| 麦克风 | Privacy - Microphone Usage Description | 音视频录制:swan.recorder.start | |
| 通讯录 | Privacy - Contacts Usage Description | 获取通讯录:swan.getPhoneContacts | |
| 后台音乐 | Required background modes | App plays audio or streams audio/video using AirPlay | |
| 后台定位 | Required background modes | pivacy - Location When In Use Usage Description | |
| URL Schemes 白名单 | LSApplicationQueriesSchemes | openAppByURL 端能力 |
3. 使用 CocoaPods 集成
基于百度智能小程序 SDK 只开放给开源联盟成员,不能将 SDK 放在 CocoaPods 官网上,需要自建私有 podspec 仓库。
注:对于 gitee 上百度智能小程序开源的私有仓库权限限制,仅开放给开源联盟宿主(非百度系宿主)部分成员,便于宿主团队内部成员也能进行小程序 SDK 集成开发,在开源 demo 工程中,我们提供了代码同步宿主仓库的工具。
集成环境:
- CocoaPods 版本:1.8.4 以上版本。
- Python 版本:3.0 以上。
在宿主的工程中的 Podfile 文件中,设置百度智能小程序 SDK 依赖。
3.1 开源联盟宿主依赖配置
1 | # 开源联盟宿主的小程序podspec私有库源(在gitee小程序下的私有仓库,宿主可将依赖源同步到自己公司下私有仓库中) |
3.2 百度宿主依赖配置
1 | # 百度内部小程序podspec私有库源 |
4. 入口调用
4.1 初始化小程序运行时环境
在 AppDelegate 中的“application:didFinishLaunchingWithOptions:”启动入口,注册小程序运行时环境(尽量放在这里注册,以免影响小程序启动)。
注:调用方法请在“self.window.rootViewController = ”语句后执行,防止小程序环境异常情况出现。
- 调用方法:[BBASMManager registerAppLaunchOptions:nil]; (这里不能使用 Pyramid.bba_smManager 替换 BBASMManager)
1 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { |
4.2 调起小程序入口
小程序(或小游戏)以 custom scheme 协议方式调起,具体协议格式如下:
- 小程序协议格式:hostscheme://swan/appKey
- 小游戏协议格式:hostscheme://swangame/appKey
调起小程序方法:
1 | NSString *spURL = @"baiduboxapp://swan/4fecoAqgCIUtzIyA4FAPgoyrc4oUc25c"; |
如果从 APP 之外调起小程序(分享回流、 UniversalLink 等入口),需要判断是不是小程序的调起协议:
1 | - (BOOL)application:(UIApplication *)application |
扫码打开小程序,按照扫码出来的协议分两种情况:
- 扫码结果为小程序的调起协议:
1 | if ([scanresult containsString:@"://swan/") || |
扫码结果为开发者工具预览生成的小程序二维码 URL ,分长链(开发者工具已废弃,需要兼容)和短链(目前推行方式)。
长链格式:https://smartapp.baidu.com/mappconsole/api/packagescheme- 短链格式:
https://mbd.baidu.com/ma/s/
宿主处理方式:
小程序 SDK2.18.0 版本以前,扫码结果通过以上 URL 判断,发起 302 跳转 get 请求,在请求的 header 里面加上 Swan-Accept:swan/json、User-Agent:小程序webViewAppUA ,然后请求返回小程序调起协议。
1
2
3
4
5
6
7
8
9
10
11
12
13if ([scanresult containsString:@"https://smartapp.baidu.com/mappconsole/api/packagescheme") ||
[scanresult containsString:@"https://mbd.baidu.com/ma/s/"]) {
// 在小程序SDK2.18.0版本以前版本,需要宿主自己发请求,以NSMutableURLRequest举例:
...
[request addValue:@"Swan-Accept" forHTTPHeaderField:@"swan/json"];
[request addValue:[[Pyramid.bba_smManager sharedInstance] webViewAppUA] forHTTPHeaderField:@"User-Agent"];
...
{ // 请求成功
swanAppUrl = response[@"data"];
[Pyramid.bba_smManager openAppUrl:swanAppUrl];
}
}在小程序 SDK2.18.0 之后版本,只需要调用小程序内部提供的方法。
1
2
3
4if ([scanresult containsString:@"https://smartapp.baidu.com/mappconsole/api/packagescheme") ||
[scanresult containsString:@"https://mbd.baidu.com/ma/s/"]) {
[[Pyramid.bba_smManager sharedInstance] generateMNPLaunchDispatcherFromURL:scanresult];
}
4.3 配置端能力描述表
从 2.17.0 版本后,前端 swan 框架在调用 NA 端能力时,使用了 canIUse 方案进行 API 是否存在的判断,这就需要依赖于 NA 端能力描述表传给 swan 框架。
4.3.1 端能力描述表生成规则:
在每个端能力(包括扩展能力)前(header 文件里面)按照端能力规范进行代码注释(可参考开源 demo 中 /SwanModule/SwanExt 下的扩展端能力),然后通过端能力描述收集脚本生成一个总的描述表,将描述表注入到 swanjs 框架中。
4.3.2 使用端能力描述脚本:
【注意】将开源 demo 的 Script/scheme_desc_collector.py ,拷贝到宿主工程中,生成一个端能力描述文件 BBAPluginDescription.zip 文件,拷贝到宿主工程的 Resources 目录下。更新版本时,需要每次重新生成端能力描述文件,如果没有更新,会导致当前集成的 SDK 上的一些端能力无法正常使用。
4.3.3 引用端能力描述文件:
具体实现详见 Adapter 协议 – 配置:pluginDescriptionPath 接口。
4.4 集成扩展包(宿主没有扩展包,忽略)
以开源 demo 为例,宿主需要将 BBAMNPPyramid.bundle 资源拷贝到宿主工程中,自行替换自己的扩展包,结构与 demo 中提供的一致。
具体实现详见 Adapter 协议 – 配置:Extension 配置接口。
5. Adapter 协议实现
由于小程序运行时所用到能力依赖宿主 NA 端的环境,需要 NA 端实现小程序框架中提供的 Adapter 协议;按照功能完整性的必要原则分:必选集、可选集。以 BBASMPlatformAdapterProtocol 为例,实现过程:
- Adapter 协议头文件引用,继承 BBASMAdapterBaseImplement ,声明要实现的接口。实现类的.h:
1 | #import <BBASMPlatformAdapterProtocol.h> |
- Adapter 协议与实现类绑定,同时还要实现 Adapter 的接口。实现类的.m:
1 | @implementation BBASMPlatformImplement |
5.1 必选集
强依赖宿主的实现才能运行运行小程序。
| 功能 | 协议(Adapter) | 说明 |
|---|---|---|
| 配置 | BBASMPlatformAdapterProtocol | 宿主信息、extension 配置、自定义 UA、小程序&小游戏生命周期 |
| 导航栏 | BBASMNavigatorAdapterProtocol | 设置小程序根导航控制器、自定义导航栏 |
| 帐号 | BBASMAccountAdapterProtocol | 登录方式:自有账号、开源联盟账号(默认:开源联盟账号,只能二选一) |
| 授权 | BBASMAuthorizeAdapterProtocol | 授权(选择自有账号方式,需要实现该 Adapter ,百度内部产品线忽略) |
| 视频 | BBASMVideoAdapterProtocol | 视频播放器(见开源 demo 实现) |
| 分享 | BBASMShareAdapterProtocol | 分享:具体分享功能依赖宿主的分享渠道 |
| 支付 | BBASMPaymentAdapterProtocol | 支付:直连、聚合(见开源 demo 实现) |
| 扫码 | BBASMScanCodeAdapterProtocol | 扫码(见开源 demo 实现) |
5.2 可选集
宿主可根据自身需求实现以下这些功能接口;如果没有这些实现,一些小程序用到了这些功能,可能就无法正常在宿主 APP 上运行。
| 功能 | 协议(Adapter) | 说明 |
|---|---|---|
| 定位 | BBASMLocationAdapterProtocol | 定位功能 (宿主如果没有定位实现能力,SDK 内部已经提供默认实现) |
| 地图 | BBASMMapAdapterProtocol | 地图功能 (宿主如果没有地图实现能力,SDK 内部已经提供默认实现) |
| 基础 | BBASMUtilAdapterProtocol | 小程序包解压:由于宿主集成的解压库与开源提供 SSZipArchive 库出现冲突,如果宿主不依赖 SSZipArchive(百度内部为 ZipArchive)库,需要实现该接口;默认宿主可以不实现 |
| 收货地址 | BBASMShippingAddressAdapterProtocol | 收货地址:自有账号需要实现(百度内部产品,需要升级 passportKit 8.78.1 以上版本) ,联盟账号不需要实现这个接口 |
| 发票 | BBASMInvoiceAdapterProtocol | 发票:自有账号需要实现(百度内部产品,需要升级 passportKit 8.8.4 以上版本) |
| 直播 | BBASMLiveAdapterProtocol | 直播功能:由于各方监管限制,当前小程序平台还未上线直播小程序 |
6. Extension 能力扩展
宿主会有私有端能力扩展,需要 NA 端、前端配合开发,详见扩展实现。(百度系的内部产品线,需要将开源工程 demo 下的私有能力扩展(SwanExtPlugin)拷贝到宿主工程中)
7. SDK 升级
宿主在更新小程序 SDK 时,避免不了 Adapter 协议、局部实现的变动,按照以下几步进行操作:
7.1 按更新列表升级
每一期 SDK 升级都会有对应的 changeList 说明,具体见更新列表。
7.2 更新资源文件
扩展包:BBAMNPPyramid.bundle(百度内部产品线需要做 merge 自己宿主上的扩展描述);
描述表:需要更新端能力描述表,生成的 BBAPluginDescription.zip 。
8. CTS 测试
宿主接入(升级)小程序 SDK 完成后,宿主APP实现是否完整、可运行,可通过CTS测试进行兼容验证;CTS小程序提供为宿主提供了全集功能 case ,宿主方根据自身需求进行验证(不强求全部功能通过测试)。按照功能分为4个CTS小程序:
- API 的 appKey:PccCNGKCYawUcfCxivhfmTEuCICGK0IX_trial
- 组件的 appKey:mlxCOIFLs2SWhxifEFGLmLeRs6sdoSTo_trial
- 框架的 appKey:ADamk7kmWo8xTgZtFGeptWMYyujxKo25_trial
- 插件、动态库的 appKey:5hToyw3VvN4dGqWu32QB3Xju8URBrsxL_trial
注意事项
- 建议使用联盟账号,SDK 内已经提供默认实现;如若使用自己的账号,则需要自己实现一套 Server 体系和授权过程,比较复杂。
- 需要实现的接口,都提供了参考实现,参考开源 demo 工程:swan-ios(或者 product-mnpproject)。
- 2.19.0 之后版本的联盟登陆需要重新申请 union-cfg.json 配置文件,否则可能会出现无法登陆的情况。
- 鉴于小程序和小游戏的受 iOS 系统限制, SDK 内部已做好兼容限制,未符合运行环境的回提示“iOS 系统版本过低”;建议宿主方从入口按照 iOS 系统版本屏蔽小程序和小游戏。
