web-dev-qa-db-fra.com

UILocalNotification est obsolète dans iOS10

C'est peut-être une question d'avance mais je me demande quoi utiliser à la place de UILocalNotification dans iOS10. Je travaille sur une application dont la cible de déploiement est iOS8, puis-je utiliser UILocalNotification?

38
Roohul

Oui, vous pouvez utiliser UILocalNotification. Les anciennes API fonctionnent également avec iOS10, mais il est préférable d’utiliser les API du framework Notifications utilisateur à la place. Il existe également de nouvelles fonctionnalités que vous ne pouvez utiliser qu'avec la structure de notifications d'utilisateurs iOS10.

Cela arrive aussi à la notification à distance, pour plus d'informations: ici .

Nouvelles fonctionnalités:

  1. Maintenant, vous pouvez soit présenter une alerte, créer un son ou augmenter le badge lorsque l'application est au premier plan avec iOS 10.
  2. Vous pouvez désormais gérer tous les événements au même endroit lorsque l'utilisateur a appuyé sur le bouton d'action (ou l'a fait glisser), même lorsque l'application a déjà été supprimée.
  3. Soutenir 3D tactile au lieu de glisser geste.
  4. Vous pouvez maintenant supprimer les notifications locales spécifiques par un code de ligne.
  5. Prise en charge de Rich Notification avec une interface utilisateur personnalisée. 

Il est très facile pour nous de convertir les API UILocalNotification en iOS10 Les API du cadre Notifications utilisateur, elles sont vraiment similaires.

J'écris une démonstration ici pour montrer comment utiliser les nouvelles et les anciennes API en même temps: iOS10AdaptationTips .

Par exemple,

Avec la mise en œuvre rapide:

  1. importer UserNotifications

    ///    Notification become independent from UIKit
    import UserNotifications
    
  2. demander une autorisation pour la notification locale

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

  4. mettre à jour le numéro de badge d'icône d'application

    @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"])
    }
    

Mise en œuvre d'Objective-C:

  1. importer UserNotifications

    // Notifications are independent from UIKit
    #import <UserNotifications/UserNotifications.h>
    
  2. demander une autorisation pour la notification locale

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

  4. mettre à jour le numéro de badge d'icône d'application

    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!");
        }
    }];
    

Allez ici pour plus d'informations: iOS10AdaptationTips .

mis à jour

Arrêt de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', motif: 'l'intervalle de temps doit être égal à au moins 60 si la répétition'

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

Apple l’a refait, la bonne implémentation est: 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
    }

et n'oubliez pas d'ajouter

import UserNotifications
8
Golan Shay

Notifications locales pour iOS 10 dans Objetcive-C

Si vous programmez pendant un certain temps, je suis sûr que vous connaissez bien la classe UILocalNotification et que maintenant, avec l'arrivée de iOS 10, vous pouvez voir que UILocalNotification est obsolète. Pour une mise en œuvre détaillée, visitez ce blog. 

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

2
James Rochabrun

Swift 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

    }

MARK: - DELEGATES FOR NOTIFICATIONS

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