链接 XCFramework
将接入包的 ios/InfiniteRideMobile.xcframework 加入工程。最低 iOS 15.1,包含真机 arm64 和模拟器 arm64/x86_64。它是静态框架,选择 Do Not Embed,添加 -ObjC。
链接 Foundation、UIKit、CoreBluetooth、Security、Network、NetworkExtension、MediaPlayer、CoreGraphics、ImageIO、ReplayKit 和 libz。公开头文件通过 InfiniteRideMobile/InfiniteRideMobile.h 导入。
接入包的原生示例可独立编译,用于核对链接配置。安装到手机前需要宿主自己的签名、描述文件与系统能力配置。
初始化与会话
在主线程配置一次。registeredClientId 使用平台登记值;paymentScheme 与宿主注册的回跳 scheme 一致。以下变量与回调由宿主提供:
#import <InfiniteRideMobile/InfiniteRideMobile.h>
[IRMobileSDK configureWithConsent:^BOOL {
return userHasAcceptedPrivacy();
} clientId:registeredClientId paymentScheme:paymentScheme];
[[IRMobileSDK account] write:platformSessionJson
resolve:success
reject:failure];
隐私查询应动态反映当前同意状态。platformSessionJson 必须来自平台登录,不要自行拼装或替换 token。只有会话写入成功后,才创建云客户端:
IRCloudVehicles *vehicles = [[IRCloudVehicles alloc]
initWithBaseURL:apiBase language:@"zh-CN"];
IRCloudOperation *operation = [vehicles execute:@"list"
parameters:@{} resolve:success reject:failure];
apiBase 是分配的 HTTPS 基址,包含 /api/v1。正常启动先执行 recover 再执行 list。车辆列表成功结果为 JSON 字符串,解码后再交给 UI。Swift 宿主可使用同一 Objective-C 模块与公开头文件导入的接口。
权限与设备能力
Info.plist 按使用能力填写蓝牙和局域网说明。自动加入车辆热点需要 Hotspot Configuration capability;后台蓝牙需要 bluetooth-central background mode。签名配置必须与实际使用能力匹配。
[IRMobileSDK devices] 返回共享设备客户端,提供 scan、pair、submitPin、vehicleStatus、vehicleCommand 等接口。配对、绑定和 Wi-Fi 的顺序见车辆绑定与恢复。模拟器用于编译和界面联调,不用于判定蓝牙、热点或真实控车成功。
用 setNavigationActiveProvider: 提供宿主真实的导航状态。导航活动中,SDK 会拒绝切换或移除车辆。
支付回跳
真实支付宝支付通过接入包的 InfiniteRideMobile/Alipay CocoaPods 子模块引入;默认 Core 不包含支付供应商。也可按接入包说明手动链接配套供应商框架。用 [IRMobileSDK paymentAvailable] 检查可用性。
将初始化使用的 paymentScheme 注册到 Info.plist 的 CFBundleURLTypes。AppDelegate、SceneDelegate 和冷启动入口都应先转发 URL:
if ([IRMobileSDK handlePaymentURL:url]) {
return;
}
// Continue with the host's remaining URL handlers.
这是宿主 URL 分发逻辑片段;在要求返回 BOOL 的系统方法中返回相应处理结果。只在用户明确点击付款后执行支付,回到前台按支付恢复流程查单。
镜像扩展与退出
镜像需要宿主自己的 Broadcast Upload Extension、App Group 与 Keychain access group。通过 Info.plist 的 InfiniteRideMirrorAppGroup 和 MotoMirrorKeychainGroup 配置共享组,不要照抄其他应用的签名组。
App SDK 1.0.0 分开报告两个连接状态:
| 字段 | 含义与用途 |
|---|---|
terminalStatus.wifiConnected |
主业务认证,控车仍需对应权限与新鲜车况 |
mirrorWifiConnected |
当前车辆镜像链路的新鲜认证心跳,用于镜像连接展示 |
显示 Wi-Fi 图标前匹配 terminalId,再取两字段的或。控车、绑定与 OTA 保持各自的主业务门禁。
镜像状态新鲜度由以下步骤确认:
- 扩展收到匹配 TLS 会话、请求编号和 streamId 的 PONG。
- 将单调时间以
controlConfirmedAtUptime写入当前 token 的 state.plist;普通 watchdog 写入不续期。 - SDK 核对镜像 grant、车辆、会话、流、token、授权期限和不足 10 秒的回执年龄;缺失或过期按未连接处理。
返回前台恢复控车还需要支持恢复的 App SDK 构建与硬件 r26 / ABI 8 的 PROFILE39。主业务恢复后重新订阅并读取车况,详见更新日志。
退出时取消当前操作,等待回调结束,调用 [[IRMobileSDK account] clear:success reject:failure]。token 更新或账号切换后重新创建云客户端,防止旧界面的结果进入新账号页面。
撤回隐私同意时,立即停止接受新任务、取消所有持有的云操作,并调用 account.clear 停止设备会话和清理账号。继续接收旧操作的最终回调,但不再更新已退出的页面;撤回同意不会撤销已发生的付款。
隐私资源
1.0.0 的每个 XCFramework slice 附带 PrivacyInfo.xcprivacy,CocoaPods 使用 InfiniteRideMobilePrivacy.bundle。手工集成静态库时将资源加入最终 App,已有 App 清单则合并,不覆盖。按包内 PRIVACY.md 核对已启用的云功能、数据类别、所需 API 用途及其他第三方 SDK;用 Xcode Archive 的 Privacy Report 检查最终产物。清单存在不表示应用商店审核通过。
