iOSアプリでローカルプッシュ通知を使用する

iOSアプリで指定した時刻にローカルプッシュ通知を送信する手順を以下に記載します。

下記よりサンプルをダウンロード出来ますので、実装の際のお役に立てば幸いです。

ダウンロード

使用手順

1. Frameworkの追加

今回のサンプルは iOS 10以降を対象としていますので、UserNotifications.frameworkをプロジェクトに追加します。

2. プッシュ通知の許可をユーザーに求める

ローカルプッシュ通知の送信には、アプリ起動時にユーザーに対しプッシュ通知の受信許可を求める必要があります。

AppDelegate.h

1
@import UserNotifications;

AppDelegate.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// アプリ起動時の処理
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // ユーザーにプッシュ通知の許可を求める
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (!error) {
            NSLog(@"Succeeded!");
        }
    }];

    return YES;
}

3. ローカルプッシュ通知管理クラスの作成

今回のサンプルでは、指定した時刻にローカルプッシュ通知を送信するよう実装しています。

LocalNotificationManager.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#import <UIKit/UIKit.h>

@import UserNotifications;

NS_ASSUME_NONNULL_BEGIN

@interface LocalNotificationManager : NSObject

#pragma mark - property
@property (nonatomic, strong) NSCalendar *calendar;
@property (nonatomic, strong) NSDate     *nowDate;

#pragma mark - public method
- (void)scheduleLocalNotifications:(NSArray *)notificationHours;

@end

NS_ASSUME_NONNULL_END

LocalNotificationManager.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#import "LocalNotificationManager.h"

@implementation LocalNotificationManager

#pragma mark - Scheduler

// ローカルプッシュ通知のスケジューリング
- (void)scheduleLocalNotifications:(NSArray *)notificationHours
{
    // 通知を全てキャンセルする
    [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];

    // 通知時間を設定する
    for (int i = 0; i < [notificationHours count]; i++) {
        // 通知時間保持
        NSUInteger notificationHour = [notificationHours[i] intValue];

        // カレンダー初期化
        _calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

        // 現在の日付取得
        _nowDate  = [NSDate date];

        // コンポーネント初期化
        NSDateComponents *fireDateComponents = [_calendar components:(NSCalendarUnitHour |
                                                                      NSCalendarUnitMinute |
                                                                      NSCalendarUnitSecond)
                                                            fromDate:_nowDate];

        // コンポーネントに通知時間を指定
        [fireDateComponents setHour:notificationHour];
        [fireDateComponents setMinute:0];
        [fireDateComponents setSecond:0];
        [fireDateComponents setTimeZone:[NSTimeZone systemTimeZone]];

        // ローカル通知のスケジュール呼び出し
        [self makeNotification:fireDateComponents notificationHour:notificationHour userInfo:nil];
    }
}

// ローカルプッシュ通知生成
- (void)makeNotification:(NSDateComponents *)fireDateComponents notificationHour:(NSUInteger)notificationHour userInfo:(NSDictionary *)userInfo
{
    // デバッグ出力
    //NSLog(@"fireDateComponents: %@", fireDateComponents);

    // ローカルプッシュ通知のスケジューリング
    UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
    content.title    = @"It's time to go.";
    content.body     = [NSString stringWithFormat:@"t's now %lu:00.", notificationHour];
    content.sound    = [UNNotificationSound defaultSound];
    content.badge    = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1);
    content.userInfo = userInfo;

    UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger
                                              triggerWithDateMatchingComponents:fireDateComponents repeats:YES];

    NSString *const notificationIdentifier = [NSString stringWithFormat:@"NotificationHour: %lu", notificationHour];

    UNNotificationRequest *request = [UNNotificationRequest
                                      requestWithIdentifier:notificationIdentifier content:content trigger:trigger];

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (error != nil) {
            NSLog(@"%@", error);
        }
    }];
}

4. プッシュ通知の予約

ユーザーがアプリを閉じたタイミングでプッシュ通知を予約します。今回は9時、12時、15時、18時にローカルプッシュ通知が送信されるよう指定しました。

AppDelegate.h

1
#import "LocalNotificationManager.h"

AppDelegate.m

1
2
3
4
5
6
7
8
9
10
// アプリがバックグラウンドになった時に呼ばれる
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // ローカルプッシュ通知を送信する時間を指定
    NSArray *notificationHours = @[@9, @12, @15, @18];

    // バックグラウンド移行時にプッシュ通知を設定
    LocalNotificationManager *notificationManager = [[LocalNotificationManager alloc] init];
    [notificationManager scheduleLocalNotifications:notificationHours];
}

e.x. アイコンバッジの削除

このサンプルではプッシュ通知送信時にアイコンバッジを付与するよう指定していますので、アプリが起動されたらアイコンバッジを削除するようにします。

AppDelegate.m

1
2
3
4
5
6
// アプリがバックグラウンドからフォアグラウンドになる直前に呼ばれる
- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // アイコンバッジ削除
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}

以上でローカルプッシュ通知の実装は完了になります。

About

廣川政樹 (@dolice_apps)

テクニカルアーティスト 廣川政樹の開発ブログ。Objective-Cや Javaなど iPhone/Androidアプリ開発に関する技術情報を掲載しています。

iPhone apps

  • リラックス・ヒーリング
  • 望みが叶う!引き寄せの法則アプリ
  • 泣ける話 - 感動のエピソードまとめ - ラクリマ
  • ミステリー - 怖い話や不思議な体験、都市伝説まとめ
  • 浮世絵壁紙 - 美しい日本画ギャラリー
  • 綺麗な壁紙

Android apps

  • 浮世絵壁紙 - 美しい日本画ギャラリー
  • 綺麗な高画質壁紙

Objective-C Classes

Tag Cloud

ActionScript(9) ActionScript3(7) Ad(5) Adfurikun(2) AdMob(12) Android(11) Animation(17) AppDelegate(3) ARC(1) ArrayList(1) AVAudioPlayer(4) AVAudioSession(1) AVFoundation(3) Banner(2) Bitmap(1) Camera(4) CGAffineTransform(4) CGBlendMode(2) CGContextRef(1) CGImageRef(1) Classes(49) CLLocationManager(1) ConnectivityManager(1) ContentResolver(1) CoreLocation(2) Delegate(3) Device(7) Display(1) DisplayMetrics(1) Download(109) Facebook(6) Foundation(72) Framework(2) Google Analytics(1) Handler(1) iAd(6) ImageView(1) In-AppPurchase(1) iOS(12) iOS 7(15) iOS 7.1(3) iOS 8(1) iPad(7) iPhone(24) iPhone 6(4) Java(7) JavaScript(2) LINE(4) Localize(1) Magazine(3) MediaStore(1) MFComposeViewController(1) Nend(1) NetworkInfo(1) NSArray(23) NSCalendar(3) NSData(2) NSDate(7) NSDateComponents(2) NSDateFormatter(2) NSDictionary(12) NSEnumerator(1) NSIndexSet(1) NSInteger(6) NSMutableArray(17) NSMutableDictionary(5) NSMutableOrderedSet(7) NSMutableString(4) NSMutableURLRequest(1) NSNotificationCenter(1) NSNumber(1) NSObject(1) NSOrderedSet(7) NSRange(2) NSSelectorFromString(1) NSSet(6) NSString(19) NSTimer(4) NSTimeZone(1) NSURL(7) NSURLConnection(1) NSURLRequest(2) NSUserDefaults(7) NSXMLParser(2) Objective-C(229) PHP(1) Products(17) QuartzCore(3) RSS(2) Runnable(1) Sample(51) Screensaver(9) SDK(2) ShareCompat(1) Social(10) StoreKit(1) Twitter(6) UIAccelerometer(3) UIActionSheet(1) UIActivityIndicator(1) UIActivityIndicatorView(3) UIActivityViewController(1) UIAlertView(5) UIApplication(7) UIButton(4) UIColor(3) UIDatePicker(5) UIDevice(6) UIDeviceOrientation(1) UIEvent(6) UIImage(15) UIImagePickerController(4) UIImageView(12) UIKit(58) UILabel(7) UINavigationBar(4) UINavigationItem(1) UIPasteboard(4) UIScreen(1) UIScrollBar(1) UIScrollView(1) UISlider(3) UIStoryboardSegue(3) UISwitch(1) UITabBar(3) UITableView(4) UITextField(2) UIView(11) UIViewAnimationTransition(1) UIViewController(4) UIWebView(5) Uncategorized(1) UserNotifications(1) WindowManager(1) Xcode(48) Xcode 5(8) Xcode 5.1(2)