web-dev-qa-db-ja.com

正しいバックグラウンドモードが設定されていてもiOSバックグラウンドフェッチが機能しない

私のアプリでは、バックグラウンドフェッチをオンにしてバックグラウンドモードを有効にしており、plistに適切なフェッチモードが含まれていることを検証しました。

また、間隔を次のように構成しました。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum);
    return true;
}

そして、次のようにハンドラーを追加しました。

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    // Get some new data here
    completionHandler(UIBackgroundFetchResult.NewData);
}

[デバッグ]-> [バックグラウンドフェッチのシミュレーション]を試してみましたが、performFetchWithCompletionHandlerに何も入力されていません。また、「バックグラウンドフェッチイベントによる起動」オプションがオンになっているスキームでアプリを実行しようとしました。このスキームで実行すると、performFetchWithCompletionHandlerを呼び出さずに、シミュレータで通常どおりアプリケーションが起動されます。

何か案は?

ありがとうございました!

編集:これは、アプリのリリースバージョンにも影響を与えているように見えるため、シミュレータから隔離されない可能性があります。私はSwift 1.2。

編集2:私のバグレポートは、同じ問題の概要を説明する別のバグレポートの複製であるため、閉じられました。問題がシミュレータに分離されていることを確認する情報はまだありません。

編集3: Xcode 6.4 Beta 2リリースノートには修正の記載はありません。 :-(

32
a432511

これが、バックグラウンドフェッチをテストするために見つけた唯一の方法です。

  1. スキームを編集する
  2. 実行を選択
  3. オプションを選択
  4. [バックグラウンドフェッチイベントによる起動]オプションをオンにします
  5. IOSデバイスをプラグインして、アプリケーションを実行します。 iOSシミュレーターでは機能しません。

Visual of Step 2-4

28
Tobias

XCodeリリースノートをご覧ください。 https://developer.Apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html

「Xcodeメニューコマンドシミュレータバックグラウンドフェッチが機能しません。

代わりに、iOSシミュレータのメニューコマンドを使用してください。 (20145602)」

3
odemolliens

Houston を使用して、実際のデバイスに独自のバックグラウンドフェッチプッシュ通知を作成できます。

  1. ヒューストンのインストール:ターミナルアプリを開き、_Sudo gem install houston_を使用します
  2. アプリのPEM証明書を作成します セットアップに使用する.pemファイルを生成Appleプッシュ通知
  3. からデバイストークンを取得する

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)

  1. ターミナルを実行して使用する

通常のプッシュ通知の場合:_apn Push "<your_device_token>" -c /path/to/Apple_Push_notification.pem -m "Hello from the command line!"_

バックグラウンドフェッチプッシュ通知の場合:_apn Push "<your_device_token>" -c /path/to/Apple_Push_notification.pem -n_

apnアプリのその他のオプション:

_  c.option '-m', '--alert ALERT', 'Body of the alert to send in the Push notification'
  c.option '-b', '--badge NUMBER', 'Badge number to set with the Push notification'
  c.option '-s', '--sound SOUND', 'Sound to play with the notification'
  c.option '-y', '--category CATEGORY', 'Category of notification'
  c.option '-n', '--[no]-newsstand', 'Indicates content available for Newsstand'
  c.option '-d', '--data KEY=VALUE', Array, 'Passes custom data to payload (as comma-delimited "key=value" declarations)'
  c.option '-P', '--payload PAYLOAD', 'JSON payload for notifications'
  c.option '-e', '--environment ENV', [:production, :development], 'Environment to send Push notification (production or development (default))'
  c.option '-c', '--certificate CERTIFICATE', 'Path to certificate (.pem) file'
  c.option '-p', '--[no]-passphrase', 'Prompt for a certificate passphrase'
_
2

Xcode 8.3.2では、この問題は存在しません。 デバッグ->バックグラウンドフェッチのシミュレーションは、その仕事をします。シミュレーターでも動作します。

2

このメソッドが呼び出されます。

 func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

}

completionHandlerの後に@escapingを書くのを忘れた

2
New To iOS Dev