it-swarm.dev

在iOS 10上未收到推送通知,但在iOS 9及更高版本上可以使用

我有几个用Swift 2.2编写的应用程序,它们是用Xcode 7.3编译的,并且可以在App Store上使用。这些应用程序利用推送通知,并且在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)

由于应用程序didRegisterForRemoteNotificationsWithDeviceToken随后被调用,因此该注册似乎在iOS 10上也成功,因此我正在从APNS接收令牌。

问题是当我向该设备发送推送通知时,永远不会调用Application didReceiveRemoteNotification

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

问题是我不仅仅针对iOS10。我仍然需要该应用程序才能在iOS 8和9上运行,因此我怀疑这是实现这些方法的正确方法。

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

30
Stanley

好吧,我知道了。现在,我有了原始的推送通知,该通知在iOS 9上可以使用Xcode 8和Swift 2.3来运行。

我通过对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中为推送通知实现的任何方法。

52
Stanley

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)
}
9
ilan

我使用以下步骤解决了此问题:

第1步:转到项目->目标->功能->推送通知->将其打开

enter image description here 步骤2:修复与正确的证书,配置文件有关的问题

步骤3:退出Xcode,清理并运行

8
Dheeraj D

在各种有关iOS 9与iOS 10推送通知的问题的SO响应中,我尝试了以下测试:

1)更新通知呼叫以专门使用iOS 10设备的UNUserNotificationCenter

2)更新推送功能,以便更新权利文件

我可以确认执行#2并保持所有现有的iOS 9 Push代码相同将允许基本的Push通知在iOS 10设备上通过

2
kevinl

当我的应用程序从IOS 9移至IOS 10时,该应用程序不再接收由托管在Heroku上的我的Parse服务器发送的静默Push通知。

我使通知再次起作用的唯一更改是修改服务器上的Javascript,以便content-available的参数为整数1而不是字符串“ 1”

           Parse.Push.send({
                where: notifyDeletedRequestsQuery,
                data: {
                    'content-available': 1,
                    refresh: constants.requestsClassName
                    }
            }, { useMasterKey: true });

另请注意,可用内容不能与徽章,声音或警报出现在同一Push通知中。

0
BrianM