サーチ…


前書き

ローカル通知により、サーバーの使用を必要としないコンテンツについてアプリがユーザーに通知することができます。

サーバーからトリガーされるリモート通知とは異なり、ローカル通知はアプリ内でスケジュールされ、トリガーされます。一般的な通知は、ユーザーとのアプリケーションのやりとりを増やしたり、ユーザーがそのアプリケーションを開いたり操作したりするよう誘惑したり誘惑したりすることを目的としています。

UILocalNotificationはiOS 10では廃止されました。代わりにUserNotificationsフレームワークを使用してください。

備考

UILocalNotificationとプッシュ通知を混同しないでください。 UILocalNotificationはデバイスによってトリガされ、スケジュールされるとシステムにコピーされます。

リンク:

ローカル通知のスケジューリング

これが機能するには、ローカル通知の登録が表示されていることを確認してください。

迅速

let notification = UILocalNotification()
notification.alertBody = "Hello, local notifications!"
notification.fireDate = NSDate().dateByAddingTimeInterval(10) // 10 seconds after now
UIApplication.sharedApplication().scheduleLocalNotification(notification)

目標-C

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Hello, local notifications!";
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10]; // 10 seconds after now
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

iOSシミュレータで通知を表示するには、 ^⌘H (control-command-H)を入力して家に帰り、 ⌘L (command-L)を入力してデバイスをロックします。数秒待ってから通知が表示されます(この外観は、「ローカル通知の登録」で説明した通知タイプによって異なります)。

ローカル通知バナー

通知をスワイプしてアプリに戻ってください(最初のView ControllerのviewDidLoadviewWillAppearviewDidAppearなどでこれをviewWillAppearと、通知が再びスケジュールされます)。

ローカル通知の登録

iOS 8

ローカル通知をユーザーに提示するには、アプリをデバイスに登録する必要があります。

迅速

let settings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)

目標-C

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

これは最初に呼び出されたときにアラートを表示します:

ローカル通知アラート登録

ユーザーが選択した内容に関係なく、アラートは再び表示されず、設定でユーザーが変更を開始する必要があります。

受信したローカル通知への応答

重要:このデリゲートメソッドはフォアグラウンドでのみ呼び出されます。

迅速

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
    
}

目標-C

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

このメソッドは、UIApplicationDelegateプロトコルに準拠するAppDelegateでオーバーライドされます。

UUIDを使用したローカル通知の管理

多くの場合、通知を追跡して取り消すことができるため、通知を管理する必要があります。

通知を追跡する

通知にUUID(Universally Unique Identifier)を割り当てることができます。

迅速

let notification = UILocalNotification()
let uuid = NSUUID().uuidString
notification.userInfo = ["UUID": uuid]
UIApplication.shared.scheduleLocalNotification(notification)

目標-C

UILocalNotification *notification = [[UILocalNotification alloc] init];
NSString *uuid = [[NSUUID UUID] UUIDString];
notification.userInfo = @{ @"UUID": uuid };
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

通知をキャンセルする

通知をキャンセルするには、最初にすべての通知のリストを取得し、一致するUUIDを持つ通知を見つけます。最後に、キャンセルします。

迅速

let scheduledNotifications = UIApplication.shared.scheduledLocalNotifications

guard let scheduledNotifications = scheduledNotifications else {
    return
}

for notification in scheduledNotifications where "\(notification.userInfo!["UUID"]!)" == UUID_TO_CANCEL {
    UIApplication.sharedApplication().cancelLocalNotification(notification)
}

目標-C

NSArray *scheduledNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];

for (UILocalNotification *notification in scheduledNotifications) {
    if ([[notification.userInfo objectForKey:"UUID"] compare: UUID_TO_CANCEL]) {
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
        break;
    }
}

これらのUUIDのすべてをCore DataまたはRealmに格納することをお勧めします。

すぐにローカル通知を提示する

直ちに地域の通知を表示する場合は、次の電話番号に電話する必要があります。

スウィフト3

UIApplication.shared.presentLocalNotificationNow(notification)

スウィフト2

UIApplication.sharedApplication().presentLocalNotificationNow(notification)

目標-C

[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

これを使用する利点は、 UILocalNotificationオブジェクトのfireDateおよびtimeZoneプロパティを設定する必要がないことです。

通知音

あなたのアプリによって生成された通知にカスタムサウンドが提供されるかもしれません。システムがローカル通知の警告を表示したり、アプリアイコンにバッジしたりすると、通知音を無効にしていない限り、このサウンドが再生されます。

デフォルト値はnilで、通知のためにサウンドが再生されないことを意味します。

カスタムサウンドを提供するには、 .caf.wav 、または.aiffファイルをアプリケーションバンドルに追加します。 30秒を超える音はサポートされていません。これらの要件を満たさないサウンドを供給すると、デフォルトのサウンドが再生されます( UILocalNotificationDefaultSoundName )。

目標-C

UILocalNotification *notification = [UILocalNotification new];
notification.soundName = @"nameOfSoundInBundle.wav"; // Use UILocalNotificationDefaultSoundName for the default alert sound

迅速

let notification = UILocalNotification()
notification.soundName = "nameOfSoundInBundle.wav"

Swift 3.0(iOS 10)でのローカル通知の登録とスケジュール

登録

AppDelegateで

import UserNotifications

didFinishLaunchingWithOptionsメソッドでは、

UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]) { (granted, error) in

// Here you can check Request is Granted or not.

}

通知を作成し、スケジュールします。

    let content = UNMutableNotificationContent()
    content.title = "10 Second Notification Demo"
    content.subtitle = "From Wolverine"
    content.body = "Notification after 10 seconds - Your pizza is Ready!!"
    content.categoryIdentifier = "myNotificationCategory"

    let trigger = UNTimeIntervalNotificationTrigger(
        timeInterval: 10.0,
        repeats: false)
    
    let request = UNNotificationRequest(
        identifier: "10.second.message",
        content: content,
        trigger: trigger
    )
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

コードのこの部分がトリガーされた場所であれば、通知許可を許可した場合、通知を受け取ります。

正しくテストするには、アプリケーションをバックグラウンドモードで実行してください。

iOS10でUILocalNotificationの新機能

あなたはUILocalNotificationを使うことができUILocalNotification 。古いAPIもiOS10でもうまくいきますが、代わりにUser NotificationsフレームワークでAPIを使うのが良いでしょう。また、iOS10 User Notificationsフレームワークでのみ使用できる新しい機能がいくつかあります。

これはまた、より多くの情報のために、リモート通知に起こる: ここに

新機能:

  1. アプリがフォアグラウンドにある間に、アラート、サウンド、バッジを増やすことができます。iOS 10
  2. これで、すでにアプリが終了している間でも、ユーザがアクションボタンをタップ(またはスライド)したときに、すべてのイベントを1か所で処理できるようになりました。
  3. スライディングジェスチャーの代わりに3Dタッチをサポートします。
  4. これで、特定のローカル通知を1行のコードだけで削除できます。
  5. カスタムUIで豊富な通知をサポートします。

UILocalNotification APIをiOS10 User NotificationsフレームワークAPIに変換するのは本当に簡単ですが、実際には似ています。

新しいAPIと古いAPIを同時に使用する方法を示すために、ここにデモを書きます: iOS10AdaptationTips

例えば、

迅速な実装で:

  1. インポートUserNotifications
    ///    Notification become independent from UIKit
    import UserNotifications
  1. localNotificationの承認を要求する

        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
    
  1. schedule localNotification

  2. アプリケーションアイコンのバッジ番号を更新する

    @IBAction  func triggerNotification(){
        let content = UNMutableNotificationContent()
        content.title = NSString.localizedUserNotificationString(forKey: "Elon said:", arguments: nil)
        content.body = NSString.localizedUserNotificationString(forKey: "Hello Tom!Get up, let's play with Jerry!", arguments: nil)
        content.sound = UNNotificationSound.default()
        content.badge = UIApplication.shared().applicationIconBadgeNumber + 1;
        content.categoryIdentifier = "com.elonchan.localNotification"
        // Deliver the notification in five seconds.
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60.0, repeats: true)
        let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)
    
        // Schedule the notification.
        let center = UNUserNotificationCenter.current()
        center.add(request)
    }
    
    @IBAction func stopNotification(_ sender: AnyObject) {
        let center = UNUserNotificationCenter.current()
        center.removeAllPendingNotificationRequests()
        // or you can remove specifical notification:
        // center.removePendingNotificationRequests(withIdentifiers: ["FiveSecond"])
    }
    

Objective-C実装:

  1. インポートUserNotifications
    // Notifications are independent from UIKit
    #import <UserNotifications/UserNotifications.h>
  1. localNotificationの承認を要求する

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
                              if (!error) {
                                  NSLog(@"request authorization succeeded!");
                                  [self showAlert];
                              }
                          }];
    
  1. schedule localNotification

  2. アプリケーションアイコンのバッジ番号を更新する

    UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
    content.title = [NSString localizedUserNotificationStringForKey:@"Elon said:"
                                                        arguments:nil];
    content.body = [NSString localizedUserNotificationStringForKey:@"Hello Tom!Get up, let's play with Jerry!"
                                                       arguments:nil];
    content.sound = [UNNotificationSound defaultSound];
    
    // 4. update application icon badge number
    content.badge = [NSNumber numberWithInteger:([UIApplication sharedApplication].applicationIconBadgeNumber + 1)];
    // Deliver the notification in five seconds.
    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger
                                                triggerWithTimeInterval:5.f
                                                repeats:NO];
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"
                                                                        content:content
                                                                        trigger:trigger];
    /// 3. schedule localNotification
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@"add NotificationRequest succeeded!");
        }
    }];
    

詳細については、ここをクリックしてください: iOS10AdaptationTips

#更新しました

キャッチされていない例外 'NSInternalInconsistencyException'のためアプリを終了しています、理由: '時間間隔は少なくとも60回繰り返す必要があります'

let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60, repeats: true)


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow