2017-02-05 2 views
5

Я столкнулся с проблемой в ионном приложении iOS, где мой сайт не сохраняет файлы cookie и очищает кеш и очищает кеш сеанса за работой. Я использую плагин Cordova Inappbrowser.Кэширование файлов cookie в inappbrowser iOS 10 (clearcache = no;) не работает при перезагрузке приложения - Cordova/Ionic

В Android, он отлично работает.

var ref = window.open(url, '_blank','location=no,toolbar=yes,clearcache=no,clearsessioncache=no'); 

Но, в iOS, он не работает. Когда я сначала предоставляю свои учетные данные и перехожу в приложение, а затем я выхожу из приложения и снова его открываю, он снова запрашивает мои учетные данные (что отлично работает в ANDROID)

При дальнейшей копании я обнаружил, что файл cookie, который предназначалось для сохранения, отмечены как isSessionOnly = true и expires = null.

Таким образом, я могу видеть печенье внутри сессии, но очищается, когда приложение закрыто

Я нашел свой результат, написав следующий код в классе CDVinAppbrowser.m:

- (void)openInInAppBrowser:(NSURL*)url withOptions:(NSString*)options 
    {  
     NSHTTPCookie *cookie; 
     NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    for (cookie in [cookieJar cookies]) { 
     NSLog(@"%@", cookie); 
    } 

Итак, как сохранить файлы cookie или сделать inappbrowser с параметрами, работающими с clearcache = no и clearsessioncache = no в iOS.

Примечание: я полностью новичок в iOS/Swift. Итак, мне нужно знать, где разместить код в быстрых классах.

Edit для Bounty (по AndroidMechanic)

У меня точно такая же проблема, где она работает для андроида безупречно, но на прошивкой он запрашивает учетные данные каждый раз, когда приложение перезапускается. Я предлагаю щедрость для решения, где можно избежать использования собственного кода.

+0

вы решить эту проблему? –

+0

Вы нашли решение для этого? Я столкнулся с той же проблемой – AndroidMechanic

+0

@AndroidMechanic выглядит как ошибка, можете ли вы привести пример, где его можно легко воспроизвести? – jcesarmobile

ответ

0

@AndroidMechanic, Я разместил вопрос, и именно так мы его решили.

Мы полагали, что iOS inappbrowser webview не обрабатывает файлы cookie должным образом, но просматривает веб-представление Android. Процесс начального входа в наш App был через нашего поставщика удостоверений (который был ADFS в нашем случае). Поставщик удостоверений был настроен через SAML (который работает через файлы cookie).

Решение 1: (Убедитесь, что Cookies работают до тех пор, они действительны)

Таким образом, мы использовали Cordova плагин cookiemperor, где мы сохранили куки после успешного входа в систему и передал, что в URL всякий раз, когда кто-то входит в систему еще раз. Это работало до тех пор, пока печенье не закончилось.

Но нам нужно лучшее решение этой проблемы, которая является Решение 2.

Решение 2: (Не используйте Cookies, использование маркеров доступа)

Мы изменили нашу проверку подлинности с SAML для OAuth2.0 Протокол авторизации кода, в котором мы использовали токены доступа и токены обновления, чтобы проверить личность пользователя.

Таким образом, всякий раз, когда Войти Контроллер увольняют, он проверяет следующее перед вызовом URL:

A) Check if any access token is present 
B) If present, whether it is expired or not. 
C) If expired, use the refresh token to get the new access token. 

Если какой-либо из перечисленных выше условий не получится, мы называем URL, где пользователь должен войти снова в противном случае пользователь может использовать возможности SSO как в iOS, так и в Android, не беспокоясь о куках.

Благодаря

Sourav

0

@AndroidMechanic, проблема, которую вы указали для iOS, - это известная проблема, и мы столкнулись с таким же, поэтому придумали следующее решение, вместо того, чтобы сохранять данные в сеансе или в файлах cookie, мы предпочли сохранить в KeyChain здесь является ссылочной ссылкой, которая поддерживает Ionic Native.

1.Install в Кордове и ионическими Native плагинов:

$ ionic cordova plugin add cordova-plugin-ios-keychain 
$ npm install --save @ionic-native/keychain 

2.Add этот плагин для модуля вашего приложения ...

import { Keychain } from '@ionic-native/Keychain'; 

... 

@NgModule({ 
    ... 

    providers: [ 
    ... 
    Keychain 
    ... 
    ] 
    ... 
}) 
export class AppModule { } 

3. Использование

import { Keychain } from '@ionic-native/keychain'; 

constructor(private keychain: Keychain) { } 

... 

this.keychain.set(key, value).then(() => { 
    this.keychain.get(key) 
    .then(value => console.log('Got value', value)) 
    .catch(err => console.error('Error getting', err)); 
}) 
.catch(err => console.error('Error setting', err));