IOS11リリースでサイレントプッシュの問題が修正されることを期待していました。これは最新のベータ版であり、iOSのGMバージョン)でした。
現在、サイレントプッシュメッセージが受信されない理由を理解するのに苦労しています。これにより、アプリが実際にウェイクアップして、必要なタスクをバックグラウンドで実行する必要があります。
IOS 10では、バックグラウンドフェッチ機能を使用して、以下のコードのようにAppDelegateに「wake-up-code」を実装しました。
IOS 11では、登録コードは引き続き正常に機能しており、バックエンドはプッシュ通知をApple DEVサーバー(サンドボックス)とPRODサーバー(製品リリース)にも配信しています。残念ながら、関数func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
がサイレントプッシュ通知によって呼び出されることはありません。
私は実際にiOS11のためにここで何かを逃しましたか?
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
// .. some variables here ...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// register silent Push notification in backend
application.registerForRemoteNotifications()
// ... some code here ...
// Set Background Fetch Intervall for background services / terminated app
UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
// ... some code here ...
return true
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenParts = deviceToken.map { data -> String in
return String(format: "%02.2hhx", data)
}
let token = tokenParts.joined()
logger.log.debug("Device Token: \(token)")
let realm = RealmController()
let user = realm.getLoggedInUserObject()
// Send Push token to server
if let user = user {
let email = user.email!
let serverController = ServerController.serverController
serverController.sendPushToken(token: token, email: email) { status in
if status == 201 {
// ... some code here ...
} else {
// ... some code here ...
}
}
}
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
logger.log.debug(error)
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
logger.log.debug(userInfo)
let aps = userInfo["aps"] as! [String: AnyObject]
if aps["content-available"] as? Int == 1 {
// .... some silent Push tasks here ....
}
}
}
最終更新2017-10-31
AppleはiOS11.1の公式(ハロウィーン)リリースを発表しました
UPDATE 2017-10-09
Appleは本日iOS11.1ベータ2をリリースしました。再び彼らはリリースノートで次のノートに言及しました:
通知解決された問題
サイレントプッシュ通知はより頻繁に処理されます。 (33278611)
このベータ2バージョンを再度テストし、情報を得るためにこの回答を更新します。
UPDATE-テスト->さまざまなシナリオでいくつかのテストを行った後、このバグは最新のiOS11.1ベータ2バージョン内で修正されたようです。今では公式リリースを待つしかありません。一部のフォーラムでは、Appleが10月下旬にiOS11.1をリリースすると想定しています。
古い投稿
私は先週、この問題に関する答えを探すために多くの時間を調査しました。 Appleリリースノート(非推奨、変更、および新機能を含む)を読んだ後、次の状況をテストしました。
空の関数をAppDelegate
に追加しました。これで、サイレントプッシュがフォアグラウンドとバックグラウンドの両方で再び機能します:
_func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
logger.log.debug("Perform Fetch with completion handler TEST")
}
_
この「回避策」が問題に関連しているかどうか、次のfunction application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
がiOS11で呼び出されていないかどうかはわかりません。
それでも、同じ動作を特定した場合は、試してフィードバックを送ってください。
UPDATE 2017-09-25
私の場合、「サイレントプッシュ」はフォアグラウンドモードとバックグラウンドモードで機能するようになりましたが、アプリがユーザーまたはOSから一時停止されている場合は機能しません。したがって、この問題はまだ開いており、修正されていません-助けていただければ幸いです!詳細については、次のスレッドも参照してください。 iOS 11のアプリにサイレントプッシュが配信されない
UPDATE 2017-10-05
Appleは数日前にiOS11.1ベータ版をリリースしました。彼らはリリースノートで次のように述べています。
通知解決された問題
サイレントプッシュ通知はより頻繁に処理されます。 (33278611)
このベータ版で問題が修正されたと言う開発者もいれば、状況によっては問題がまだ残っていると言う開発者もいます。これで、Appleが顧客向けにiOS11.1をリリースするときに興味深いでしょう。
実際に経験するのは、バグではなく、十分に文書化された動作です。
Appleのドキュメント は次のように述べています:「システムはサイレント通知を優先度の低いものとして扱います。これらを使用してアプリのコンテンツを更新できますが、システムはそれらの配信を保証しません。さらに、サイレント通知の配信総数が過剰になると、抑制される可能性があります。システムで許可されるサイレント通知の実際の数は、現在の状況によって異なりますが、1時間に2つまたは3つを超えるサイレント通知を送信しようとしないでください。」
要約すると、サイレント通知がアプリをウェイクアップすることは保証されていません。どうして?ユーザーのデバイスのバックグラウンドにあるアプリが起動される頻度が高いほど、バッテリーの消費量が多くなります。
IBMの声明によると、「iOS 11の登場により、Appleは、特定の種類のプッシュメッセージの処理方法に変更を加えました。これは、バッテリー寿命を改善するために行われましたが、アプリに影響を与える可能性のあるユーザーエクスペリエンスのコスト。」詳細については、 こちら をご覧ください。