2016-12-23 1 views
1

を実行:スウィフト - 私は通知を受け取ったときに、バックグラウンドでこのコードを実行しようとしているバックグラウンドタスク

window?.rootViewController?.dismissViewControllerAnimated(false, completion: nil) 
NSNotificationCenter.defaultCenter().postNotificationName("ResetStatusBar", object: nil) 

だから私はそうのようなdidReceiveRemoteNotificationにこのコードを配置した:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    print("Remote notification received in didReceiveRemoteNotification with fetchCompletionHandler") 

    // just pop to rootViewController 
    window?.rootViewController?.dismissViewControllerAnimated(false, completion: nil) 
    NSNotificationCenter.defaultCenter().postNotificationName("ResetStatusBar", object: nil) 
} 

このコードは、アプリがアクティブなときに通知を受け取ったとき、または受信した通知をユーザがクリックしたときに実行されますが、通知を受け取ったら無視してアプリを開きます(私は、ちょうどホームボタンを押して)、その変更はアプリに反映されていない結婚。

は、ここで私が現在やってる代以下のとおりです。

  • remote notificationsは、バックグラウンドモードのために機能の下で点検したプッシュ通知ペイロードに'content-available': 1を送信

これは私がどのようにもありますAppDelegateファイルにプッシュ通知を登録する:

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

私のコードが実行されていない理由は何ですか?それはUIの変更だからですか?

P.S.私はapsオブジェクト内content-availableキーを置くことで修正

let payload = { 
    default: notificationDisplayText, 
    APNS: { 
    aps: { 
     alert: notificationDisplayText, 
     sound: 'default', 
     badge: 1, 
     'content-available' : 1 
    }, 
    notificationId: notificationId 
    } 
} 

アム、または私はAPNSオブジェクト内で直接それを入れ子にする必要があります。ここに私のプッシュ通知ペイロードは次のようになりますか?

答えて

1

アプリの起動時に未処理の通知を処理する場合は、launchOptions辞書のSwift 3(UIApplicationLaunchOptionsRemoteNotificationKey、Swift 2.3)の.remoteNotificationキーを使用して、didFinishLaunchingWithOptionsで処理します。 the documentation for application(_:didReceiveRemoteNotification:)として

は言う:リモート通知が到着したときにアプリが実行されていない場合

、この方法は、アプリを起動し、起動オプション辞書に適切な情報を提供します。アプリケーションは、このメソッドを呼び出してそのリモート通知を処理しません。代わりに、application(_:willFinishLaunchingWithOptions:)またはapplication(_:didFinishLaunchingWithOptions:)メソッドの実装では、リモート通知ペイロードデータを取得し、適切に応答する必要があります。無関係


、あなたが通知を処理完了したらdidReceiveRemoteNotificationにあなたがcompletionHandlerを呼び出す必要があることを覚えておいてください。 the documentationとして

が言う(と強調元であった):

をするとすぐに通知の処理を完了として、あなたは必見コールハンドラのパラメータまたはあなたのアプリ内のブロックを終了します。あなたのアプリは通知を処理し、指定された完了ハンドラブロックを呼び出すために最大30秒の壁時計時間を持っています。実際には、通知の処理が終了するとすぐにハンドラブロックを呼び出す必要があります。システムは、アプリのバックグラウンドダウンロードの経過時間、電力使用量、データ費用を追跡します。リモート通知を処理する際に大量の電力を使用するアプリケーションは、将来の通知を処理するために早期に起動するとは限りません。

+0

ありがとうたくさんの男。だから要約すると、didReceiveRemoteNotificationは、アプリがバックグラウンドにある場合、正しいでしょうか?また、アプリが実行されていない、つまり中断されていない場合、通知はlaunchOptions辞書に追加されますか?最後にdidReceiveRemoteNotificationのcompletion handlerをcompletionHandler()と呼びますか?または、データを渡すはずですか? – Thomas

+1

ああ、私は.NewDataまたは.NoDataを渡します。 – Thomas

1

アプリデリゲートに2つの領域があります:あなたは、ユーザーがホームボタンを押した後、バックグラウンドの実行を継続するために何かをしたい場合は、場合に発生するために何かをしたい場合は

func applicationDidEnterBackground(_ application: UIApplication) { ...}

は...ユーザーは

...あなたは通知を送信または受信としてbackground..suchに起こるために何かをしたい場合ので、あなたはappDidEnterBackgroundを使用したいと思う func applicationDidBecomeActive(_ application: UIApplication) { ...}

...背中のアプリケーションに行きます

+0

appDidEnterBackgroundには何を配置しますか?私はdidReceiveRemoteNotificationが、通知がバックグラウンドで受信されたときに自動的に呼び出されると考えました。そうではありませんか? – Thomas

関連する問題