Push Notifications not being received on iOS 10, but working on iOS 9 and before
Ok I have figured it out. I now have my original Push Notifications that was working on iOS 9 working on iOS 10 with Xcode 8 and Swift 2.3.
I implemented this by making the following changes to my AppDelegate:
1) On my project settings, under the Capabilities Tab, I scroll down to "Push Notifications" and turn it to "ON". This automatically generates an entitlements file that contains the key "APS Environment" and with value "development".
2) In AppDelegate.swift I make several code changes. I start by importing the UserNotifications framework:
import UserNotifications
Then I have AppDelegate implement the UNUserNotificationCenterDelegate protocol:
class AppDelegate: /*Some other protocols I am extending...*/, UNUserNotificationCenterDelegate {
Then I add the following method:
func registerForPushNotifications(application: UIApplication) { if #available(iOS 10.0, *){ UNUserNotificationCenter.currentNotificationCenter().delegate = self UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert], completionHandler: {(granted, error) in if (granted) { UIApplication.sharedApplication().registerForRemoteNotifications() } else{ //Do stuff if unsuccessful... } }) } else{ //If user is not on iOS 10 use the old methods we've been using let notificationSettings = UIUserNotificationSettings( forTypes: [.Badge, .Sound, .Alert], categories: nil) application.registerUserNotificationSettings(notificationSettings) }}
Then I call this newly created function inside didFinishLaunchingWithOptions:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {... registerForPushNotifications(application)...}
I leave my didRegisterForRemoteNotificationsWithDeviceToken method unchanged:
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { //Implement this. Do something with the token I receive. Send it to my push notification server to register the device or something else I'd like to do with the token. }
Now I implement two new methods for iOS 10 to handle the receiving of Push Notifications:
@available(iOS 10.0, *)func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { //Handle the notification}@available(iOS 10.0, *)func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) { //Handle the notification}
I did not remove any of the methods I have previously implemented for Push Notifications in iOS 9.
IOS 10 has a different Notification kit.
import UserNotificationsfunc application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.badge, .alert , .sound]) { (granted, error) in if granted { UIApplication.shared.registerForRemoteNotifications() } } } else { let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound] let setting = UIUserNotificationSettings(types: type, categories: nil) UIApplication.shared.registerUserNotificationSettings(setting) UIApplication.shared.registerForRemoteNotifications() }}func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){ let token = String(format: "%@", deviceToken as CVarArg)}