web-dev-qa-db-ja.com

UILocalNotificationはiOS10で廃止されました

事前に質問になるかもしれませんが、iOS10でUILocalNotificationの代わりに何を使用したらよいのでしょうか。 iOS8を展開ターゲットとするアプリで作業しているので、UILocalNotificationを使用しても大丈夫ですか?

41
Roohul

はい、UILocalNotificationを使用できます。古いAPIもiOS10で正常に動作しますが、代わりにUser NotificationsフレームワークのAPIを使用することをお勧めします。また、いくつかの新機能があり、iOS10ユーザー通知フレームワークでのみ使用できます。

これは、詳細については、リモート通知でも発生します: Here

新機能:

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

UILocalNotification AP​​IをiOS10ユーザー通知フレームワークAPIに変換するのは非常に簡単です。それらは本当に似ています。

新しいAPIと古いAPIを同時に使用する方法を示すデモをここに作成します: iOS10AdaptationTips .

例えば、

Swift実装の場合:

  1. userNotificationsのインポート

    ///    Notification become independent from UIKit
    import UserNotifications
    
  2. localNotificationの承認をリクエストする

        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
    
  3. スケジュールlocalNotification

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

    @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 60 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>
    
  2. localNotificationの承認をリクエストする

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

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

    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)
101
ElonChan

Appleが再び実行しました。正しい実装はAppDelegate.Swiftです

if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.currentNotificationCenter()
        center.requestAuthorizationWithOptions([.Alert, .Sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
    } else {
        // Fallback on earlier versions
    }

追加することを忘れないでください

import UserNotifications
8
Golan Shay

Objetcive-CiOS 10のローカル通知

しばらくプログラミングをしているなら、あなたはUILocalNotificationクラスに精通していると確信しており、iOS 10の登場により、UILocalNotificationが廃止されていることがわかります。詳細な実装については、このブログ投稿をご覧ください

https://medium.com/@jamesrochabrun/local-notifications-are-a-great-way-to-send-notifications-to-the-user-without-the-necessity-of-an-b3187e7176a3 #.nxdsf6h2h

2
James Rochabrun

スイフト4

if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .badge, .sound])  { (granted, error) in
            // Enable or disable features based on authorization.
        }
    } else {
        // REGISTER FOR Push NOTIFICATIONS
        let notifTypes:UIUserNotificationType  = [.alert, .badge, .sound]
        let settings = UIUserNotificationSettings(types: notifTypes, categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
        application.applicationIconBadgeNumber = 0

    }

マーク:-プッシュ通知のデリゲート

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let installation = PFInstallation.current()
    installation?.setDeviceTokenFrom(deviceToken)
    installation?.saveInBackground(block: { (succ, error) in
        if error == nil {
            print("DEVICE TOKEN REGISTERED!")
        } else {
            print("\(error!.localizedDescription)")
        }
    })
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("application:didFailToRegisterForRemoteNotificationsWithError: %@", error)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
    print("\(userInfo)")

    // PFPush.handle(userInfo)
    if application.applicationState == .inactive {
        PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(inBackground: userInfo, block: nil)
    }
}
1
Faris