Apple CarPlayの画面に通知を表示する
Apple CarPlayの画面に通知を表示する
CarPlayの開発情報自体が少ないのですが、通知をCarPlay側の画面で受け取る方法について調べてもまとまった情報がなかったので、ここにまとめておきます。
この記事で作ったコードは、こちらにあります。
TL;DR
結論としては、この3つがポイントでした。
-
requestAuthorizationの
options
に.carPlay
を追加する。 -
.allowInCarPlayの追加した
UNNotificationCategory
を作り、setNotificationCategoriesで設定する。 - 最後にiPhone SimulatorのExternal DisplaysにあるCarPlay表示では正しく動かないので、Additional Tools for XCodeに含まれる
CarPlay Simulator
と実際のiPhoneを繋いで動かす必要がある。
前提
上記の通りiPhone Simulatorでは動作確認ができないため、CarPlayの開発申請を済ませて実機で動かすための準備をしておく必要があります。
また、CarPlayのEntitlement
や画面の表示方法についてはこの記事では触れません。
本題
それではCarPlay画面に通知を表示するための具体的な設定手順を順番に追っていきたいと思います。
まずは通知の設定を行う。
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の開発者は少ないのでしょうかね?検索しようにも「CarPlay」と入れるとだいたい使う側の情報が先に来てしまうので、開発のための情報を調べる場合には具体的なメソッド名などを使ってました。本当はその具体的なメソッド名をまずは知りたいのに、それを検索する難易度が高いのはどうにかならないですかね?
それと、iOS Simulatorに付いているCarPlayの画面は表示確認用としては及第点なのですが、機能制限が色々とあって動かないのが自分のコード側の原因なのかSimulatorが悪いのかの切り分けが面倒でした。どこかに機能制限の項目一覧とか無いですかね?
代わりのCarPlay Simulatorはその点は問題無いのですが、上にも書いたとおり何故かiOS15だと接続が認識されず使えなかったりと別の問題があったりしました。
Discussion