Comment triggersr la conservation et la restauration de l'état Bluetooth Core

Conservation et restauration d'état La fonction de conservation et de restauration d'état étant embeddede à Core Bluetooth, votre application peut activer cette fonctionnalité pour requestr au système de conserver l'état des gestionnaires centraux et périphériques de votre application et de continuer à effectuer certaines tâches liées à Bluetooth. nom, même lorsque votre application n'est plus en cours d'exécution. Lorsque l'une de ces tâches est terminée, le système relance votre application en arrière-plan et donne à votre application l'opportunité de restaurer son état et de gérer l'événement de manière appropriée. Dans le cas de l'application de security à domicile décrite ci-dessus, le système surveille la request de connection et relance l'application pour gérer le gestionnaire central: didConnectPeripheral: déléguer le callback lorsque l'user est rentré chez lui et la request de connection terminée.

Comment puis-je triggersr cela et tester le code?

J'ai un accessoire avec un service. J'ai une application qui scanne pour le service et j'ai opté pour la préservation de l'état. Cependant, je ne suis pas sûr de savoir comment le tester logiquement car je ne sais pas ce dont j'ai besoin pour le triggersr. Ce sont les options que j'ai essayé sans succès:

A - kill the app from Xcode B - kill the app manually C - power off the phone D - something else 

Dans toutes ces options, j'ai essayé d'aller sur Xcode -> device et de regarder les logs, mais je n'ai vu aucun journal de restauration d'état.

Merci

NB Merci à user1785784 de partager le QA1962 d'Apple – Conditions dans lesquelles Bluetooth State Restoration va relancer une application qui décrit le nouveau comportement Bluetooth dans iOS 11. Ce document devrait être considéré comme la réponse à cette question, même si je pense qu'il prétend que iOS 10 relancerait une application qui a été forcée de quitter. (Je n'ai pas testé cela sur un appareil iOS 10, mais cela aurait été un départ d'iOS 9. Quelqu'un peut-il confirmer?).

Tuer manuellement l'application (B) à partir du sélecteur de tâches, garantit que votre application ne sera pas lancée automatiquement tant que l'user ne l'ouvrira pas explicitement.

C ne fonctionne pas non plus, je pense que seules les applications VOIP sont lancées automatiquement après le redémarrage, et seulement après le délocking de l'appareil.

Je ne connais aucun D.

J'utilise A.

Tout d'abord, pour implémenter Bluetooth State Restoration, assurez-vous d'avoir

  1. bluetooth-central ajouté en tant que UIBackgroundModes à votre Info.plist
  2. définir une CBCentralManagerOptionRestoreIdentifierKey lors de l'initialisation de CBCentralManager
  3. implémenté le -(void)centralManager:willRestoreState: callback dans votre délégué CBCentralManager .

Ensuite, vous êtes prêt à tester la restauration d'état:

  1. mettre l'application dans un état connu (par exemple, Bluetooth allumé, un appareil connecté / connection)
  2. tuer l'application dans Xcode
  3. regarder les journaux ou définir un point d'arrêt de lancement
  4. faire une modification de l'état bluetooth, par ex.
    • basculer en mode avion
    • prendre un appareil bluetooth hors de scope (pour éviter de marcher, je mets le mien dans un conducteur / Faraday Cage / cafetière)
    • ramener l'appareil à scope
    • interagir avec l'appareil, par exemple en appuyant sur un button / ayant une impulsion
  5. regarder votre code de restauration d'état être appelé

NB : application:didFinishLaunchingWithOptions: sera appelée en premier, et vous devrez immédiatement CBCentralManager votre CBCentralManager comme décrit ci-dessus. Puis centralManager:willRestoreState: sera appelé.

Une cafetière qui est aussi une cage de Faraday

Je viens de comprendre cela récemment avec l'aide d'Apple Tech. Aussi donné / avoir un bon lien qui montre les différentes façons de provoquer le redémarrage de l'application sans intervention de l'user.

Je l'ai fait en provoquant le plantage soudain de l'application avec l'extrait de code rapide suivant. Cela provoque le redémarrage de l'application et l'appel du callback 'willRestoreState'.

 DispatchQueue.main.asyncAfter(deadline: .now() + 5) { print("Killing app") // CRASH if ([0][1] == 1){ exit(0) } exit(1) }