Файлы cookie SFSafariViewController

Я понимаю, что с iOS9 вы должны иметь возможность читать файлы cookie с помощью SFSafariViewController.

Если я установлю файл cookie на своей странице в JS, используя следующее:

var dd = new Date(Date.now() + 1000 * 60 * 60 * 24).toGMTString();
var expires = "expires="+ dd;
document.cookie = "mycookie=cookievalue; " + expires  + " domain=.mydomain.co.uk ; path=/ ";

If I do :

- (void)safariViewController:(SFSafariViewController *)controller didCompleteInitialLoad:(BOOL)didLoadSuccessfully
{
  NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  NSArray *cookiesArray = [storage cookies];
}

cookiesArray всегда пуст.

Если я использую традиционный UIWebView

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
  NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  NSArray *cookiesArray = [storage cookies];
}

Я получаю печенье, которое ожидал.

Любые идеи, что я могу делать неправильно?


person Jai Byron    schedule 19.12.2016    source источник


Ответы (1)


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

Если вам нужна эта функциональность, вам нужно придерживаться UIWebView или WKWebView.

person wottle    schedule 19.12.2016
comment
Спасибо, что ответили мне, но согласно: developer.apple.com/reference/safariservices/ Контроллер представления включает такие функции Safari, как Reader, AutoFill, обнаружение мошеннических веб-сайтов и блокировка контента. Он обменивается файлами cookie и другими данными веб-сайта с Safari. Действия пользователя и взаимодействие с SFSafariViewController не видны вашему приложению, которое не может получить доступ к данным автозаполнения, истории просмотров или данным веб-сайта. Вам не нужно защищать данные между вашим приложением и Safari. - person Jai Byron; 19.12.2016
comment
Вы неправильно понимаете, что значит сказать, что SFSafariViewController делится файлами cookie и другими данными веб-сайта с Safari. SFSafariViewController — это экземпляр Safari. Это не часть вашего приложения. Это доступ к песочнице данных Safari (файлы cookie, автозаполнение и т. д.), а не ваше приложение, передающее эти данные Safari. У вашего приложения нет доступа ни к каким защищенным данным в Safari, включая файлы cookie. Если вам нужен доступ к файлам cookie веб-сайта в вашем приложении, SFSafariViewController — не лучший выбор. - person wottle; 19.12.2016
comment
Вы доказали мой ответ в своем коде. NSHTTPCookieStorage будет пустым, если вы получите доступ к веб-сайту в SFSafariViewController. SFSafariViewController используется, но не для того, что вы пытаетесь сделать. - person wottle; 19.12.2016
comment
Хорошо, спасибо за разъяснение. Просто чтобы дать некоторый контекст, мне посоветовали использовать SFSafariViewController для отложенных прямых ссылок. т. е. 1. Щелчок по универсальной ссылке на веб-странице (содержащей данные cookie) 2. Поскольку приложение не установлено, открывается магазин приложений и загружается мое приложение 3. Когда мое приложение открывается и запускается, оно затем считывает «общий файл cookie» и действия. - person Jai Byron; 20.12.2016
comment
Не думаю, что этот совет был правильным. Взгляните на это: blog.branch.io/install- attribution-ios-9-safari-view-controller — обратите внимание на цитату Практически говоря, вы не можете просто открыть SFSafariViewController и прочитать файлы cookie с любого веб-сайта (это было бы ужасно). - person wottle; 20.12.2016
comment
Да. Я понимаю что ты имеешь ввиду. Спасибо за помощь. - person Jai Byron; 20.12.2016
comment
@JaiByron, так вы смогли реализовать отложенную глубокую ссылку с помощью UIWebView? У меня такое же требование для реализации отложенной глубокой ссылки для приложения iOS. - person kushwahav; 10.06.2020