SFSafariViewController cookie
Я понимаю, что начиная с iOS9 вы сможете читать куки с помощью 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=/ ";
Если я сделаю:
- (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];
}
Я получил печенье, которое я ожидал.
Есть идеи, что я могу делать не так?
2 ответа
SFSafariViewController
это в основном процесс Safari, работающий вне вашего приложения. Ваше приложение не будет иметь никакого доступа к файлам cookie, используемым SFSafariViewController
так же, как ваше приложение не имеет доступа к файлам cookie в самом приложении Safari.
Если вам нужна эта функциональность, вам нужно придерживаться UIWebView
или же WKWebView
,
SFSafariViewController запускается в отдельном процессе, поэтому чтение файлов cookie НЕВОЗМОЖНО.
Однако в случае, если SFSafariViewController является единственным доступным вариантом из-за некоторых ограничений существующих доступных параметров, таких как WKWebView и UIWebView. Тогда подход с настраиваемой схемой URL будет полезен для отправки данных из SFSafariViewController в родительское приложение, которое инициирует SFSafariViewController.
В приведенном выше случае возможный URL-адрес будет следующим, где «myapp» — это пользовательская схема URL-адреса.
" myapp://SendData?mycookie=cookievalue&domain=.mydomain.co.uk&path=/ "
Таким образом, пользовательская схема URL-адресов будет зарегистрирована в родительском приложении для его запуска, а параметры пользовательской схемы URL-адресов будут иметь предполагаемые данные, которые должны быть получены родительским приложением. Если данные конфиденциальны, они могут быть зашифрованы с помощью javascript перед отправкой и могут быть расшифрованы родительским приложением после их получения.
Надеюсь, это поможет :)
Дополнительные сведения о пользовательской схеме URL-адресов см. на странице https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app .