2015年

5月

27日

Apple Watch 標準ローカル通知の作成 実機動作確認

Apple Watch の通知には、標準、静的、動的通知の3種類がありますが簡易モードで表示するローカル通知標準を紹介します。


まずローカル通知とは簡単に説明しますとネットワークを介するリモート(Push)通知とは違い iPhone端末上で時刻日付が管理され通知するシステムです。
参考までにローカル通知を利用されているアプリは、乗り換え系ですね。

 

Apple Watch 標準ローカル通知の表示方法は、iPhone側でローカル通知配信を行います。
iPhone側の単体確認はローカル通知開始ボタンを押すと5秒後に配信され通知表示されるようにしています。(通常、アプリケーションが起動中の場合はローカル通知は通知されませんが、通知されるようにしています。)
Apple Watch にローカル通知を配信させる場合には、ローカル通知開始ボタンを押しiPhoneの起動を停止すればApple Watch側(実機を腕に装着した状態)に標準通知が表示されます。

iPhoneローカル通知画面

Apple Watch 標準ローカル通知画面

WatchKitを追加します。File -> New -> Target を選択します。

interfaceControlerとNotificationControlerが導入されていれば良いです。

標準ローカル通知に関してはこれだけです。

WatchKitに関してはソースコードを記述することはありません。

iPhone側のBandle display name / Bandle name の設定

Apple Watch側のBandle display name / Bandle name の設定

※重要
Xcode 6.3.2 バージョンでは、Apple Watch側のBandle display name / Bandle name に関してはApple Watch実機 にビルドする前に設定しておかないと後で変更出来ないバグを発見しています。
対応策ですが暫定対策として「Apple Watch と iPhone のペアリング」をやり直し(初期化)てBundle Display Nameの変更済みの新規アプリをインストールし直すと表記が変わった画面が表示出来ます。

2015/05/27付けでApple Developer バグレポート提出中です。Xcode 6.3.3に反映してくれていればと思います。

iPhone親機側のAppDelegate.mの記述をします。
ローカル通知をするための最低限の記述です。

AppDelegate.m

#import "AppDelegate.h"


#import "ViewController.h"


@interface AppDelegate ()


@end


@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.

    

    // ローカル通知を動作させる許可を得る必要 ユーザーに許可を貰う処理

    if ([UIApplication      instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {

        [[UIApplication sharedApplication] registerUserNotificationSettings:  

     [UIUserNotificationSettings

     settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeSound

     categories:nil]];

    }

    return YES;

}


- (void)applicationWillResignActive:(UIApplication *)application {

    

}


- (void)applicationDidEnterBackground:(UIApplication *)application {

    

}


- (void)applicationWillEnterForeground:(UIApplication *)application {

    

}


- (void)applicationDidBecomeActive:(UIApplication *)application {

    

}


- (void)applicationWillTerminate:(UIApplication *)application {

    

}


/* ============================================================================== */

#pragma mark - UILocalNotification

/* ============================================================================== */

// 通常、アプリケーションが起動中の場合はローカル通知は通知されないが、通知されるようにする

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

{

    if(notification) {

        UIAlertView *alert = [[UIAlertView alloc]

                              initWithTitle:@"セミナー通知のご案内"

                              message:@"大阪心斎橋Bppleセンターで開催します。"

                              delegate:self

                              cancelButtonTitle:@"OK"

                              otherButtonTitles:nil];

        [alert show];

    }

}

@end

ローカル通知開始と停止ボタンを記述しています。
これでローカル通知が発信出来ます。

ViewController.m

#import "ViewController.h"


#define NOTIFICATION_TIME   5   // 現在の日時より何秒後にアラート通知するか


@interface ViewController ()


@property (weak, nonatomic) IBOutlet UILabel *label;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


/* ============================================================================== */

#pragma mark - Button Action

/* ============================================================================== */

// ローカル通知開始ボタン

- (IBAction)StartbtnAction:(UIButton *)sender {

    [self localNotificationStart];  // ローカル通知を開始

    // ラベルへテキストを設定

    self.label.text = [NSString stringWithFormat:@"ローカル通知を開始しました。\n%d秒後に通知します。", NOTIFICATION_TIME];

}


// ローカル通知停止ボタン

- (IBAction)StopbtnAction:(UIButton *)sender {

    [self localNotificationStop];   // ローカル通知を停止

    // ラベルへテキストを設定

    self.label.text = @"ローカル通知を停止しました。";

}


/* ============================================================================== */

#pragma mark - UILocalNotification

/* ============================================================================== */

// ローカル通知(アプリが起動していない時、あるいは起動しているがバックグラウンドにある状態の時に「指定時刻になったらユーザーに対して通知する」)

- (void)localNotificationStart

{

    // 現在日時を取得

    NSDate *dateNow = [NSDate date];

    

    // アラート通知する日時

    NSDate *dateAlert =  [dateNow initWithTimeInterval:NOTIFICATION_TIME sinceDate:dateNow]; // 現在日時から5秒後

    

    

    /* ローカル通知設定 */

    

    // ローカル通知を作成する

    UILocalNotification *localNotification = [[UILocalNotification alloc] init];

    

    // 通知日時を設定する

    [localNotification setFireDate:dateAlert];

    

    // タイムゾーンを指定する

    [localNotification setTimeZone:[NSTimeZone localTimeZone]];

    

    // 効果音は標準の効果音を利用する

    [localNotification setSoundName:UILocalNotificationDefaultSoundName];

    

    // ボタンの設定

    [localNotification setAlertAction:@"Open"];

    

    // タイトルを設定する(Apple Watch

    localNotification.alertTitle = @"[セミナーのご案内]";

    

    // メッセージを設定する(Apple Watch

    [localNotification setAlertBody:@"大阪心斎橋Bppleセンターで開催します。"];

    

    // 特定できるようにキーを設定する

    [localNotification setUserInfo:[NSDictionary  dictionaryWithObject:@"1" forKey:@"NOTIF_KEY"]];

    

    // ローカル通知を登録する

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

}


// ローカル通知キャンセル

- (void)localNotificationStop

{

    // アラート通知をキャンセルする(重複通知対策)

    for (UILocalNotification *notify in [[UIApplication sharedApplication] scheduledLocalNotifications]) {

        NSInteger keyId = [[notify.userInfo objectForKey:@"NOTIF_KEY"] intValue];

        

        if (keyId == 1) {

            [[UIApplication sharedApplication] cancelLocalNotification:notify];

        }

    }

}


@end

Apple Watch 標準ローカル通知は「alertTitle」と「setAlertBody」の情報が自動で表示されるようになっています。簡単な通知のみならば標準ローカル通知でも十分かと思います。

確認時は、実機を腕に装着した状態でないとiPhone側に表示されてしまいますので確認時注意が必要です。

 

// タイトルを設定する(Apple Watch

    localNotification.alertTitle = @"[セミナーのご案内]";

// メッセージを設定する(Apple Watch

    [localNotification setAlertBody:@"大阪心斎橋Bppleセンターで開催します。"];

  

目 次