iBeacon Notification lorsque l'application n'est pas en cours d'exécution
J'ai réussi à faire un iBeacon qui déclenche un local de notification push sur mon iPhone lorsque la balise est dans la gamme. Il est parfaitement de travail lorsque l'application est en arrière-plan.
Ma question est: puis-je déclencher la notification, même lorsque l'application n'est pas en cours d'exécution, même pas dans le fond?
Je pensais que c'était possible, mais je ne suis pas sûr.
Si oui, comment puis-je accomplir?
Merci!
- J'ai expliqué le processus de découverte iBeacons en arrière-plan ici : stackoverflow.com/a/19152814/839566 j'espère que cela aide
- Vous pourriez appeler la CLLocationManager de
requestStateForRegion:
méthode d'instance pour déterminer si votre dans ou hors de la région lorsque l'application démarre. - Pouvez-vous svp me donner des idée de comment vous gérer pour déclencher la balise dans le fond? Je viens de trouver du problème dans ce besoin d'aide.
Vous devez vous connecter pour publier un commentaire.
Oui, c'est possible et devrait être automatique.
Après avoir créé un CLBeaconRegion et commencé à surveiller sur elle, les Services de Localisation permettra de garder une trace de savoir si votre téléphone est dans ou hors de la région, même lorsque l'application n'est pas en cours d'exécution. Si votre application n'est pas en cours d'exécution pendant une période de transition, iOS va lancer votre application en arrière-plan pendant quelques secondes pour appeler les CLLocationManagerDelegate méthodes.
J'ai trouvé ce comportement par le biais de l'expérimentation avec mon propre application, mais a aussi assisté avec Apple AirLocate exemple de programme. Avec AirLocate, si vous avez mis en place une surveillance de la région, puis redémarrez votre téléphone, AirLocate assurent toujours une local de notification dès que le téléphone accède à la région.
Prendre soin lors de l'essai de cela, parce que parfois, il faut jusqu'à 4 minutes après la mise sous/hors tension d'un iBeacon avant iOS reconnaît la région de transition d'état. MODIFIER: Comme de l'iPhone 5, les applications utilisent généralement l'accélération matérielle pour détecter les balises dans un délai de quelques secondes, et si l'accélération matérielle n'est pas disponible, il peut prendre jusqu'à 15 minutes.
EDIT: Comme d'iOS 8, vous devez vous assurer que vous avez appelé et a obtenu avec succès
locationManager.requestAlwaysAuthorization()
commelocationManager.requestWhenInUseAuthorization()
permet uniquement de balises être détecté dans le premier plan.J'ai posté une discussion détaillée sur la façon dont tout cela fonctionne en ce billet de blog.
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
va se déclencher, maisdidEnterRegion
ne sera PAS. J'ai déplacé ma logique dans cette méthode à la place. Très bizarre.OK j'ai eu à travailler correctement et expérimenté un peu avec elle donc, voici la réponse. C'est ce que vous devez faire pour obtenir votre application d'être invoquée lors de la traversée d'un phare limitrophes de la région après l'application a été résilié (en supposant que votre application fonctionne correctement lors de l'avant-plan):
CLLocation
délégué à l'intérieur de votreAppDelegate.m
module. Ce délégué est ce qui est invoquée par iOS donc, si vous n'avez pas leCLLocation
délégué code dansAppDelegate.m
, vous ne serez pas en mesure de répondre à iOS lorsque votre application a été résilié. C'est ce que Apple AirLocate exemple d'application n'.Ainsi, à l'intérieur
AppDelegate.m
vous avez besoin de la suite (vous avez également besoin de créer un lienCoreLocation.h
):À l'intérieur de
AppDelegate.m
, vous avez besoin pour mettre en œuvre les locationManager didDetermineState méthode, comme ceci:--> Donc, si votre application a été résilié (il doit être exécuté au moins une FOIS), lorsque le dispositif de transitions à travers un phare à la limite que vous êtes suivi, iOS va appeler votre application et appelez le
locationManager:didDetermineState
méthode dans votre AppDelegate.m module. À l'intérieur de cette méthode, vous pourrez alors mettre en place et d'appeler presentLocalNotificationNow. Si votre application est en arrière-plan lorsque cela se produit, iOS présentera la notification sur l'écran même s'il est verrouillé. L'utilisateur aura alors à invoquer l'application pour plus d'informations.Je suis assez sûr que la pression sur la mémoire n'a rien à voir avec cela. Aussi, la mise en
notifyEntryStateOnDisplay
n'a rien à faire de cette question. RéglagenotifyEntryStateOnDisplay
est utilisé uniquement lorsque l'utilisateur tourne sur iOS écran de l'appareil (c'est à dire les hits "à la maison" ou le bouton en haut à gauche). Si l'utilisateur ne ce etnotifyEntryStateOnDisplay
estTRUE
, ET l'appareil est à l'INTÉRIEUR de la balise de la région, vous êtes suivi, vous recevez une notification sur l'écran à ce moment. Si cette propriété est définie àFALSE
, vous n'avez pas.Bien sûr, vous devez être en cours d'exécution iOS 7.1 pour que ça fonctionne correctement.
Pour plus de détails, visitez Apple la documentation
class_addMethod
etclass_addProtocol
?Vous avez besoin pour passer notifyEntryStateOnDisplay=OUI pour CLBeaconRegion pour le système de réveiller votre application pour l'iBeacon d'entrée/de sortie de l'événement.
Mais il est une partie délicate. Si votre application ne s'exécute pas, le système ne réveillez votre application pour la balise d'entrée/sortie de la manipulation si votre application a été résilié auparavant en raison de la mémoire système de pression. Si l'utilisateur tue l'application en glissant dans la vue de la tâche, le système ne va pas réveiller votre application. Pour vérifier ce comportement, lancez votre application, le mettre à l'arrière-plan, puis consécutivement à lancer plusieurs la consommation de mémoire des applications. J'ai lancé plusieurs jeux en 3D avant mon application arrêtée par le système en raison de la pression de la mémoire.
Juste de mettre à niveau votre version d'iOS 7.1 et réglez "notifyEntryStateOnDisplay=OUI" et il devrait fonctionner comme un charme, même si votre application n'est pas en cours d'exécution. J'ai eu ce problème auparavant mais il a été fixé une fois j'ai fait cette mise à jour! Profiter..
Le seul moyen que j'ai été capable de faire ce travail est suivi par de grands changements qui semblent faire l'affaire. Être averti que je n'ai pas testé pour l'ensemble de l'appareil ou de scénarios de cas d'utilisation.
Oui, nous pouvons présenter la notification locale dans kill état ou dans l'arrière-plan de l'état, il suffit de suivre les étapes,
1) position de Départ à l'aide de gestionnaire de CLLocationManager classe.
2) Créer CLBeaconRegion comme,
3) mettre en Œuvre deux emplacement de gestionnaire délégué de la méthode comme,
Les deux ci-dessus de l'emplacement du gestionnaire de méthode de travail et même de votre application est de tuer ou en arrière-plan. Le système permettra de garder une trace de votre balise et quand elle est hors de la gamme, le système déclenche l'didExitRegion méthode et quand vient dans le système déclenche l'didEnterRegion méthode.