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?
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.
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!
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) {
}
N'oubliez pas que lors du test, vous devez utiliser l'adresse sandbox
pour que vos notifications fonctionnent.