Swift 2.2で作成され、Xcode 7.3でコンパイルされ、App Storeで公開されているアプリがいくつかあります。アプリはプッシュ通知を利用し、iOS 9.3以前では正常に機能しています。
ただし、iOS 10にアップグレードされたデバイスでは、アプリはプッシュ通知を受信しません。まだiOS 9を実行しているデバイスはまだ通知を受信しています。
証明書または資格の問題である可能性があると考えて、次のことを試しました:私のアプリの1つを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が呼び出されないことです。
現在、 here UIApplicationDelegateのメソッドはiOS 10で非推奨になっていると言われているため、userNotificationCenter(:didReceive:withCompletionHandler :)およびuserNotificationCenter(を実装する必要があります:willPresent:withCompletionHandler :)
問題は、iOS 10のみを対象にしていないことです。iOS8および9で動作するアプリが引き続き必要なので、これらのメソッドを実装するための正しいアプローチであるとは思いません。
IOS 10にアップグレードされたデバイスで引き続き動作するように、既存のアプリのプッシュ通知を取得するにはどうすればよいですか?コードを書き直す必要がありますか?いくつかの証明書または資格を更新し、Xcode 8でいくつかの「新しい」設定で再コンパイルする必要がありますか?
わかりました。 Xcode 8とSwift 2.3を搭載したiOS 10で動作するiOS 9で動作していたオリジナルのプッシュ通知ができました。
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用の2つの新しいメソッドを実装します。
@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のプッシュ通知用に以前に実装したメソッドは削除しませんでした。
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)
}
IOS 9とiOS 10のプッシュ通知に関する質問に対するさまざまなSO応答で、次のテストを試しました。
1)通知呼び出しを更新して、iOS 10デバイス用にUNUserNotificationCenterを具体的に使用する
2)資格ファイルが更新されるようにプッシュ機能を更新します
#2を実行し、既存のすべてのiOS 9プッシュコードを同じに保つことで、iOS 10デバイスで基本的なプッシュ通知が送信されることを確認できます
アプリを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 });
また、content-availableはbadge、sound、またはalertと同じプッシュ通知に表示できないことに注意してください。