iOS
UILocalNotification
サーチ…
前書き
ローカル通知により、サーバーの使用を必要としないコンテンツについてアプリがユーザーに通知することができます。
サーバーからトリガーされるリモート通知とは異なり、ローカル通知はアプリ内でスケジュールされ、トリガーされます。一般的な通知は、ユーザーとのアプリケーションのやりとりを増やしたり、ユーザーがそのアプリケーションを開いたり操作したりするよう誘惑したり誘惑したりすることを目的としています。
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のviewDidLoad
、 viewWillAppear
、 viewDidAppear
などでこれをviewWillAppear
と、通知が再びスケジュールされます)。
ローカル通知の登録
ローカル通知をユーザーに提示するには、アプリをデバイスに登録する必要があります。
迅速
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フレームワークでのみ使用できる新しい機能がいくつかあります。
これはまた、より多くの情報のために、リモート通知に起こる: ここに 。
新機能:
- アプリがフォアグラウンドにある間に、アラート、サウンド、バッジを増やすことができます。iOS 10
- これで、すでにアプリが終了している間でも、ユーザがアクションボタンをタップ(またはスライド)したときに、すべてのイベントを1か所で処理できるようになりました。
- スライディングジェスチャーの代わりに3Dタッチをサポートします。
- これで、特定のローカル通知を1行のコードだけで削除できます。
- カスタムUIで豊富な通知をサポートします。
UILocalNotification
APIをiOS10 User NotificationsフレームワークAPIに変換するのは本当に簡単ですが、実際には似ています。
新しいAPIと古いAPIを同時に使用する方法を示すために、ここにデモを書きます: iOS10AdaptationTips 。
例えば、
迅速な実装で:
- インポートUserNotifications
/// Notification become independent from UIKit
import UserNotifications
localNotificationの承認を要求する
let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in // Enable or disable features based on authorization. }
schedule localNotification
アプリケーションアイコンのバッジ番号を更新する
@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実装:
- インポートUserNotifications
// Notifications are independent from UIKit
#import <UserNotifications/UserNotifications.h>
localNotificationの承認を要求する
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error) { NSLog(@"request authorization succeeded!"); [self showAlert]; } }];
schedule localNotification
アプリケーションアイコンのバッジ番号を更新する
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)