iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
Notificationには、LocalとPushの二種類があって、前者は発生源が手元のアプリケーション、後者は発生源が外部という事のようだ。
Local Notificationの登録は、通知する日時を指定する方法と、直ぐに通知する方法の二通りがある。
通知する日時を指定する手順は以下のとおり。
- (IBAction)scheduleNotification:(id)sender
{
DBGMSG(@"%s", __func__);
NSDate *today = [NSDate date];
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
return;
localNotif.fireDate = [today dateByAddingTimeInterval:10];
localNotif.timeZone = [NSTimeZone defaultTimeZone];
localNotif.alertBody = [NSString stringWithString:NSLocalizedString(@"Local Notify", nil)];
localNotif.alertAction = NSLocalizedString(@"local notify", nil);
localNotif.soundName = UILocalNotificationDefaultSoundName;
localNotif.applicationIconBadgeNumber = localNotif.applicationIconBadgeNumber + 1;
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"local notify" forKey:@"Key"];
localNotif.userInfo = infoDict;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
}
UILocalNotificationのプロパティfireDateに、通知する日時を設定する。上記の例は、現在の時刻の10秒後だ。
UILocalNotificationのインスタンスをUIApplicationのscheduleLocalNotification:メソッドに設定すると、指定された日時に通知される。
直ぐに通知させたい場合は、presentLocalNotificationNow:メソッドを呼ぶ。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
DBGMSG(@"Application entered background state.");
NSAssert(self.bgTask == UIBackgroundTaskInvalid, nil);
self.bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
dispatch_async(dispatch_get_main_queue(), ^{
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
});
}];
dispatch_async(dispatch_get_main_queue(), ^{
while ([application backgroundTimeRemaining] > 1.0) {
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif) {
localNotif.alertBody = [NSString stringWithString:NSLocalizedString(@"background", nil)];
localNotif.alertAction = NSLocalizedString(@"action", nil);
localNotif.soundName = UILocalNotificationDefaultSoundName;
localNotif.applicationIconBadgeNumber = localNotif.applicationIconBadgeNumber + 1;
[application presentLocalNotificationNow:localNotif];
break;
}
}
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
});
}
通知を受けてアプリケーションを呼び出す場合は、アプリケーション側で準備が必要となる。
アプリケーションの起動されていない場合は、アプリケーションのデリゲートのdidFinishLaunchingWithOptions:メソッドで通知からの呼び出しかどうかの判断を行う。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {
NSString *value = [localNotif.userInfo objectForKey:@"Key"];
DBGMSG(@"%s, Notify: %@", __func__, value);
application.applicationIconBadgeNumber = localNotif.applicationIconBadgeNumber - 1;
}
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
起動済みの場合は、didReceiveLocalNotification:メソッドが呼ばれる。
- (void)application:(UIApplication *)app didReceiveLocalNotification:(UILocalNotification *)notif
{
NSString *value = [notif.userInfo objectForKey:@"Key"];
NSLog(@"%s, Notify: %@", __func__, value);
app.applicationIconBadgeNumber = notif.applicationIconBadgeNumber - 1;
}