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. :-(
Voici le seul moyen que j'ai trouvé pour tester la récupération en arrière-plan.
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) "
Vous pouvez créer votre propre notification push de récupération d'arrière-plan sur votre appareil réel via Houston
Sudo gem install houston
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)
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'
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.
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