我有几个用Swift 2.2编写,用Xcode 7.3编译的应用程序,这些应用程序在App Store上实时运行。这些应用程序利用推送通知,并且在iOS 9.3和更早版本中可以正常运行。
但是,在已升级到iOS 10的设备上,我的应用程序未收到任何推送通知。仍在运行iOS 9的设备仍在接收通知。
考虑到可能是证书或权利问题,我尝试了以下操作:将我的一个应用程序升级到Swift 2.3,添加了APS Environment Entitlement并在Xcode 8中进行了编译,但这没有什么区别。
在我的AppDelegate中,我仍然具有注册推送通知的现有方法,包括:
let notificationSettings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories:nil) application.registerUserNotificationSettings(notificationSettings)
即使在iOS 10上,此注册似乎也成功,因为随后调用了 Application didRegisterForRemoteNotificationsWithDeviceToken ,因此我正在从APNS接收令牌。
问题是,当我向该设备发送推送通知时,永远不会调用 Application didReceiveRemoteNotification 。
现在,这里说UIApplicationDelegate上的方法在iOS 10上已过时,我应该实现userNotificationCenter( :didReceive : withCompletionHandler :)和userNotificationCenter( :willPresent: withCompletionHandler :)
问题是我不仅仅针对iOS10。我仍然需要该应用程序才能在iOS 8和9上运行,因此我怀疑这是实现这些方法的正确方法。
如何获取现有应用程序的推送通知,以继续在已升级到iOS 10的设备上工作?我需要重写代码吗?我是否只需要更新某些证书或权利并使用一些“新”设置在Xcode 8中重新编译?
好的,我知道了。我现在有原始的推送通知,该通知在iOS 9上运行,并且在Xcode 8和Swift 2.3的iOS 10上运行。
我通过对AppDelegate进行以下更改来实现此目的:
1)在我的项目设置中,在“功能”选项卡下,向下滚动到“推送通知”,然后将其打开为“开”。这将自动生成一个授权文件,该文件包含键“ APS Environment”和值为“ development”。
2)在AppDelegate.swift中,我进行了一些代码更改。我首先导入UserNotifications框架:
import UserNotifications
然后,我让AppDelegate实现UNUserNotificationCenterDelegate协议:
class AppDelegate: /*Some other protocols I am extending...*/, UNUserNotificationCenterDelegate {
然后添加以下方法:
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) } }
然后,在didFinishLaunchingWithOptions内部调用此新创建的函数:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { ... registerForPushNotifications(application) ... }
我将我的didRegisterForRemoteNotificationsWithDeviceToken方法保持不变:
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. }
现在,我为iOS 10实现了两种新方法来处理推送通知的接收:
@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 }
我没有删除以前在iOS 9中为推送通知实现的任何方法。