57 votes

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!

67voto

davidgyoung Points 14271

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.

J'ai posté une discussion détaillée sur la façon dont tout cela fonctionne dans ce blog.

18voto

TNBtech Points 134

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):

  1. Vous devez mettre en œuvre un CLLocation délégué à l'intérieur de votre AppDelegate.m module. Ce délégué est ce qui est invoquée par iOS donc, si vous n'avez pas le CLLocation délégué code dans AppDelegate.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.

Ainsi, à l'intérieur AppDelegate.m vous avez besoin de la suite (vous avez également besoin de créer un lien CoreLocation.h):

{

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.


// This location manager will be used to notify the user of region state transitions when the app has been previously terminated.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;


return YES;
}
  1. À L'Intérieur De AppDelegate.m, vous avez besoin pour mettre en œuvre les locationManager didDetermineState méthode, comme ceci:

{

locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)stateforRegion:(CLRegion *)region{

UILocalNotification *notification = [[UILocalNotification alloc] init];

if(state == CLRegionStateInside)
{
notification.alertBody = [NSString stringWithFormat:@"You are inside region %@", region.identifier];
}
else if(state == CLRegionStateOutside)
{
    notification.alertBody = [NSString stringWithFormat:@"You are outside region %@", region.identifier];
}
else
{
    return;
}

[[UIApplication sharedApplication] presentLocalNotificationNow:notification];


}

--> 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églage notifyEntryStateOnDisplay 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 et notifyEntryStateOnDisplay est VRAI, 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 sur FALSE, vous n'avez pas.

Bien sûr, vous devez être en cours d'exécution iOS 7.1 pour que ça fonctionne correctement.

10voto

Jian Yin Shen Points 107

Vous avez besoin de 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.

6voto

Hugh Mbaezue Points 53

Juste 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..

2voto

Ronny Khan Points 21

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X