AppleWatchの発売日である4/24とその翌日の4/25にそれぞれ大阪と東京でApple Watchの勉強会を開催いたしました。
AppleWatch発売!Apple Watch WatchKit勉強会 大阪
AppleWatch発売!Apple Watch WatchKit勉強会 東京
私はNotificationについて説明させて頂きましたのでその時のスライドをベースに、その後試した内容を加筆してblogとして公開いたします。
実際にApple Watchを一週間使ってみて、アプリ機能やグランス機能なども一通り試してみました。私がApple Watchで一番頻度の高い機能であると考えるのはNotificationです。ちらりと見るだけで情報を把握、気になる内容だったらiPhoneを取り出してチェック、そんな風に使えるのでとても便利です。アプリケーションの品質を高めるためには、使いやすく、一見するだけで情報を把握できるように配慮されたNotificationを実装するべきでしょう。
Notificationの出し方
まず最初にApple WatchでのNotificationの出し方を説明します。基本的に、アプリケーショ(iPhone本体の方)にNotification機能があれば、そのNotificationを自動的にApple Watchに表示してくれます。アプリケーションにNotification機能がない場合はアプリケーション本体にNotification機能を実装すれば大丈夫です。
Apple Watch側の設定としては、NotificationをONにする必要があります。Apple Watchに通知が表示されるには次の条件を満たす必要があります。
iPhoneの設定>通知で通知を許可をONにします。
Apple Watchアプリ>マイウォッチタブ>通知のページを開き、Apple Watchで通知を受け取りたいアプリをONにします。
iPhoneに追加された Apple Watchアプリ |
さて、Notificationの出し方としては、Apple Watch向けアプリケーション作成SDKであるWatchKitすら必要ないということがわかりました。単純にiPhone側のアプリが対応していれば、Apple WatchのNotificationとして表示されます。
それではAppleWatchで通知を出すため、iPhoneアプリにNotificationを実装する方法について復習してみましょう。
Notificationには2種類ある
Notificationには大きく2つの種類が用意されています。1つ目はLocal Notification(ローカル通知)です。これはアプリがバックグラウンド時にユーザーに情報を伝える仕組み、と考えてください。アプリ自身が発信し(通知を時間予約する)、iOSが配信する(時間になったらiOSが予約されていた通知を表示する)という仕組みで動作します。
2つ目はRemote Notification(リモート通知)、いわゆるプッシュ通知です。これはリモートサーバーで発信し、iOSが配信するという仕組みです。利用にはリモートサーバーを構築したり、Apple証明書を発行したりと準備が大変です。
コーディングする側からすれば、2つのNotificationはコーディング方法や発火(Fire)の方法が異なりますが、ユーザーにとってはどちらのNotificationも見た目としては一緒です。
Local Notificationの実装
では、Local Notificationの実装例を元にNotificationについて解説しましょう。先ほど説明した通り、アプリが起動していない時に通知する仕組みですので、バックグラウンド動作時にNotification発行するのが通常のパターンです。まず、バックグラウンドモードを有効にしましょう。
次に、バックグラウンド動作のタイミングを決めます。最小フェッチ間隔をiOSに通知しておきます。この例では1時間を指定していますので、1回呼ばれたら1時間以上呼ばれないようにスケジュールされます。実際にバックグラウンド処理を呼び出すタイミングはiOSが決定しますので、1時間毎に呼ばれることが保証されている訳ではありません。
// AppDelegate.swift func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 〜 let interval:NSTimeInterval = 60 * 60 // 1時間 UIApplication.sharedApplication().setMinimumBackgroundFetchInterval(interval) 〜 return true }では、バックグラウンド処理を書きましょう。Notificationを発行するプログラムを記述します。
func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 〜なんらかの処理〜 // 処理結果を通知するNotification生成 let myNotification: UILocalNotification = UILocalNotification() // タイトルを設定 myNotification.alertTitle = message // メッセージを設定 myNotification.alertBody = detailStr // Timezoneを設定をする. myNotification.timeZone = NSTimeZone.defaultTimeZone() // Notificationを表示する. UIApplication.sharedApplication().scheduleLocalNotification(myNotification) // バックグラウンドフェッチ結果を通知 completionHandler(UIBackgroundFetchResult.NewData) }
では実行してみましょう。iOSによりバックグラウンド処理が呼ばれると、通知が表示されます。実際にバックグラウンド処理が呼ばれるのを待っていたのではいつまでたってもテストが終わらないことでしょう。デバッグ実行では、強制的にバックグラウンド処理を呼ぶ方法が用意されています。Edit Schemeより、Runを選び、OptionsタブのBackground Fetch Launch due to a background fetch eventにチェックを入れて、実行します。
前述の通り、iPhoneのロックが解除されている時にはApple Watchに通知は届きません。実行したらすばやくiPhoneの電源ボタンを押して、ロック状態にします。そうすると、デバッガがバックグラウンド処理を実行し、iPhoneで通知が発生し、Apple Watchに通知が配信されます。
通知のカスタマイズ
何もしなくてもアプリケーションのNotificationがWatchに表示されますが、WatchKitを使えば通知をカスタマイズしてAppleWatchに表示することが可能です。既存のアプリにWatchKitExtensionを追加してNotificationをカスタマイズしてみましょう。
WatchKitを追加
File > New > Target...よりターゲット選択画面を開きます。
この時、Include Notification Sceneにチェックを入れてください。
FinishするとWatchKitExtensionと雛形が作成されています。まずWatch AppのInterface.storyboardを開いてください。Notificationの雛形としてStatic InterfaceとDynamic Interfaceが用意されています。Staticインタフェースは通知メッセージが表示されるだけのシンプルなインタフェースです。Dynamicインタフェースはプログラムで表示内容を制御できるインタフェースです。なにも実装しなければStaticインタフェースが表示されます。
シミュレータでは、Remote Notificationのテストが行えます。PushNotificationPayload.apnsファイルがRemote Notification用のペイロードになっています。Notificationとしてテストしたい内容をこのファイルに記述してから実行することでテストが行えます。
PushNotificationPayload.apnsファイルの内容(JSONファイル) { "aps": { "alert": { "body": "【東京都】PM2.5観測情報:非常に多い", "title": "PM2.5情報" }, "badge" : 1, "category": "very_high" }, "WatchKit Simulator Actions": [ { "title": "最初のボタン", "identifier": "firstButtonAction" }, { "title": "2番目のボタン", "identifier": "secondButtonAction" } ], "pm2.5status": "very high" }
Dynamicインタフェースに対応する
ではDynamicインタフェースを実装していきましょう。Dynamicインタフェースを表示する- didReceiveRemoteNotification:withCompletion:を実装します。引数withCompletion:に設定するクロージャの戻り値に.Customを設定すると、Dynamicインタフェースが使用されるようになります。. Defaultを指定するとStaticインタフェースになります。このメソッド内では、ペイロードの内容を[NSObject : AnyObject]型で受け取ることができます。ここからデータを取得し、Dynamicインタフェースに設定することも可能です。下記のサンプルではペイロードに含まれる bodyを読み出し、Dynamicインタフェース上に表示させています。
テストするペイロードはSchemeのNotification Payloadで切り替えることが可能です。
Notification Interfaceは複数作成が可能
Notificationに使用するインタフェースは複数用意し、Notificationのカテゴリ毎に表示をカスタマイズする、といったことが可能です。カテゴリ名を変更するには、Notification Category(右向きの矢印)を選択し、Nameプロパティを修正します。
次にペイロード内のカテゴリーを先ほど修正したNotification CategoryのNameプロパティの値とあわせます。これで実行すると、ペイロードのcategoryで指定した値に対応するNotificaxtionインタフェースが表示されるようになります。
アクション可能Notification
Notificationを見て、1タップでアクションできる便利機能です。例えば、メールソフトなら「既読」「削除」「アーカイブ」を1タップで行えるようにできますし、TODO管理ソフトなら「完了」「1時間後に再通知」を1タップで行えるでしょう。Notificationを見てその場でアクションを選択できるので非常に有効な機能です。
{ "aps": { "alert": { "body": "【東京都】PM2.5観測情報:非常に多い", "title": "PM2.5情報" }, "badge" : 1, "category": "very_high" }, "WatchKit Simulator Actions": [ { "title": "最初のボタン", "identifier": "firstButtonAction" }, { "title": "2番目のボタン", "identifier": "secondButtonAction" } ], "pm2.5status": "very high" }InterfaceController.swiftにアクションを受け取った時の処理を記述できます。
class InterfaceController: WKInterfaceController { 〜 override func handleActionWithIdentifier(identifier: String?, forRemoteNotification remoteNotification: [NSObject : AnyObject]) { if identifier == "firstButtonAction" { self.label.setText("1番目のボタンが選択された") } else if identifier == "secondButtonAction" { self.label.setText("2番目のボタンが選択された") } } }
Notificationのカスタマイズ
Notificationではカスタマイズできる項目が限られています。いくつかカスタマイズ方法について紹介しましょう。
まとめ
それでは最後にApple WatchのNotificationについてポイントをまとめましょう。
- Apple Watch用のコーディングを行わなくても、iPhoneアプリ側がNotificationに対応してさえいればWatchにも通知が表示されます。
- 通知が表示されるのはiPhoneとWatchの設定で通知がONになっていて、かつiPhoneがスリープしている時だけです。
- WatchKitExtensionをアプリケーションに追加し、Dynamicインタフェースを実装すればリッチなNotificationを作成することが可能です。
記載されている会社名、および商品名等は、各社の商標または登録商標です。
0 コメント:
コメントを投稿