2016-05-11 4 views
2

プッシュ通知を受け取るアプリを開発しています。状況によってはバックグラウンドフェッチ操作が発生することがあります。したがって、私はremote-notification私のアプリのバックグラウンド機能を有効にしました。アプリが実行されていないときにプッシュ通知が表示されなくなると消えます

アプリが停止すると、プッシュ通知によってアプリが起動してapplication:didReceiveRemoteNotification:fetchCompletionHandlerが実行され、ホームスクリーンにバナーが表示され、通知をタップしてアプリを起動するまで通知が通知センターに残ります。それは正確に動作するはずです。

アプリが実行されていないときは、ユーザーが強制終了しない限り(apple's documentationを参照)、アプリはapplication:didFinishLaunchingWithOptionsapplication:didReceiveRemoteNotification:fetchCompletionHandlerを実行します。ホームスクリーン上にバナーが表示されますが、通知は消えます。それは通知センターに残っていません。さらに、デバイスがロックされていると、警告音が鳴り終わる前に通知が消えることがあります。

興味深いことに、リモート通知バックグラウンドモードを無効にすると、すべて正常に動作します。その状況では、プッシュ通知が到着したときにアプリが起動されません。

リモート通知バックグラウンドモードがオンで、着信通知が実行されていないアプリを起動すると、通知が消えないようにするにはどうすればよいですか?アプリがバックグラウンドで起動されていることを通知する何かをapplication:didFinishLaunchingWithOptionsに含める必要があります。通知を破棄しないでください。

+0

'application:didReceiveRemoteNotification:fetchCompletionHandler:'メソッドで補完ハンドラを正しく呼び出していますか? – rmaddy

+0

はい、そうではありませんでした。私は実際に問題を理解しました。私は時間があるとすぐに回答を掲示します。基本的に、私の 'application:didFinishLaunchingWithOptions'には私が使っているSDK(Kinvey)を使ってプッシュを登録する行がありました。私は何が起こるか正確にはわからないが、それが呼び出されると、アプリはプッシュのために再登録するように見え、それは入ってくるプッシュを破棄する。だから私は、アプリがバックグラウンドで起動され、それを解決したときにそれを避けるためにいくつかの行を書きました。 – ConfusedByCode

答えて

3

アプリがバックグラウンドで起動され、application:didFinishLaunchingWithOptions:リモート通知のために再登録されたため、プッシュ通知が消えていたようです。再登録すると、キューに入れられたメッセージは破棄されたように見えます。

私の解決方法は、プッシュ通知のためにプッシュ登録メソッドを呼び出す前にアプリがバックグラウンドで起動されているかどうかを確認することでした。私はKinvey SDKを使用していますので、次のコードではKinveyのメソッドを使用していますが、このソリューションは標準UIApplication.registerForRemoteNotificationsを含む他のプッシュ登録メソッドにも当てはまるでしょう。

私の問題を引き起こしていたコードはでした:アプリは、着信プッシュ通知によって背景に起動される今

func application(application: UIApplication, 
    didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
{ 
    // Initialize Kinvey SDK singleton 
    KCSClient.sharedClient().initializeKinveyServiceForAppKey("myappid", 
     withAppSecret: "mysecret", 
     usingOptions: nil) 

    if let _ = 
     launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary { 

     let appState: UIApplicationState = UIApplication.sharedApplication().applicationState 

     if appState == .Active || appState == .Inactive { 
      KCSPush.registerForPush() 
     } 
    } else { 
     KCSPush.registerForPush() 
    } 
    // rest of method... 
} 

func application(application: UIApplication, 
    didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
{ 
    // Initialize Kinvey SDK singleton 
    KCSClient.sharedClient().initializeKinveyServiceForAppKey("myappid", 
     withAppSecret: "mysecret", 
     usingOptions: nil) 

    KCSPush.registerForPush() 
    // rest of method... 
} 

は、私はそれを変更することで問題を解決しましたそれはプッシュのために再登録されず、ユーザがタップするか、手動でアプリを起動するまで、通知はiOS通知センターにとどまります。

+0

ああ、ありがとうございました。これと永遠に闘ってきた – irosenb

関連する問題