ios - tutorial - push notifications guidelines apple




Problema de notificação por push no iOS 10 (4)

A versão rápida 3 do código do @Ashish Shah é:

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) {

    }

Eu desenvolvi um aplicativo em que implementei a notificação por push. Atualmente, está ao vivo na Apple Store. O envio para o iOS 9 está funcionando bem, mas após o iOS 10 não está funcionando.

Qual é o problema com o código?


Eu tive um problema com as notificações push silenciosas do iOS 10. No iOS9 e versões anteriores, o envio de uma notificação por push com campos de dados adicionais, mas com um atributo aps vazio nos dados funcionou bem. Mas no iOS10, uma notificação por push com um atributo aps vazio não atinge o método de delegação do aplicativo didReceiveRemoteNotification, o que significa que todas as minhas notificações por push silenciosas (notificações que usamos apenas internamente para acionar ações enquanto o aplicativo está aberto) pararam de funcionar no iOS10.

Consegui consertar isso sem enviar uma atualização ao meu aplicativo adicionando pelo menos um atributo à parte aps da notificação por push; no meu caso, acabei de adicionar o badge: 0 e minhas notificações por push silenciosas começaram a funcionar novamente no iOS 10. I espero que isso ajude alguém!


No iOS, o aplicativo aborda o cliente para obter autorização para receber avisos de envio chamando a registerUserNotificationSettings: estratégia para UIApplication .

O aplicativo chama a técnica registerForRemoteNotifications: for UIApplication (iOS) ou a estratégia registerForRemoteNotificationTypes: da NSApplication (OS X).

O aplicativo executa o application:didRegisterForRemoteNotificationsWithDeviceToken: técnica para UIApplicationDelegate (iOS) ou NSApplicationDelegate (OS X) para obter o token de gadget único produzido pelo benefício push.

O aplicativo executa o application:didFailToRegisterForRemoteNotificationsWithError: técnica para UIApplicationDelegate (iOS) ou NSApplicationDelegate (OS X) para obter um erro se a inscrição fracassar.


Para iOS 10 usando o xCode 8 GM.

Resolvi meu problema com as seguintes etapas usando o xCode 8 GM para iOS 10:

1) Nos destinos, em Recursos, ative as Push Notifications para adicionar Direitos de Push Notifications.

2) Implemente UserNotifications.framework no seu aplicativo. Importe UserNotifications.framework no seu AppDelegate.

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

@end

3) No método didFinishLaunchingWithOptions, atribua UIUserNotificationSettings e implemente o delegado UNUserNotificationCenter .

#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) Agora, finalmente, implemente esses dois métodos de delegação.

// ============ Para 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);

}

Permaneça o código como você está usando no iOS 9, adicione apenas linhas de código para dar suporte à notificação por push do iOS 10 usando UserNotifications.framework.







ios10