web-dev-qa-db-fra.com

La récupération d'arrière-plan iOS ne fonctionne pas même si le mode d'arrière-plan correct est configuré

Mon application dispose de modes d'arrière-plan activés avec la récupération d'arrière-plan cochée et j'ai validé que le plist inclut le mode d'extraction approprié.

J'ai également configuré l'intervalle comme suit:

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

Et j'ai ajouté le gestionnaire comme suit:

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

J'ai essayé d'aller dans Debug-> Simulate Background Fetch, mais peu importe ce qu'il n'entre jamais dans le performFetchWithCompletionHandler. J'ai également essayé d'exécuter l'application sous un schéma dont l'option "Lancer en raison d'un événement d'extraction en arrière-plan" est cochée. L'exécution sous ce schéma lance simplement l'application comme d'habitude dans le simulateur sans appel à performFetchWithCompletionHandler.

Des idées?

Je vous remercie!

EDIT: Cela semble également affecter la version finale de mon application, il est donc possible qu'elle ne soit pas isolée du simulateur. Je lance Swift 1.2.

EDIT 2: Mon rapport de bogue vient d'être fermé car il s'agit d'un doublon d'un autre rapport de bogue décrivant le même problème. Il n'y a toujours aucune information confirmant que le problème est isolé du simulateur.

EDIT 3: Aucune mention d'un correctif dans les notes de publication de Xcode 6.4 Beta 2. :-(

32
a432511

Voici le seul moyen que j'ai trouvé pour tester la récupération en arrière-plan.

  1. Modifiez votre schéma
  2. Sélectionnez Exécuter
  3. Sélectionnez les options
  4. Cochez l'option "Lancer en raison d'un événement d'extraction en arrière-plan"
  5. Branchez votre appareil iOS et exécutez l'application dessus. Cela ne fonctionne pas dans le simulateur iOS.

Visual of Step 2-4

28
Tobias

Jetez un œil sur la note de publication de XCode: https://developer.Apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html

"La commande de menu Xcode Simulator Background Fetch ne fonctionne pas.

Utilisez plutôt la commande de menu dans iOS Simulator. (20145602) "

3
odemolliens

Vous pouvez créer votre propre notification push de récupération d'arrière-plan sur votre appareil réel via Houston

  1. installez Houston: ouvrez l'application Terminal et utilisez Sudo gem install houston
  2. créer un certificat PEM pour votre application Générer un fichier .pem utilisé pour configurer Apple Push Notification
  3. Obtenez votre jeton d'appareil

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

  1. exécuter Terminal et utiliser

pour la notification Push habituelle: apn Push "<your_device_token>" -c /path/to/Apple_Push_notification.pem -m "Hello from the command line!"

pour la notification de récupération en arrière-plan: apn Push "<your_device_token>" -c /path/to/Apple_Push_notification.pem -n

Plus d'options pour l'application 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
Vitaliy Gozhenko

Dans Xcode 8.3.2 ce problème n'existe pas. Debug-> Simulate Background Fetch fait son travail. Cela fonctionne même sur un simulateur.

2
Artem Stepanenko

Cette méthode est appelée.

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

}

vous avez oublié d'écrire @escaping après l'achèvementHandler

2
New To iOS Dev