本页内容 链接 XCFramework初始化与会话权限与设备能力支付回跳镜像扩展与退出隐私资源
APP SDK / Android · iOS

iOS 接入

链接 XCFramework,配置系统权限、应用身份与支付 URL,接入原生账号和设备客户端。

链接 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 保持各自的主业务门禁。

镜像状态新鲜度由以下步骤确认:

  1. 扩展收到匹配 TLS 会话、请求编号和 streamId 的 PONG。
  2. 将单调时间以 controlConfirmedAtUptime 写入当前 token 的 state.plist;普通 watchdog 写入不续期。
  3. 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 检查最终产物。清单存在不表示应用商店审核通过。