通知 = ローカル通知(UILocalNotification)
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = PAST_DATE;
localNotification.alertBody = @"Fire!";
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
fireDate
が現在より後なのかをチェックするNSDate
をチェックする if (fireDate == nil || [fireDate timeIntervalSinceNow] <= 0) {
return;// 現在より前なのでreturnする
}
- (void)makeNotification:(NSDate *) fireDate alertBody:(NSString *) alertBody userInfo:(NSDictionary *) userInfo {
if (fireDate == nil || [fireDate timeIntervalSinceNow] <= 0) {
return;
}
[self schedule:fireDate alertBody:alertBody userInfo:userInfo];
}
- (void)schedule:(NSDate *) fireDate alertBody:(NSString *) alertBody userInfo:(NSDictionary *) userInfo {
UILocalNotification *notification = [[UILocalNotification alloc] init];
[notification setFireDate:fireDate];
[notification setTimeZone:[NSTimeZone systemTimeZone]];
[notification setAlertBody:alertBody];
[notification setUserInfo:userInfo];
[notification setSoundName:UILocalNotificationDefaultSoundName];
[notification setAlertAction:@"Open"];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
NSDate *tomorrow = [NSDate dateTomorrow];
[self makeNotification:tomorrow alertBody:@"Fire!!" userInfo:nil];
NSDate
をチェックするコストがある(多くても数ms程度…)NSArray *scheduledLocalNotifications
に登録済みの通知が入っているNSDate
をコンソールに表示するときはNSDateFormatterを使うと表示される時間がずれない#if DEBUG
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]];
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
for (UILocalNotification *notification in [[UIApplication sharedApplication] scheduledLocalNotifications]) {
NSLog(@"Notifications : %@ '%@'",
[dateFormatter stringFromDate:notification.fireDate],
notification.alertBody
);
}
#endif
repeatInterval
プロパティに NSCalendarUnit
を設定設定した fireData
から
NSMinuteCalendarUnit : 1分毎
NSHourCalendarUnit : 1時間毎
NSWeekCalendarUnit : 1日毎
NSDayCalendarUnit : 1週間毎
repeatInterval
ではサポートされてない15 * 6 回 通知をつける例
for (int i = 0; i <= 6; i++) {
NSDate *fireDate = [basedFireDate dateByAddingMinutes:i * 15];
[self makeNotification:fireDate alertBody:alertBody userInfo:nil];
}
soundName
@property(nonatomic,copy) NSString *soundName;
repeatInterval
で 1分ごとに繰り返す UILocalNotification *notification = [[UILocalNotification alloc] init];
[notification setRepeatInterval:NSMinuteCalendarUnit];
[notification setSoundName:@"sound.caf"];// 30sec
- (void)applicationDidEnterBackground:(UIApplication *)application {
// schedule UILocalNotification
}
dispatch_async
など別スレッドで通知の設定は可能dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 非同期で通知を設定する処理
dispatch_async(dispatch_get_main_queue(), ^{
/* メインスレッドでのみ実行可能な処理 */
});
});
LocalNotificationManager
という通知管理するクラスを考えるscheduleLocalNotifications
を呼べば、一度全てキャンセルして登録し直すscheduleLocalNotifications
を呼ぶ- (void)applicationDidEnterBackground:(UIApplication *) application {
// バックグラウンドに移行際に通知を設定する
LocalNotificationManager *manager = [[LocalNotificationManager alloc] init];
[manager scheduleLocalNotifications];
}
@interface LocalNotificationManager : NSObject
// ローカル通知を登録する
- (void)scheduleLocalNotifications;
@end
@implementation LocalNotificationManager
#pragma mark - Scheduler
- (void)scheduleLocalNotifications {
// 一度通知を全てキャンセルする
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// 通知を設定していく...
[self scheduleWeeklyWork];
}
// 例: weeklyWorkSchedule の時間を通知登録する
- (void)scheduleWeeklyWork {
// ...
// makeNotification: を呼び出して通知を登録する
}
#pragma mark - helper
- (void)makeNotification:(NSDate *) fireDate alertBody:(NSString *) alertBody userInfo:(NSDictionary *) userInfo {
// 現在より前の通知は設定しない
if (fireDate == nil || [fireDate timeIntervalSinceNow] <= 0) {
return;
}
[self schedule:fireDate alertBody:alertBody userInfo:userInfo];
}
- (void)schedule:(NSDate *) fireDate alertBody:(NSString *) alertBody userInfo:(NSDictionary *) userInfo {
// ローカル通知を作成する
UILocalNotification *notification = [[UILocalNotification alloc] init];
[notification setFireDate:fireDate];
[notification setTimeZone:[NSTimeZone systemTimeZone]];
[notification setAlertBody:alertBody];
[notification setUserInfo:userInfo];
[notification setSoundName:UILocalNotificationDefaultSoundName];
[notification setAlertAction:@"Open"];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
@end
- (void)scheduleLocalNotifications
LocalNotificationManager
のサブクラスを作る-[LocalNotificationManager schedule:alertBody:userInfo:]
のhelperに閉じ込めてあるLocationNotificationManagerSpy
を作るschedule:alertBody:userInfo:
を overwriteUILocalNotification
をプロパティに貯める// テスト用にLocalNotificationManagerを継承したモッククラスを作る
@interface LocationNotificationManagerSpy : LocalNotificationManager
@property(nonatomic) NSMutableArray *schedules;
// helper
- (UILocalNotification *)notificationAtIndex:(NSUInteger) index;
// overwrite
- (void)schedule:(NSDate *) fireDate alertBody:(NSString *) alertBody userInfo:(NSDictionary *) userInfo;
@end
@implementation LocationNotificationManagerSpy
- (NSMutableArray *)schedules {
if (_schedules == nil) {
_schedules = [NSMutableArray array];
}
return _schedules;
}
- (UILocalNotification *)notificationAtIndex:(NSUInteger) index {
if (index < [self.schedules count]) {
return self.schedules[index];
}
return nil;
}
// 通知を登録するメソッドを乗っ取り、呼ばれたことを記録する(いわゆるspy)
- (void)schedule:(NSDate *) fireDate alertBody:(NSString *) alertBody userInfo:(NSDictionary *) userInfo {
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = fireDate;
notification.alertBody = alertBody;
notification.userInfo = userInfo;
[self.schedules addObject:notification];
}
@end
scheduleLocalNotification:
は実際には呼ばれないself.schedules
に UILocalNotification
が積まれていくscheduleLocalNotifications
を呼ぶself.schedules
に入った通知情報が意図通りかをテストするUILocalNotification
のfireDate や userInfo が一致するかなど- (UILocalNotification *)notificationAtIndex:
はhelperTable of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |