iOS Mobile SDK开发流程指引
1. 准备工作
使用Mobile SDK开发一个应用程序,我们需要有开发能力、开发设备、开发环境的前期准备。
常规
- 掌握如何在iOS平台开发应用程序。
- 在Autel开发者平台:https://developer.autelrobotics.cn 申请应用关联钥匙。
- 准备最少一个iOS或Android平台的设备。
iOS开发环境
- Xcode 13.0或以上。
- 部署目标设备系统版本是iOS 11.0或以上。
- 拥有iOS开发者账户。
- 开发设备调试支持。
注册成为开发者
想拥有一个AUTEL开发者账户,点击 这里。
在开发者用户注册的过程中,需要提供邮箱信息作为注册验证手段。
申请APP key
APP key 为开发者在Autel开发者平台申请的应用关联钥匙。
⼀旦你注册成为开发者账号,你想创建⾃⼰的应用程序,你需要先去申请APP key,每个应用程序都需要一个唯一的应用程序密钥(App Key)来初始化SDK。
下载Mobile SDK
在开发者平台上选择"Downloads",会列出Android和iOS平台的Mobile SDK软件开发包,点击对应的图标即可下载。
也可以在GitHub上下载最新版本的Mobile SDK,下载地址: https://github.com/AutelSDK
2. 将SDK集成到项目工程中
AUTELSdkDemo 是iOS 示例代码,帮助你快速集成SDK到项目工程中。
AUTELSdkDemo使用XCode 13.3版本编译,支持Swift 5.6。
本节使用AUTELSdkDemo为例子进行说明怎么集成SDK。
第一步,下载或者克隆 Github上的 iOS 示例代码工程: https://github.com/AutelSDK/iOS_SdkSample
Mobile SDK软件开发包里的AUTELSDK包括
- 两个xcframework:AUTELSDK.xcframework和AUTELWidget.xcframework
- 两个strings文件:shader_fsh_myExpose.strings和shader_vsh_myExpose.strings
第二步,参考AUTELSdkDemo工程,把AUTELSDK文件夹直接拖入到你的工程;
在AUTELSdkDemo工程的build setting界面:target-〉Build Phases -〉左上角+号 -〉New Copy Files Phase 然后在Copy Files下 Destination选择Frameworks -〉添加动态库
第三步,设置shader_fsh_myExpose.strings和shader_vsh_myExpose.strings两个strings文件的工程配置,在Identity and Type下的Type要选择“Plain Text”类型,如下图,否则编译不通过。
3. 配置构建设置
1、CFBundleDisplayName
表示APP名称,必须配置,而且与你申请APP key时填写的APP名称保持一致,否则SDK鉴权不通过。
2、UISupportedExternalAccessoryProtocols
外部附件框架,对于通过USB连接到移动设备的AUTEL产品,请将 "Supported external accessory protocols" key添加到info.plist文件中,并添加字符串“com.autelrobotics.customer”,“com.autelrobotics.video” ,“com.autelrobotics.control”和“com.auteltech.control”。
只有配置了这项,App才可以与AUTEL的遥控器建立USB连接。
3、NSAppTransportSecurity
申请http权限, 必须添加"App Transport Security Settings" ,并且"Allow Arbitrary Loads" 必须设置为"YES"。
4、NSLocationAlwaysAndWhenInUseUsageDescription等
申请定位权限等待,具体请参考AUTELSdkDemo的info.plist文件:
<key>CFBundleDisplayName</key>
<string>AUTELSdkDemo</string>
<key>UISupportedExternalAccessoryProtocols</key>
<array>
<string>com.autelrobotics.customer</string>
<string>com.autelrobotics.video</string>
<string>com.autelrobotics.control</string>
<string>com.auteltech.control</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>App needs your consent to access location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>App needs your consent to access location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App needs your consent to access location</string>
4. 运行示例代码
参考AUTELSdkDemo演示代码,AUTELSdkDemo的DataLayer模块代码用于启动SDK和建立飞机各个模块连接,监听SDK各个模块状态数据上报,这块代码可直接用于你的工程。
第一步,在APP应用程序入口方法didFinishLaunchingWithOptions
调用SDKConnection.shared.connect()
方法,如下
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
SDKConnection.shared.connect()
return true
}
第二步,在SDKConnection.shared.connect()
方法里进行APP注册,注册需要传入appKey和代理,SDK会对appKey进行鉴权,鉴权结果通过代理进行回调,鉴权通过会启动SDK。具体请参考demo代码。
func connect() -> Void {
//appKey
AUTELAppManager.registerApp("your appKey", with: self)
}
NOTE: appKey 为开发者在Autel开发者平台申请的应用关联钥匙
第三步,注册成功后,数据线分别插入手机和遥控器两端USB口,打开APP,建立连接触发didConnectionStatusChanged
回调,在回调里把Connection连接层与SDK底层的各个模块建立代理关系
// MARK: - AUTELDeviceDelegate
func device(_ device: AUTELDevice!, didConnectionStatusChanged status: AUTELDeviceConnectionStatus) {
guard let drone = device as? AUTELDrone else {
self.connectedDrone = nil
return
}
CameraConnection.shared.connect(drone.camera)
GimbalConnection.shared.connect(drone.gimbal)
BatteryConnection.shared.connect(drone.battery)
MainControllerConnection.shared.connect(drone.mainController)
RemoteControllerConnection.shared.connect(drone.remoteController)
AirLinkConnection.shared.connect(drone.airLink)
AUTELNavigationDelegateConnection.shared.connect(drone.mainController.navigationManager)
FlightAssistantConnection.shared.connect(drone.mainController.flightAssistant)
//执行回调
queue.async {
for (_, aProtocol) in self.protocols {
aProtocol.device(device, didConnectionStatusChanged: status)
}
}
}
Connection连接层实现SDK底层各个模块的代理方法,对各个模块上报状态进行了监听,同时把监听到的上报数分发出去:
- FlightAssistantConnection:视觉连接层
- MainControllerConnection:飞行控制器连接层
- GimbalConnection:云台连接层
- BatteryConnection:电池连接层
- AUTELNavigationDelegateConnection:智能任务管理模块连接层
- CameraConnection:相机连接层
- AirLinkConnection:图传连接层
- RemoteControllerConnection:遥控器连接层
应用层想要监听某个模块数据,可以注册监听对应Connection连接层,实现相应的代理方法即可,具体用法见AUTELSdkDemo里的AircraftStatus Demo:
fileprivate func registerProtocol() {
DroneConnection.shared.addProtocol(self)
MainControllerConnection.shared.addProtocol(self)
RemoteControllerConnection.shared.addProtocol(self)
BatteryConnection.shared.addProtocol(self)
CameraConnection.shared.addProtocol(self)
GimbalConnection.shared.addProtocol(self)
FlightAssistantConnection.shared.addProtocol(self)
}
将示例代码编译安装到OS移动设备中,USB 连接步骤
打开无人机和遥控器电源,等待它们连接上。
使用 Lightning 线将iOS 移动设备连接到遥控器上。
在移动设备上运行示例应用。
5. SDK 各模块功能接口调用
Mobile SDK的体系结构被设计为高度可扩展的,其中使用了抽象产品类和组件类,对各个模块进行业务封装,自动适配AUTEL的不同无人机型号,不同相机型号。
通过各个Connection连接层桥接到SDK对应的模块管理类,进而调用各个模块的接口:
AUTELDrone
通过该类可以对EVO II系列无人机进行操作
应用层获取句柄:DroneConnection.shared.drone
AUTELDroneMainController
通过 AUTELDroneMainController 类,你可以获得主控的当前状态,可以读写主控参数,也向主控发送控制命令
应用层获取句柄:MainControllerConnection.shared.mainController
AUTELBattery
该类管理电池相关信息,并可获取电池的实时状态.
应用层获取句柄:BatteryConnection.shared.battery
AUTELRemoteController
通过该类可以读写遥控器参数,校准遥控器,还可以实时获得遥控器状态,各摇杆、按钮和波轮的状态。
应用层获取句柄:RemoteControllerConnection.shared.remoteController
AUTELDroneGimbal
通过该类,你可以获得云台的实时状态,也可以向云台发送命令,控制云台
应用层获取句柄:GimbalConnection.shared.gimbal
AUTELBaseCamera
通过 AUTELBaseCamera 类,可以获取到相机的当前状态,可以对相机参数进行读写操作,也可以对相机进行相关操作。
应用层获取句柄:CameraConnection.shared.camera
AUTELAirLink
通过 AUTELAirLink 类,可以获取到通信链路的连接状态
应用层获取句柄:AirLinkConnection.shared.airlink
AUTELFlightAssistant
通过 AUTELFlightAssistant 类,可以获得视觉的实时状态,也可以向视觉发送命令,控制视觉
应用层获取句柄:MainControllerConnection.shared.mainController?.flightLimitation
AUTELNavigation
通过 navigationManager 你可以执行智能飞行任务
应用层获取句柄:MainControllerConnection.shared.mainCtl?.navigationManager
6. AUTEL UX SDK
为帮助开发者快速创建出应用程序,Autel UX SDK提供应用程序通用核心功能模块,使用默认的Autel UX SDK组件,开发者可以在不添加额外代码行的情况下,快速创建出类似以下应用程序效果:
AUTEL UX SDK 建立在 AUTEL Mobile SDK 之上,因此您需要在应用程序开发中一起使用它们。
如需更深入了解 AUTEL UX SDK,请参阅 iOS UX SDK 使用指南。