在iOS 10上未收到推送通知,但在iOS 9及更早版本上工作 [英] Push Notifications not being received on iOS 10, but working on iOS 9 and before

查看:137
本文介绍了在iOS 10上未收到推送通知,但在iOS 9及更早版本上工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个用Swift 2.2编写的应用程序,使用Xcode 7.3编译并在App Store上运行。这些应用程序使用Push Notifications,在iOS 9.3及更早版本中运行良好。

I have several apps that were written in Swift 2.2, compiled with Xcode 7.3 and is live on the App Store. The apps utilize Push Notifications and is working fine in iOS 9.3 and earlier.

在已升级到iOS 10的设备上,我的应用程序没有收到任何推送通知。仍在运行iOS 9的设备仍在接收通知。

On devices that have been upgraded to iOS 10, however, my apps don't receive any Push Notifications. Devices that are still running iOS 9 are still receiving notifications.

认为它可能是证书或授权问题,我尝试过以下操作:
升级其中一个我的应用程序到Swift 2.3,添加了APS环境权利并在Xcode 8中编译了它但没有区别。

Thinking it might be a certificate or entitlement issue, I have tried the following: Upgraded one of my apps to Swift 2.3, added the APS Environment Entitlement and compiled it in Xcode 8 but this made no difference.

在我的AppDelegate中,我仍然有现有的注册方法推送通知,包括:

In my AppDelegate I still have the existing methods to register for push notifications that includes:

let notificationSettings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories:nil)
application.registerUserNotificationSettings(notificationSettings)

即使在iOS 10上,此注册似乎也很成功因为应用程序didRegisterForRemoteNotificationsWithDeviceToken 然后被调用,所以我从APNS收到一个令牌。

This registration seems to be successful even on iOS 10 since Application didRegisterForRemoteNotificationsWithDeviceToken is then called, so I am receiving a token from APNS.

问题是当我向此发送推送通知时设备,应用程序didReceiveRemoteNotification 永远不会叫。

The problem is that when I send a push notification to this device, Application didReceiveRemoteNotification is never called.

现在,这里说UIApplicationDelegate上的方法在iOS 10上已弃用,我应该实现userNotificationCenter(:didReceive:withCompletionHandler :)和userNotificationCenter(:willPresent:withCompletionHandler :)。

Now, here it is said that the methods on UIApplicationDelegate is deprecated on iOS 10 and I should implement userNotificationCenter(:didReceive:withCompletionHandler:) and userNotificationCenter(:willPresent:withCompletionHandler:)

问题是我不只是针对iOS 10.我仍然需要应用程序才能在iOS 8和9上运行,所以我怀疑这是实现这些方法的正确方法。

The problem is that I am not ONLY targeting iOS 10. I still need the app to work on iOS 8 and 9 so I doubt that it's the correct approach to implement those methods.

如何获取现有应用的推送通知以继续使用已升级到iOS 10的设备?我需要重写代码吗?我是否只需要更新一些证书或权利,并使用一些新设置重新编译Xcode 8?

How do I get push notifications for an existing app to continue working on devices that have been upgraded to iOS 10? Do I need to rewrite code? Do I just need to update some certificates or entitlements and recompile in Xcode 8 with some "new" settings?

推荐答案

好的我有弄清楚了。我现在有了原始的Push Notifications,它正在iOS 9上运行,使用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选项卡下,我向下滚动到推送通知并将其转为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.

这篇关于在iOS 10上未收到推送通知,但在iOS 9及更早版本上工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆