我有导航应用程序,现在正在开发 CarPlay 仪表板。单击 CPDashboard 中的按钮后,我无法启动 InterfaceController。
我的按钮代码:
let searchButton = CPDashboardButton(titleVariants: ["Find"], subtitleVariants: ["place"], image: searchImage) { [weak self] (_) in
self?.openSearchView()
}
点击按钮后,调用 func openSearchView(),但视图仍保留在仪表板中。
文档中没有任何信息,我们如何在视图之间切换(界面控制器<->仪表板控制器)
不确定这是正确的方法,但没有提及这一点,甚至官方示例应用程序也没有这样做。但你可以通过在dashboardScene上调用
open(_, options:, completionHandler)
来实现。
像这样
dashboardController.shortcutButtons = [CPDashboardButton(titleVariants: ["Find"], subtitleVariants: ["place"], image: searchImage, handler: { _ in
guard let url = URL(string: "your.app.scheme://whatever/wherever") else { return }
templateApplicationDashboardScene.open(url, options: nil, completionHandler: nil)
})]
这将打开主应用程序并在主 carplay 场景上调用
open(_, urlContexts:)
,您可以在其中处理该 url 并做出相应反应,例如打开搜索或其他任何内容。
CPDashboardButton
并添加处理程序。类似这样的:
let searchButton = CPDashboardButton(titleVariants: ["Search"], subtitleVariants: [], image: UIImage(named: "search_icon")!) { [weak self] _ in
self?.searchTemplateManager.showSearchInterface() // You can do anything here. I have a manager that shows the search interface on the main CPTemplateApplicationScene.
guard let dashboardScene = UIApplication.shared.connectedScenes.first(where: { $0 is CPTemplateApplicationDashboardScene }) else { return }
guard let url = URL(string: "someRandomUrl://") else { return }
dashboardScene.open(url, options: .none, completionHandler: nil)
}
注意,您必须在您的
CPTemplateApplicationDashboardScene
中找到 UIApplication.shared.connectedScenes
并对其调用 open()
。
"someRandomUrl://"
)注册为 URL 类型中的 URL 方案。Queried URL Schemes
数组中添加您的 URL 方案,在此示例中为 someRandomUrl
。此后,按下按钮时主
CPTemplateApplicationScene
将打开。
guard let url = URL(string: "someRandomUrl://some-task-to-do") else { return }
然后在您的
SceneDelegate
中捕获 URL 打开操作。当您在那里打开 URL 时,您必须在作为 CPTemplateApplicationDashboardSceneDelegate
委托的同一类上执行此操作。
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else { return }
print("the url is: \(url)")
}
这会打印:“网址是:someRandomUrl://some-task-to-do”,您可以在其中提取后缀并打开它以进行相应操作。