我正在为 CarPlay 创建一个路线导航应用程序。我在仪表板视图上有两个快捷按钮。当点击其中一个按钮时,我希望屏幕转换到“主”应用程序。然而,发生的情况是:它在幕后运行代码(搜索食物或燃料)并显示搜索结果,但只有手动点击地图或应用程序图标才能看到它们。
我的代码如下所示:
func initializeDashboardButtons() {
if let image1 = UIImage(systemName: "fuelpump"), let image2 = UIImage(systemName: "fork.knife") {
let button1 = CPDashboardButton(titleVariants: [defaultFuel], subtitleVariants: [], image: image1, handler: { [weak self] _ in self?.navigateToGasStations() })
let button2 = CPDashboardButton(titleVariants: [defaultFood], subtitleVariants: [], image: image2, handler: { [weak self] _ in self?.navigateToFood() })
self.dashboardController?.shortcutButtons = [button1, button2]
}
}
private func navigateToGasStations() {
self.carplayManager.searchForLocation(locationText: defaultFuel, completionHandler: { [weak self] destinations in self?.handleSearchResult(results: destinations) })
}
private func navigateToFood() {
self.carplayManager.searchForLocation(locationText: defaultFood, completionHandler: { [weak self] destinations in self?.handleSearchResult(results: destinations) })
}
private func handleSearchResult(results: [Destination]) {
self.defaultAction?(results.convertToCPListItem(), "")
}
我的目标是在点击两个按钮之一时打开主应用程序。
提前致谢。
我尝试查看苹果的示例应用程序,其中也有快捷按钮。然而,他们的示例应用程序也没有转换到主应用程序。我可以看到谷歌可以通过他们的地图应用程序做到这一点,所以一定有办法。我只是在文档中没有找到它。
我也看过这个问题/答案,但它对我不起作用。 单击 CPDashboardController 中的 CPDashboardButton 后如何在 CarPlay 仪表板中启动应用程序
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”,您可以在其中提取后缀并打开它以进行相应操作。