更新时间:2023-12-04 15:55:22
好的,我想通了.我现在拥有在 iOS 9 上运行的原始推送通知,在 iOS 10 上使用 Xcode 8 和 Swift 2.3.
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.
我通过对 AppDelegate 进行以下更改来实现此目的:
I implemented this by making the following changes to my AppDelegate:
1) 在我的项目设置中,在 Capabilities 选项卡下,我向下滚动到Push Notifications"并将其设为ON".这会自动生成一个包含密钥APS Environment"和值为development"的权利文件.
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) 在 AppDelegate.swift 中,我进行了几处代码更改.我首先导入 UserNotifications 框架:
2) In AppDelegate.swift I make several code changes. I start by importing the UserNotifications framework:
import UserNotifications
然后我让 AppDelegate 实现了 UNUserNotificationCenterDelegate 协议:
Then I have AppDelegate implement the UNUserNotificationCenterDelegate protocol:
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 中调用这个新创建的函数:
Then I call this newly created function inside didFinishLaunchingWithOptions:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
registerForPushNotifications(application)
...
}
我保持我的 didRegisterForRemoteNotificationsWithDeviceToken 方法不变:
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.
}
现在我为 iOS 10 实现了两种新方法来处理推送通知的接收:
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
}
我没有删除我之前在 iOS 9 中为推送通知实现的任何方法.
I did not remove any of the methods I have previously implemented for Push Notifications in iOS 9.