🚗

Apple CarPlayの画面に通知を表示する

2022/07/27に公開

Apple CarPlayの画面に通知を表示する

CarPlayの開発情報自体が少ないのですが、通知をCarPlay側の画面で受け取る方法について調べてもまとまった情報がなかったので、ここにまとめておきます。

この記事で作ったコードは、こちらにあります。

TL;DR

結論としては、この3つがポイントでした。

前提

上記の通りiPhone Simulatorでは動作確認ができないため、CarPlayの開発申請を済ませて実機で動かすための準備をしておく必要があります。
また、CarPlayのEntitlementや画面の表示方法についてはこの記事では触れません。

本題

それではCarPlay画面に通知を表示するための具体的な設定手順を順番に追っていきたいと思います。

まずは通知の設定を行う。

AppDelegate.swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        // CarPlayのためのカテゴリを登録
        let category = UNNotificationCategory(
            identifier: Constants.carPlayNotificationCategoryIdentifier,
            actions: [],
            intentIdentifiers: [],
            options: [.allowInCarPlay])  // ポイント1
        UNUserNotificationCenter.current().setNotificationCategories([category])

        // 通知許可の取得
        UNUserNotificationCenter.current().requestAuthorization(
	    // ポイント2
            options: [.alert, .sound, .badge, .carPlay]) { (granted, _) in
            if granted {
                UNUserNotificationCenter.current().delegate = self
            }
        }
        return true
    }
  • ポイント1: まず通知のカテゴリとして適当なidentifierを付けて、optionsに.allowInCarPlayを追加します。そのカテゴリをsetNotificationCategoriesで設定しておきます。
  • ポイント2: requestAuthorizationで通知の許可をもらう際に、optionsに.carPlayを追加します。このオプションを設定すると、設定>通知>該当アプリの設定画面に「CarPlayに表示」という項目が追加されます。

設定画面のスクリーンショット

あとは以下のように通知を送れば、CarPlay側の画面でも通知が受け取れます。

let content = UNMutableNotificationContent()
content.title = "title"
content.body = "body"
content.sound = UNNotificationSound.default
// ポイント
content.categoryIdentifier = "carPlayNotification"

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
let request = UNNotificationRequest(identifier: "notificationForCarPlay", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { _ in }

ここでのポイントは、categoryIdentifierを前記のカテゴリの設定に合わせておくだけです。

あとはiPhoneにインストールしてCarPlay Simulatorに繋げて試せば、CarPlay側の画面で通知を受け取れます。タップすればCarPlayのアプリが立ち上がるはずです。

CarPlay Simulatorのスクリーンショット

余談

しかし、こんな当たり前のことを調べるのに結構時間がかかってしまいました。
まだCarPlayの開発者は少ないのでしょうかね?検索しようにも「CarPlay」と入れるとだいたい使う側の情報が先に来てしまうので、開発のための情報を調べる場合には具体的なメソッド名などを使ってました。本当はその具体的なメソッド名をまずは知りたいのに、それを検索する難易度が高いのはどうにかならないですかね?

それと、iOS Simulatorに付いているCarPlayの画面は表示確認用としては及第点なのですが、機能制限が色々とあって動かないのが自分のコード側の原因なのかSimulatorが悪いのかの切り分けが面倒でした。どこかに機能制限の項目一覧とか無いですかね?
代わりのCarPlay Simulatorはその点は問題無いのですが、上にも書いたとおり何故かiOS15だと接続が認識されず使えなかったりと別の問題があったりしました。

Discussion