comment décider d'afficher une push/remote notif
Bonjour à tous,
depuis des semaines je cherche un moyen d'afficher les notifications push uniquement aux applications qui se trouvent dans un rayon géographique précis.
chose qu'on arrive à faire sur Android mais que je n'ai pas réussi à faire sur iOS.
Cas de figure:
device 1 (Android ou iOS) envoie une notif et le serveur envoie à tous les autres devices une notification d'alerte.
les devices android captent la notif avant l'affichage, voient le contenu, si la notification les concerne (sont dans un rayon de 10 KM de leur position) elles affichent à l'utilisateur sinon elles ignorent
comment avoir le même comportement sur iOS?
Existe-t-il un moyen de catcher la notification même quand l'application est fermée pour pouvoir l'ignorer suivant des critères de position?
le serveur ne connait pas la position des devices, alors il envoie la notification a tout le monde; Normal.
c'est au device de prendre la décision de l'afficher ou pas, suivant sa position actuelle, car à terme je veux pouvoir paramétrer la distance de réception des notifs envoyées par le serveur au gré de l'utilisateur.
merci d'avance pour votre avis.
Réponses
Ensuite si dans ton application quand elle a été réveillée par une Remote Notification silencieuse, tu détermines qu'elle respecte les critères, en particulier qu'elle est dans un rayon de 10km, alors tu affiches une UILocalNotification pour afficher l'alerte (ou la bannière dans le Centre de Notifs) et réveiller l'application au premier plan quand l'utilisateur valide.
Waw merci beaucoup pour ta réponse qui ne s'est pas fait attendre.
effectivement c'est ce que j'ai essayé de faire à savoir:
- ajouter background mode: remote notification et background fetch
- ajouter au notification vers iOS un content-available =1
- implementer - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
dans l'appDelegate
- récupérer du userInfo l'info position de la notif et la comparer avec la position de l'utilisateur.
- si le status de l'application = UIApplicationStateBackground alors je lance une local notification avec le contenue de la notif originale
sinon je traite les cas ou l'application est allumé.
mais dans tous ça lors de mes tests je vois que je reçois toujours les notif et que ça ne passe pas par didReceiveRemoteNotification
ai-je passé une étape?
me suis-je trompé dans ma compréhension des notification silencieuse ?
Le mode BackgroundFetch, comme son nom l'indique, est traité uniquement si l'application est lancée ET qu'elle se trouve en arrière plan. D'ailleurs c'est le system de l'iOS qui te donne la main quand il veut (c'est lui qui décide) en appelant la callback didReceiveRemoteNotification
Dans le cas où l'appli n'est pas lancée, il n'y a actuellement aucun moyen de traiter une notification sans intervention de l'utilisateur.
Il n'y a pas de process indépendants qui tourneraient en dehors du contexte de l'application qui pourrait éventuellement 'réveiller' l'appli.
merci beaucoup de ton intervention.
effectivement pas moyen, de faire ce que je veux quand l'application n'ai pas lancé.
il me reste la possibilité de faire comme préconise AliGator dans le cas ou l'appli est en mode Background ou active.
mais en ce moment on me remonte que sur iOS 8 l'appli ne reçois pas du tout de notification.
je croyais avoir résolu le souci en ajoutant la gestion spécifique iOs8 mais non a priori ça n'a pas résolu le problème et d'autres bugs se sont révélés, c'est une vrai plaie qu'il n'y ai pas de rétro compatibilité sur l'Os.
en plus des problèmes de localisation sur iOS8 résolus d'autres problèmes comme des nul pointeurs sont apparu sur les iPhones qui sont sur iOS 8.
quelqu'un a-t-il une idée sur la question? concernant la notification non reçu sur iOS 8
voici mon code correspondant:
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
//register to receive notifications
[application registerForRemoteNotifications];
}
et dans
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
#ifdef __IPHONE_8_0
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypesUIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
#endif
} else {
UIRemoteNotificationType types = UIRemoteNotificationTypeBadge
| UIRemoteNotificationTypeAlert
| UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:types];
}
faire des if else sur la version de l'OS sérieux c'est du jamais vu.
merci d'avance pour votre support,
Et sinon effectivement pourquoi fais tu un test sur la version d'iOS ? Si tu compiles avec le SDK 8 il n'y a pas besoin de faire ton #ifdef qui n'est utile que si tu veux que ton code compile avec des vieux Xcode mais à priori je ne vois pas l'intérêt que tu aurais de s'assurer que tu puisses encore utiliser un ancien Xcode pot compiler ton code. Par contre le "if (respondsToSelector)" lui est propre et nécessaire pour pas risquer d'appeler une methode iOS8 only si l'utilisateur qui lance ton appli tourne sur un vieil OS, mais ce n'est pas le même problème et ça ce n'est pas un test de version iOS mais un test de disponibilité d'API donc bien plus propre.
merci,
effectivement je vais virer le ifdef, a vrai dire je l'ai laissé sans savoir son utilité, grâce à toi maintenant je sais! thx
quand je parlais de vérifier l'Os, je parlais du respondsToSelector:@selector
je continue mes investigations dans le but de corriger mes erreurs,
je pense que mes problèmes viennent de mon code et d'une mauvaise conception de base, car au démarrage du projet j'étais
il faut que je revoie mon code, faire du bon nettoyage et du bon refactor,
avant de vous solliciter d'avantage.
merci AliGator