56

I've developed one application in that i've implemented push notification. Currently it's live on apple store. Upto iOS 9 push is working fine but after iOS 10 it is not working.

What is the issue with the code?

sashoalm
  • 75,001
  • 122
  • 434
  • 781
Mohsin Sabasara
  • 701
  • 1
  • 7
  • 13

6 Answers6

117

For iOS 10 using xCode 8 GM.

I have resolved my issue with following steps using xCode 8 GM for iOS 10:

1) In the targets, under Capabilities enable Push Notifications to add Push Notifications Entitlements.

2) Implement UserNotifications.framework into your app. Import UserNotifications.framework in your AppDelegate.

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

@end

3) In didFinishLaunchingWithOptions method assign UIUserNotificationSettings and implement UNUserNotificationCenter delegate.

#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) Now finally implement this two delegate methods.

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

}

Please remain the code as it is you are using for iOS 9, Only add lines of code to support Push notification for iOS 10 using UserNotifications.framework.

Ashish Shah
  • 2,361
  • 1
  • 20
  • 20
  • I did the same but not able to receive notification when app was terminated – Himanth Sep 21 '16 at 06:28
  • 3
    -willPresentNotification == called when app is foreground and push comes, it can be used to configure to show or not to show incomed push -didReceiveNotificationResponse == called when notification opened from notification centre – Mr.Fingers Sep 23 '16 at 11:09
  • If you would only like to do bare minimum, you just have to call `[UNUserNotificationCentre requestAuthorizationWithOptions]`. Linking to `UserNotification.framework` and `UNUserNotificationCenterDelegate` are for implementing the new iOS 10 interactive push notifications. – Alex Napitupulu Oct 10 '16 at 13:38
  • In my case, I only needed to do step #1. None of the others, including `[UNUserNotificationCentre requestAuthorizationWithOptions]`, was required and push continued to work as before. – Lane Rettig Oct 12 '16 at 23:29
  • 1
    Hi @Ashish, i have implement above framework and code, but ios 10 not receive the notification why i don't know please help me. – Iyyappan Ravi Nov 03 '16 at 07:18
  • i want to store pay load into core data, when application in background, i did this iOS 9 and previous but iOS 10 does not working with above delegates, its only call when user taps..any idea to save push notification while in app background – karthikeyan Nov 04 '16 at 04:52
  • have you found the apple documentation related to this? – TharakaNirmana Nov 18 '16 at 06:55
  • You don't need Step 4 (conform to `UNUserNotificationCenterDelegate`) if you don't set the `delegate` property on `UNUserNotificationCenter`. It will continue behaving like iOS 9 in that case and the `UIApplicationDelegate` methods will be called (`application:didReceiveRemoteNotification:` and so on). – leolobato Nov 22 '16 at 16:41
  • 2
    Why don't you check granted? In case of (granted == NO) callback sends nil for the error. It means user is not registered. – dollar2048 Dec 18 '17 at 11:21
  • @AlexNapitupulu could you please tell which method will execute when the app is in background and receives a notificaation? – ArgaPK Apr 18 '18 at 12:57
23

Everything was working fine before iOS 10, In my case only capabilities settings cause this issue.

It must be turned on for push notification.

enter image description here

AiOsN
  • 2,305
  • 2
  • 23
  • 29
  • 1
    I fixed it by clicking "Fix me" button in the Push notifications section. The issue was missing entitlement for push notification – samir105 Oct 03 '16 at 19:03
  • everybody loves an answer where all you have to do is click a button :D – mfaani Feb 20 '17 at 22:04
  • @Honey could you please tell me which method gets executed when the app is in background and receive user notification? – ArgaPK Apr 18 '18 at 12:58
  • @ArgaPK see [this answer](https://stackoverflow.com/a/44705892/5175709) – mfaani Apr 18 '18 at 21:05
19

I had an issue with iOS 10 silent push notifications. In iOS9 and earlier, sending a push notification that had additional data fields but had an empty aps attribute in the data worked fine. But in iOS10 a push notification with an empty aps attribute does not hit the didReceiveRemoteNotification app delegate method at all, meaning that all my silent push notifications (notifications that we just use internally to trigger actions while the app is open) stopped working in iOS10.

I was able to fix this without pushing an update to my app by adding at least one attribute to the aps part of the push notification, in my case I just added badge: 0 and my silent push notifications started working again in iOS 10. I hope this helps someone else!

jakedunc
  • 984
  • 9
  • 20
  • aps = { badge = 7; "content-available" = 1; priority = 5; }; – Mohsin Sabasara Oct 06 '16 at 06:35
  • 1
    I was having the exact same issue. It helped me @jakedunc, thank you for sharing this. – Murat Yasar Oct 08 '16 at 22:18
  • Same issue. It seems like iOS 10 is a bit more strict about what it allows through. – Eagle11 Oct 20 '16 at 13:46
  • Be aware that by using `priority` 5 may lead to pushes not showing up at all, as it can be seen in the documentation: ["They are throttled, and in some cases are not delivered."](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW13)! – Iulian Onofrei Dec 15 '16 at 11:15
  • @jakedunc. aps attribute is from server side or we can it. – Uma Madhavi Dec 23 '16 at 13:27
7

The swift 3 version of @Ashish Shah code is:

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

    }
Lucho
  • 1,024
  • 1
  • 15
  • 24
0

Don't forget, when testing, you must use sandbox address for your notifications to work.

Ashkan Ghodrat
  • 3,162
  • 2
  • 32
  • 36
  • Can you please explain this? – Boris Nikolic Feb 22 '17 at 12:36
  • 1
    In my case what happened was that when updating from ios 9 to 10, my application server was sending the notification to production server where i was in development phase, so changing it back to development sandbox address fixed the issue – Ashkan Ghodrat Feb 22 '17 at 12:49
-1

On iOS, the application approaches the client for authorization to get push warnings by calling the registerUserNotificationSettings: strategy for UIApplication.

The application calls the registerForRemoteNotifications: technique for UIApplication (iOS) or the strategy registerForRemoteNotificationTypes: of NSApplication (OS X).

The application executes the application:didRegisterForRemoteNotificationsWithDeviceToken: technique for UIApplicationDelegate (iOS) or NSApplicationDelegate (OS X) to get the one of a kind gadget token produced by the push benefit.

The application executes the application:didFailToRegisterForRemoteNotificationsWithError: technique for UIApplicationDelegate (iOS) or NSApplicationDelegate (OS X) to get a blunder if the enrolment fizzled.

Bista
  • 7,869
  • 3
  • 27
  • 55
  • Welcome to Stack Overflow! Please note that [overt self-promotion is not allowed](https://stackoverflow.com/help/behavior). I have edited out the link to your site. It _is_ allowed to link one's own site on one's user page. It will not be indexed by search engines until you have earned a minimum amount of points, however, to prevent abuse. – S.L. Barth is on codidact.com Oct 28 '16 at 12:39