我正在尝试将UX SDK5(测试版0.4.1)集成到我的SwiftUI应用程序中。
作为开始,我想显示DUXBetaConnectionWidget、DUXBetaFPVWidget和DUXBetaCompassWidget。
我已经构建了两个包装类。
第一个是UIViewControllerRepresantable
struct BetaDjiView<DjiWidget: DUXBetaBaseWidget>: UIViewControllerRepresentable {
typealias UIViewControllerType = BetaViewController<DjiWidget>
func makeUIViewController(context: Context) -> BetaViewController<DjiWidget> {
return BetaViewController<DjiWidget>()
}
func updateUIViewController(_ uiViewController: BetaViewController<DjiWidget>, context: Context) { }
}第二个类是另一个UIViewController包装器,它实际包含DJI。
class BetaViewController<T: DUXBetaBaseWidget> : UIViewController {
var djiWidget = T()
override func viewDidLoad() {
super.viewDidLoad()
addChild(djiWidget)
djiWidget.install(in: self)
makeConstraints()
}
func makeConstraints() {
NSLayoutConstraint.activate([
djiWidget.view.topAnchor.constraint(equalTo: view.topAnchor),
djiWidget.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
djiWidget.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
djiWidget.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
}
}在我的ContentView中,我像这样实例化小部件:
var body: some View {
GeometryReader { geometry in
ZStack {
BetaDjiView<DUXBetaFPVWidget>().frame(width: geometry.size.width, height: geometry.size.height)
VStack {
HStack {
BetaDjiView<DUXBetaConnectionWidget>().frame(width: 25, height: 25)
Spacer()
}
Spacer()
HStack {
BetaDjiView<DUXBetaCompassWidget>().frame(width: 75, height: 75)
Spacer()
}
}.padding()
}
}
}SDKManager中与产品的连接处于活动状态。
这就是让我抓狂的奇怪部分:
我把电话连到遥控器上,打开遥控器,然后打开无人机。我让遥控器和无人机连上了。
当我通过Xcode启动应用程序时,一切都很好。摄像机视频源正在显示,连接图标变为绿色。

然后,我从Xcode中停止应用程序,并直接从手机启动应用程序。应用程序出现了,但连接图标没有变化,并且保持红色,也没有显示摄像头视频。

当我将日志流式传输到我的Mac控制台时,我可以看到,与产品的连接就在那里。
这会是什么呢?任何帮助我都会非常感谢。
编辑1
这是我的Podfile
platform :ios, '11.0'
target 'DjiMobileSdkTest2' do
use_frameworks!
pod 'iOS-Color-Picker'
pod 'DJI-UXSDK-iOS-Beta', '0.4.1'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |configuration|
target.build_settings(configuration.name)['ARCHS'] = '$(ARCHS_STANDARD)'
end
end
end编辑2
另一个额外的观察:我从手机上完全删除了这个应用程序,然后在Xcode中再次启动它,我确认了询问蓝牙和位置使用许可的对话框,这是我想要的。然后,应用程序将再次没有反应,停留在其初始状态。只有当我通过Xcode重新启动时,连接图标才会变绿,视频脚部也会显示出来。
编辑3
我观察到:在重启手机,然后通过点击应用程序图标直接启动应用程序后,一切都正常工作:应用程序启动,连接到无人机,连接图标变成绿色,摄像头视频也在更新。我能够重复这个过程好几次。
发布于 2021-05-07 13:32:07
它终于成功了!
正如在this post中所解释的那样,我不得不用它的didFinishLaunchingWithOptions-lifecycle将AppDelegate重新引入我的应用程序中。
这是它以前的样子:
@main
struct MyApp: App {
var someClass = SomeClass()
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { (newScenePhase) in
switch newScenePhase {
case .active:
print("active")
someClass.doSomethingThatWouldNotWorkBefore()
case .background:
print("background")
case .inactive:
print("inactive")
@unknown default:
print("default")
}
}
}
}这就是它之后的样子:
import SwiftUI
class AppDelegate: UIResponder, UIApplicationDelegate {
var someClass = SomeClass()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
someClass.doSomethingThatWouldNotWorkBefore()
return true
}
}
@main
struct MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { (newScenePhase) in
switch newScenePhase {
case .active:
print("active")
case .background:
print("background")
case .inactive:
print("inactive")
@unknown default:
print("default")
}
}
}
}就这么简单;-)
我仍然在试图弄清楚它们的确切区别是什么,以及这与应用程序启动和生命周期、内存管理和“那些东西”有什么关系。
https://stackoverflow.com/questions/67320963
复制相似问题