在appappowow iOS 10中缓存Cookie(clearcache = no;)在应用重启时无效 - Cordova / Ionic

时间:2017-02-05 21:52:09

标签: ios cordova ionic-framework cookies

我在离子iOS应用程序中遇到一个问题,我的网站没有保存cookie,清除缓存和清除会话缓存不起作用。 我正在使用Cordova Inappbrowser插件。

在Android中,它运行良好。

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

但是,在iOS中,它不起作用。什么时候,我首先提供我的凭据,然后进入应用程序,然后退出应用程序并重新打开它,它再次询问我的凭据(在ANDROID中完美运行)

进一步挖掘后,我发现要保存的cookie标记为 isSessionOnly = true且expires = null

因此,我可以在会话中看到cookie,但在应用关闭时会被清除

我通过在CDVinAppbrowser.m类中编写以下代码找到了我的结果:

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

那么,如何在iOS中保存cookie或使用clearcache = no和clearsessioncache = no的选项保存inappbrowser。

注意:我对iOS / Swift完全不熟悉。所以,我需要知道将代码放在swift类中的哪个位置。

编辑Bounty(由AndroidMechanic提供)

我有完全相同的问题,它适用于android完美无缺,但在iOS上它每次重新启动时都会要求提供凭据。我提供了一个可以避免本机代码的解决方案的赏金。

4 个答案:

答案 0 :(得分:2)

详细说明@Sourav Das的答案,以便对他人有用。

如果您的身份验证方案仅基于SAML,则您没有任何选择,而是取决于身份提供者设置的cookie。

IdP设置的cookie通常是sessionOnly cookie,没有任何有效期。 Android WebView会在应用重新启动之间(杀死并重新打开)将这些sessionOnly cookie以及其他cookie(即具有到期日期)一起保存,但基于iOS的WebView不会保存sessionOnly cookie。 iOS中仅保存有过期日期的cookie。

如果iOS应用程序开发人员的意图是在应用程序重新启动之间还保留sessionOnly cookie,则有两种方法可以执行此操作。

  1. 根据https://stackoverflow.com/a/5938927/6243

  2. 上的逻辑实施自定义cordova插件
  3. 如果知道用于设置sessionOnly cookie的确切名称,请使用Cookie Emperor plugin。您可以在JavaScript层使用此插件进行读取/写入,而不用处理本地iOS代码。

答案 1 :(得分:1)

@AndroidMechanic,你为iOS指定的问题是一个已知问题,我们遇到了同样问题,所以我们提出了以下解决方案,而不是保存会话或Cookie中的详细信息,我们希望保存在{{1这是支持Ionic Native的参考链接。

1.安装Cordova和Ionic Native插件:

KeyChain

2.将此插件添加到您应用的模块    ...

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

第3。使用

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

...

@NgModule({
  ...

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

答案 2 :(得分:1)

@AndroidMechanic, 我发布了这个问题,这就是我们解决问题的方法。

我们认为iOS inappbrowser webview不能正确处理cookie,但是android的webview却没有。 我们应用程序的初始登录过程是通过我们的身份提供商(在我们的案例中是ADFS)。身份提供商是通过SAML(通过Cookies工作)配置的。

解决方案1 ​​:(确保Cookie有效,只要它们有效)

因此,我们使用了cordova插件cookiemperor,我们在成功登录后保存了cookie,并在任何人再次登录时将其传递给URL。这一直有效,直到cookie没有到期。

但是,我们需要一个更好的解决方案来解决这个问题,即解决方案2。

解决方案2 :(不要使用Cookie,使用访问令牌)

我们将身份验证从SAML更改为OAuth2.0授权代码流协议,其中我们使用访问令牌和刷新令牌来验证用户的身份。

因此,每当触发Login Controller时,它会在调用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,否则用户可以在iOS和Android中使用SSO功能,而无需担心Cookie。

由于

Sourav

答案 3 :(得分:0)

我最近在iOS(Safari)上遇到了这个问题。 Android(Chrome)清除缓存,但iOS(Safari)不会清除,并且使用以前的数据。我找到了解决方案。如果使用每次更改的参数调用该服务,则iOS(Safari)和Android(Chrome)不会使用以前的数据。您不需要在后端使用此变量。因此问题得以解决。

import { SERVER_URL } from 'src/environments/environment';

@Injectable({
  providedIn: 'root'
})
export class DataService {

  headers: any = new HttpHeaders({
    'Cache-Control': 'no-cache, no-store, must-revalidate, post- check=0, pre-check=0, max-age=0, private, max-stale=0',
    Pragma: 'no-cache',
    Expires: '0'
  });

  xxx = 0;

  constructor(public http: HttpClient) {

  }

  getAlarms() {
    this.xxx += 1;
    if (this.xxx >= 50) {
      this.xxx = 0;
    }
    return this.http.get('http://' + SERVER_URL + '/alarms?xxx=' + this.xxx, { headers: this.headers });
  }

}