この投稿はWatchKit Advent Calendar 2014の9日目の記事です。

Notificationを受け取ったら

あなたのiOSアプリがLocal NotificationかRemote Notificationをサポートしていたら、Apple WatchもNotificationを表示します。
もし、ユーザのiPhoneにLocal NotificationかRemote Notificationが届いたら、iOSはiPhoneかApple WatchのどちらにNotificationを表示するかを決定します。
Apple WatchにNotificationが送られた場合、システムはユーザにNotificationが来たことを微かに知らせます。
(たぶん、バイブレーション)
もし、ユーザがNotificationを見ることを選んだら(たぶん、腕をあげたら)、システムはShort-Look Interfaceを表示します。
もし、ユーザがNotificationを見続けたら(しばらく腕を上げたままだったら??) ※、システムはLong-Look Interfaceを表示します。
Watch AppはNotificationをカスタマイズしていなければ、システムがデフォルトのNotification画面を用意してくれます。

※ Short-Look InterfaceをタップするとLong-Look Interfaceが表示できるようです。
(@koogawaさん情報有り難うございます!)

Short-Look Interface

notification_short_look

通知が来た時に、ユーザが最初に見る画面です。
Short-Look Interfaceはスクロールすることはできません。
デフォルトでは、アプリ名、アイコン、Notificationのpayloadに含まれるタイトルを表示します。

Long-Look Interface

notification_long_look

Long-Look InterfaceはNotificationの内容と関連するアクションボタンを表示するスクロール可能な画面です。
デフォルトでは、Apple Watchがアイコン、タイトル、メッセージを含む画面を表示します。

Long-Look Interfaceの3つの領域

sash

アプリアイコンとアプリ名が表示されます。
デフォルトでは、一部透明ですが色をカスタマイズすることもできます。

content area

Notificationの詳細な情報を表示します。
このエリアはある程度自由にカスタマイズ可能です。

bottom area

Dismissボタンとアプリで設定したいくつかのアクションボタンを表示します。
Dismissボタンはシステムが自動的に常に表示してくれます。

アクションボタンを追加する方法

まず、任意のアクション(UIMutableUserNotificationAction)を作成し、
カテゴリ(UIMutableUserNotificationCategory)の中に複数のアクションをセットします。
NSMutableSetにすべてのカテゴリをセットして、Notificationの設定(UIUserNotificationSettings)
にNSMutableSetとNotificationの属性(バッジや音の有無など)をセットします。
最後に[UIApplication sharedApplication]にNotificationの設定を登録します。

- (void)registerSettingsAndCategories {
    // Create a mutable set to store the category definitions.
    NSMutableSet* categories = [NSMutableSet set];
    // Define the actions for a meeting invite notification.
    UIMutableUserNotificationAction* acceptAction = [[UIMutableUserNotificationAction alloc] init];
    acceptAction.title = NSLocalizedString(@"Accept", @"Accept invitation");
    acceptAction.identifier = @"accept";
    acceptAction.activationMode = UIUserNotificationActivationModeBackground;
    acceptAction.authenticationRequired = NO;
    UIMutableUserNotificationAction* declineAction = [[UIMutableUserNotificationAction alloc] init];
    declineAction.title = NSLocalizedString(@"Decline", @"Decline invitation");
    declineAction.identifier = @"decline";
    declineAction.activationMode = UIUserNotificationActivationModeBackground;
    declineAction.authenticationRequired = NO;
    // Create the category object and add it to the set.
    UIMutableUserNotificationCategory* inviteCategory = [[UIMutableUserNotificationCategory alloc] init];
    [inviteCategory setActions:@[acceptAction, declineAction]
                    forContext:UIUserNotificationActionContextDefault];
    inviteCategory.identifier = @"invitation";
    [categories addObject:inviteCategory];
    // Configure other actions and categories and add them to the set...
    UIUserNotificationSettings* settings = [UIUserNotificationSettings settingsForTypes:
                                            (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound)
                                                                             categories:categories];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}

アクションボタンをタップすると

システムはアクションを処理する方法を決定するために、登録されたUIUserNotificationActionオブジェクトを使用します。
アクションはフォアグラウンドまたはバックグラウンドで処理できます。

フォアグラウンドで処理する場合

あなたのWatch Appを起動し、メインのInterface ControllerにタップされたアクションボタンのIDを受け渡します。
WKInterfaceControllerのサブクラス(メインのInterface Controller)では、アクションを処理してはいけません。
WKInterfaceControllerのサブクラスでは、以下のメソッドを実装する必要があります。

  • handleActionWithIdentifier:forRemoteNotification:
  • handleActionWithIdentifier:forLocalNotification: methods

バックグラウンドで処理する場合

iOSアプリをバックグラウンドで起動し、以下のどちらかのメソッドで処理をします。

  • application:handleActionWithIdentifier:forRemoteNotification:completionHandler:
  • application:handleActionWithIdentifier:forLocalNotification:completionHandler:

参考

[UIApplication sharedApplication]

宣伝

Swiftでカスタムキーボードアプリ作りました。買ってね!
特殊文字キーボード