Может ли приложение iPhone xcode считывать файлы cookie, ранее сохраненные Safari Mobile? - PullRequest
19 голосов
/ 10 февраля 2009

Может ли приложение iPhone считывать файлы cookie, ранее сохраненные Safari Mobile?

Ответы [ 8 ]

12 голосов
/ 10 февраля 2009

На самом деле ответ на ваш вопрос:

номер

Cookie-файлы Mobile Safari недоступны из приложений SDK. Каждому приложению SDK предоставляется свой собственный кэш-память WebKit и хранилища файлов cookie, поэтому, хотя файлы cookie сохраняются в одном приложении, они не доступны между приложениями.

11 голосов
/ 17 января 2016

Начиная с iOS 9 это возможно!

Используйте sfSafariViewController .

Вам нужно будет настроить:

  • A настраиваемая схема URL в вашем приложении для получения данных cookie.
  • Веб-сайт, с которого вы получаете файлы cookie, должен будет реализовывать API-интерфейс для пользовательской схемы URL вашего приложения, чтобы перенаправлять обратно в ваше приложение.

Вы можете клонировать это репо , с полностью работающим демо этого.

Надеюсь, это поможет,

Ли

10 голосов
/ 21 апреля 2011

Существует действительно интересный способ, если у вас есть доступ к URL-адресу сервера.

  1. В вашем приложении запустите URL сервера с мобильным сафари.
  2. URL-адрес целевого сервера считывает cookie-файл и перенаправляет обратно на определенный URL-адрес приложения (myapp: // cookie = 123)
  3. Затем приложение переключается обратно, и вы можете прочитать это значение из обработчика URL

Это немного странно, поскольку приложение переключает мобильное сафари, а затем сразу переключается обратно в приложение. Но это возможно.

6 голосов
/ 11 июля 2012

Обратите внимание, что в iOS 8 вам, вероятно, лучше использовать Safari Password Sharing для решения некоторых случаев использования, которые вызывают эту проблему.

Это не возможно напрямую, но с помощью веб-сайта это возможно.

Для пояснения, пользовательский случай заключается в том, что приложение Objective C хочет прочитать значение cookie, которое было установлено веб-сайтом в мобильном сафари. (т.е., в частности, UIWebView не участвовал в настройке cookie)

Ваше приложение должно сделать это:

  1. Запустить мобильное сафари, используя [[UIApplication sharedApplication] openURL: url];
  2. URL должен быть специальным, например. http://yourwebsite.com/give-ios-app-the-cookie
  3. На вашем веб-сайте при запуске этого URL-адреса выполните перенаправление на схему вашего-app-url-схемы: cookievalue = (например, angrybirds: cookievalue = hh4523523sapdfa)
  4. когда ваш делегат приложения получает - (BOOL) приложение: (UIApplication *) приложение openURL: (NSURL *) URL-адрес sourceApplication: (NSString *) примечание sourceApplication: (id) аннотация обрабатывает URL-адрес для получения значения cookie

Обратите внимание, что вы не должны делать это автоматически при запуске приложения - пользователь увидит передачу в Mobile Safari и обратно, что не очень удобно для пользователя, и Apple отклонит ваше приложение (Apple также считает это "загрузкой"). личные данные пользователя на сервер без их предварительного согласия "). Было бы лучше сделать это в ответ на пользователя, обращая внимание на пользовательский опыт - например. подождите, пока пользователь нажмет кнопку «Войти», затем сделайте это, и если пользователь не вошел на ваш сайт, http://yourwebsite.com/give-ios-app-the-cookie должен показать пользователю экран входа в систему в Safari. Если пользователь вошел в систему, вы можете кратко показать экран «Автоматический вход в систему ...» на секунду или две в Safari, прежде чем перенаправить пользователя обратно.

Конечно, нет способа заставить это работать с hotmail / gmail / etc - это должен быть ваш собственный сайт.

Кредит идет на Уникальный идентификатор как для мобильного сафари, так и для приложения в iOS за предложение такого подхода.

4 голосов
/ 10 февраля 2009

Из-за песочницы на iPhone у вас нет доступа к файлам cookie Safari. Вы можете получить доступ только к файлам cookie, созданным в вашем приложении - например, с помощью UIWebView.

3 голосов
/ 10 февраля 2009

Несмотря на то, что вы задавали один и тот же вопрос дважды до , вот один из подходов, еще не упомянутых ...

Это может быть немного запутанным, но вы можете делать вещи в стиле Greasemonkey с UIWebView . Примерно так:

  • Загрузить целевую страницу
  • создайте некоторый javascript, который будет читать document.cookie и возвращать нужные вам данные
  • В webViewDidFinishLoad вставьте этот javascript в UIWebView с помощью stringByEvaluatingJavaScriptFromString message

Я использовал эту технику для улучшения сторонних страниц в приложении для iPhone, но я не уверен, что оно будет читать файлы cookie из того же места, что и мобильный Safari.

Стоит ли хотя бы выстрел?

2 голосов
/ 13 октября 2010

Вот мои утилиты get / set cookie методы.



+(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;
}
0 голосов
/ 14 июля 2010

Возможно, вы захотите проверить

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

Но, очевидно, NSHTTPCookieStorage даже не хранит куки-файлы из последнего запроса в текущем приложении на iOS (rdar: // 8190706)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...