Apple Watch の通知には、標準、静的、動的通知の3種類がありますが簡易モードで表示するローカル通知標準を紹介します。
まずローカル通知とは簡単に説明しますとネットワークを介するリモート(Push)通知とは違い iPhone端末上で時刻日付が管理され通知するシステムです。
参考までにローカル通知を利用されているアプリは、乗り換え系ですね。
Apple Watch 標準ローカル通知の表示方法は、iPhone側でローカル通知配信を行います。
iPhone側の単体確認はローカル通知開始ボタンを押すと5秒後に配信され通知表示されるようにしています。(通常、アプリケーションが起動中の場合はローカル通知は通知されませんが、通知されるようにしています。)
Apple Watch にローカル通知を配信させる場合には、ローカル通知開始ボタンを押しiPhoneの起動を停止すればApple
Watch側(実機を腕に装着した状態)に標準通知が表示されます。
WatchKitを追加します。File -> New -> Target を選択します。
interfaceControlerとNotificationControlerが導入されていれば良いです。
標準ローカル通知に関してはこれだけです。
WatchKitに関してはソースコードを記述することはありません。
iPhone親機側の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
ローカル通知開始と停止ボタンを記述しています。
これでローカル通知が発信出来ます。
#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センターで開催します。"];
GitHub NotificationWatchKit12
コメントをお書きください
Lynsey Towry (日曜日, 22 1月 2017)
Great article! That is the type of information that should be shared across the internet. Shame on Google for no longer positioning this publish upper! Come on over and visit my site . Thanks =)
Damon Trueblood (火曜日, 31 1月 2017 22:04)
Superb, what a web site it is! This website gives helpful facts to us, keep it up.