Question Une application xcode iPhone peut-elle lire les cookies précédemment stockés par Safari Mobile?


Une application iPhone peut-elle lire les cookies précédemment stockés par Safari Mobile?


19
2018-02-10 12:29


origine


Réponses:


Pour réellement répondre ta question:

Non.

Les cookies de Mobile Safari ne sont pas accessibles depuis les applications SDK. Et chaque application SDK reçoit son propre cache WebKit et ses propres magasins de cookies. Ainsi, même si les cookies persistent dans la même application, ils ne sont pas accessibles entre les applications.


12
2018-02-10 14:27



A partir d'iOS 9 c'est possible!

Utiliser un sfSafariViewController.

Vous devrez configurer:

  • UNE schéma d'URL personnalisé dans votre application pour recevoir des données de cookie.
  • Le site Web dont vous recevez des cookies devra implémenter un schéma d'URL personnalisé spécifique à votre application, afin de le rediriger vers votre application.

Vous pouvez cloner ceci repo qui a une démo de travail complète de cela.

J'espère que cela t'aides,

Liam


11
2018-01-17 11:44



Il existe en fait un moyen intéressant si vous avez accès à une URL de serveur.

  1. Dans votre application, lancez l'URL du serveur avec safari mobile.
  2. L'URL du serveur cible lit le cookie et redirige vers une URL spécifique à l'application (myapp: // cookie = 123)
  3. L'application est alors rétablie et vous pouvez lire cette valeur depuis le gestionnaire d'URL

C'est un peu piraté car l'application changerait de safari mobile, puis reviendrait immédiatement à l'application. Mais c'est possible.


10
2018-04-21 04:10



Notez que sur iOS 8, vous êtes probablement mieux en utilisant Partage de mot de passe Safari pour résoudre certains des cas d'utilisation à l'origine de ce problème.

Ce n'est pas directement possible, mais avec la coopération du site Web, c'est possible.

Pour clarifier, le cas de l'utilisateur est qu'une application Objective C veut lire la valeur d'un cookie qui a été défini par un site Web dans Safari mobile. (c.-à-d. en particulier, une UIWebView n'a pas été impliquée dans la configuration du cookie)

Votre application devrait faire ceci:

  1. Lancez le safari mobile en utilisant [[UIApplication sharedApplication] openURL: url];
  2. L'URL doit être spéciale, par exemple. http://votrewebsite.com/give-ios-app-the-cookie
  3. Sur votre site Web, lorsque cette URL est lancée, émettez une redirection vers votre-app-url-scheme: cookievalue = (par exemple, angrybirds: cookievalue = hh4523523sapdfa)
  4. lorsque votre délégué d'application reçoit l'application - (BOOL): application (UIApplication *) openURL: (NSURL *) url sourceApplication: (NSString *) sourceApplication annotation: (id) traitement de l'url pour obtenir la valeur du cookie

Notez que vous ne devez pas le faire automatiquement au démarrage de l'application - l'utilisateur verra le transfert vers Mobile Safari et inversement, ce qui n'est pas une bonne expérience utilisateur et Apple rejettera votre application (Apple considère également qu'il s'agit de "télécharger les données personnelles de l'utilisateur"). au serveur sans leur consentement préalable "). Il serait préférable de le faire en réponse à l'utilisateur, en prêtant une attention particulière à l'expérience utilisateur - par exemple. Attendez que l'utilisateur appuie sur un bouton "login", puis faites-le, et si l'utilisateur n'est pas connecté à votre site Web, http://votrewebsite.com/give-ios-app-the-cookiedevrait montrer à l’utilisateur l’écran de connexion au sein de Safari. Si l'utilisateur est connecté, vous pouvez brièvement afficher un écran "Connexion automatique ..." pendant une seconde ou deux dans Safari avant de rediriger l'utilisateur.

Il n'y a aucun moyen de faire en sorte que cela fonctionne avec Hotmail / Gmail / etc bien sûr - cela doit être votre propre site web.

Le crédit va à Identifiant unique pour le safari mobile et l'application dans iOS pour suggérer ce type d'approche.


6
2017-07-11 11:49



En raison du sandbox sur l'iPhone, vous n'avez pas accès aux cookies de Safari. Vous pouvez uniquement accéder aux cookies créés dans votre application - par exemple par UIWebView.


4
2018-02-10 10:26



Bien que vous ayez posé la même question deux fois  avant, voici une approche pas encore mentionnée ...

Cela peut être un peu compliqué, mais vous pouvez faire des choses Greasemonkey-esque avec un UIWebView. Quelque chose comme ça:

J'ai utilisé cette technique pour améliorer les pages tierces dans une application iPhone, mais je ne suis pas sûr qu'elle lira les cookies au même endroit que Safari Mobile.

Vaut le coup si?


3
2018-02-10 12:44



Voici mes utilitaires pour obtenir / définir des méthodes de cookies.



+(void)setCookie:(NSString *)key withValue:(NSString *)value {
    NSArray *keys = [NSArray arrayWithObjects:
                     NSHTTPCookieDomain,
                     NSHTTPCookieExpires,
                     NSHTTPCookieName,
                     NSHTTPCookiePath,
                     NSHTTPCookieValue, nil];
    NSArray *objects = [NSArray arrayWithObjects:
                        @"YOURDOMAIN",
                        [NSDate distantFuture],
                        key,
                        @"/",
                        value, nil];    
    NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:dict];
    NSHTTPCookieStorage *sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    [sharedHTTPCookieStorage setCookie:cookie];
}

+(NSString *)getCookie:(NSString *)key {
    NSHTTPCookieStorage *sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *cookies = [sharedHTTPCookieStorage cookiesForURL:[NSURL URLWithString:@"YOURDOMAIN"]];
    NSEnumerator *enumerator = [cookies objectEnumerator];
    NSHTTPCookie *cookie;
    while (cookie = [enumerator nextObject])
    {
        if ([[cookie name] isEqualToString:key]) 
        {
            return [cookie value];
        }
    }
    return nil;
}

2
2017-10-13 08:12



Vous voudrez peut-être vérifier

if ([[NSHTTPCookieStorage sharedHTTPCookieStorage] cookieAcceptPolicy] != NSHTTPCookieAcceptPolicyAlways) {
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];       
}

Mais apparemment, NSHTTPCookieStorage ne contient même pas les cookies de la dernière requête de l'application actuelle sur iOS (rdar: // 8190706)


0
2017-07-14 18:16