点击仪表板快捷按钮时打开 CarPlay 主应用程序

问题描述 投票:0回答:1

我正在为 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 仪表板中启动应用程序

ios swift navigation mapkit carplay
1个回答
0
投票

打开主 CPTemplateApplicationScene:

  1. 创建您的
    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()

  1. 将您尝试打开的 URL(本例中为
    "someRandomUrl://"
    )注册为 URL 类型中的 URL 方案。
  • 选择您的应用程序的目标并转到“信息”选项卡。
  • 展开“URL 类型”部分。如果不存在,您可能需要通过单击“+”按钮添加它。
  • 添加新的 URL 类型并指定唯一的方案。这通常是您的应用程序的名称或与您的应用程序相关的名称。

  1. 在Info.plist中注册URLScheme 在
    Queried URL Schemes
    数组中添加您的 URL 方案,在此示例中为
    someRandomUrl

此后,按下按钮时主

CPTemplateApplicationScene
将打开。

  1. 如果您想自定义对 URL 的反应,您可以在调用 URL 时添加后缀。例如:
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”,您可以在其中提取后缀并打开它以进行相应操作。

© www.soinside.com 2019 - 2024. All rights reserved.