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

  • AliGatorAliGator Membre, Modérateur
    Tu peux imaginer envoyer un Remote Notification "silencieuse" (= qui ne déclenchera pas de notification visible à  l'écran, pas d'UIAlertView ou de bandeau dans les notifications) à  tous tes iPhones, ce qui se contentera de réveiller l'application en background pour te donner l'occasion de traiter la Remote Notification et faire ton test de distance.

    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 ?

  • xylowebxyloweb Membre
    décembre 2014 modifié #4

    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 settingsForTypes:(UIRemoteNotificationTypeBadge                                                                                             |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, 


     


  • AliGatorAliGator Membre, Modérateur
    Je n'ai jamais eu les problèmes que tu décris, ça me paraà®t plutôt etre un problème dans ton code ailleurs.

    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

Connectez-vous ou Inscrivez-vous pour répondre.