我有几个用Swift 2.2编写的应用程序,使用Xcode 7.3编译并在App Store上运行。这些应用程序使用Push Notifications,在iOS 9.3及更早版本中运行良好。
但是,在已升级到iOS 10的设备上,我的应用不会收到任何推送通知。仍在运行iOS 9的设备仍在接收通知。
认为它可能是证书或权利问题,我尝试了以下方法: 将我的一个应用程序升级到Swift 2.3,添加了APS环境权利并在Xcode 8中进行了编译,但这没有任何区别。
在我的AppDelegate中,我仍然有现有方法来注册推送通知,其中包括:
let notificationSettings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories:nil)
application.registerUserNotificationSettings(notificationSettings)
即使在iOS 10上,这个注册似乎也很成功,因为 Application didRegisterForRemoteNotificationsWithDeviceToken 随后被调用,所以我从APNS收到一个令牌。
问题在于,当我向此设备发送推送通知时,永远不会调用应用程序didReceiveRemoteNotification 。
现在,here据说UIApplicationDelegate上的方法在iOS 10上已弃用,我应该实现userNotificationCenter(:didReceive:withCompletionHandler :)和userNotificationCenter(:willPresent:withCompletionHandler: )
问题是我不仅仅针对iOS 10.我仍然需要该应用程序才能在iOS 8和9上运行,所以我怀疑它是实现这些方法的正确方法。
如何获取现有应用的推送通知以继续处理已升级到iOS 10的设备?我需要重写代码吗?我只需要更新一些证书或权利,并在Xcode 8中重新编译一些" new"设置?
答案 0 :(得分:52)
好的,我已经弄清楚了。我现在有了我的原始推送通知,它正在iOS 9上运行,在iOS 10上使用Xcode 8和Swift 2.3。
我通过对AppDelegate进行以下更改来实现此目的:
1)在我的项目设置中,在Capabilities选项卡下,我向下滚动到“推送通知”并将其转为“ON”。这会自动生成一个权利文件,其中包含密钥“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中推送通知实现的任何方法。
答案 1 :(得分:9)
IOS 10有一个不同的通知工具包。
import UserNotifications
func 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)
}
答案 2 :(得分:8)
我已使用以下步骤解决了此问题:
第1步:转到项目 - >目标 - >能力 - >推送通知 - >打开它
第3步:退出Xcode,清理并运行
答案 3 :(得分:2)
在针对iOS 9与iOS 10推送通知的问题的各种SO回复中,我尝试了以下测试:
1)更新通知调用以专门使用UNUserNotificationCenter for iOS 10设备
2)更新推送功能,以便更新权利文件
我可以确认,执行#2并保持所有现有的iOS 9推送代码相同将允许iOS 10设备上的基本推送通知
答案 4 :(得分:0)
当我的应用程序从IOS 9移动到IOS 10时,由Heroku托管的Parse服务器发送的静默推送通知停止被应用程序接收。
我为使通知再次工作所做的唯一更改是修改我服务器上的Javascript,以便 content-available 的参数是整数1而不是字符串“1”
Parse.Push.send({
where: notifyDeletedRequestsQuery,
data: {
'content-available': 1,
refresh: constants.requestsClassName
}
}, { useMasterKey: true });
另请注意,内容可用不会出现在与徽章,声音或提醒相同的推送通知中。