单击 CPDashboardController 中的 CPDashboardButton 后如何在 CarPlay 仪表板中启动应用程序

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

我有导航应用程序,现在正在开发 CarPlay 仪表板。单击 CPDashboard 中的按钮后,我无法启动 InterfaceController。

我的按钮代码:

let searchButton = CPDashboardButton(titleVariants: ["Find"], subtitleVariants: ["place"], image: searchImage) { [weak self] (_) in
                self?.openSearchView()
            }

点击按钮后,调用 func openSearchView(),但视图仍保留在仪表板中。

文档中没有任何信息,我们如何在视图之间切换(界面控制器<->仪表板控制器)

ios swift xcode scenekit carplay
2个回答
2
投票

不确定这是正确的方法,但没有提及这一点,甚至官方示例应用程序也没有这样做。但你可以通过在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 并做出相应反应,例如打开搜索或其他任何内容。


0
投票

更详细的答案:

  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.