web-dev-qa-db-fra.com

Problème de notification push avec iOS 10

J'ai développé une application dans laquelle j'ai implémenté la notification push. Actuellement, c'est en direct sur Apple Store. Jusqu'à iOS 9 Push fonctionne bien mais après iOS 10, il ne fonctionne plus. 

Quel est le problème avec le code?

51
Mohsin Sabasara

Pour iOS 10 utilisant xCode 8 GM.

J'ai résolu le problème en procédant comme suit à l'aide de xCode 8 GM pour iOS 10:

1) Dans les cibles, sous Capacités, activez les notifications Push pour ajouter des droits de notifications Push.

2) Implémentez UserNotifications.framework dans votre application. Importez UserNotifications.framework dans votre AppDelegate.

#import <UserNotifications/UserNotifications.h>
@interface AppDelegate : UIResponder   <UIApplicationDelegate,UNUserNotificationCenterDelegate>

@end

3) Dans la méthode didFinishLaunchingWithOptions, affectez UIUserNotificationSettings et implémentez UNUserNotificationCenter délégué.

#define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

if(SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10.0")){
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
         if( !error ){
             [[UIApplication sharedApplication] registerForRemoteNotifications];
         }
     }];  
}

return YES;
}

4) Maintenant, implémentez enfin ces deux méthodes de délégué.

// ============ Pour iOS 10 =============

-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{

    //Called when a notification is delivered to a foreground app. 

    NSLog(@"Userinfo %@",notification.request.content.userInfo);

    completionHandler(UNNotificationPresentationOptionAlert);
}

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{

   //Called to let your app know which action was selected by the user for a given notification.

   NSLog(@"Userinfo %@",response.notification.request.content.userInfo);

}

Veuillez rester le code tel que vous utilisez pour iOS 9, Ajoutez uniquement des lignes de code pour prendre en charge la notification Push pour iOS 10 à l'aide de UserNotifications.framework.

114
Ashish Shah

Avant iOS 10, tout fonctionnait bien. Dans mon cas, seuls les paramètres de fonctionnalité entraînent ce problème.

Il doit être activé pour la notification Push.

 enter image description here

24
AiOsN

J'ai eu un problème avec les notifications push silencieuses iOS 10. Dans iOS9 et les versions antérieures, l'envoi d'une notification Push contenant des champs de données supplémentaires, mais un attribut aps vide, dans les données, fonctionnait correctement. Mais dans iOS10, une notification Push avec un attribut aps vide ne frappe pas du tout la méthode de délégation d'application didReceiveRemoteNotification, ce qui signifie que toutes mes notifications Push silencieuses (notifications que nous utilisons uniquement en interne pour déclencher des actions lorsque l'application est ouverte) ont cessé de fonctionner dans iOS10.

J'ai pu résoudre ce problème sans pousser une mise à jour de mon application en ajoutant au moins un attribut à la partie aps de la notification Push. Dans mon cas, j'ai simplement ajouté badge: 0 et mes notifications Push silencieuses ont recommencé à fonctionner dans iOS 10. J'espère que cela aide quelqu'un d'autre!

18
jakedunc

La version Swift 3 du code @Ashish Shah est la suivante:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

//notifications
        if #available(iOS 10.0, *) {
            let center  = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
                if error == nil{
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }
        } else {
            // Fallback on earlier versions
        }

        return true
    }
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    }

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

    }
7
Lucho

N'oubliez pas que lors du test, vous devez utiliser l'adresse sandbox pour que vos notifications fonctionnent.

0
Ashkan Ghodrat