我在离子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上它每次重新启动时都会要求提供凭据。我提供了一个可以避免本机代码的解决方案的赏金。
答案 0 :(得分:2)
详细说明@Sourav Das的答案,以便对他人有用。
如果您的身份验证方案仅基于SAML,则您没有任何选择,而是取决于身份提供者设置的cookie。
IdP设置的cookie通常是sessionOnly cookie,没有任何有效期。 Android WebView会在应用重新启动之间(杀死并重新打开)将这些sessionOnly cookie以及其他cookie(即具有到期日期)一起保存,但基于iOS的WebView不会保存sessionOnly cookie。 iOS中仅保存有过期日期的cookie。
如果iOS应用程序开发人员的意图是在应用程序重新启动之间还保留sessionOnly cookie,则有两种方法可以执行此操作。
如果知道用于设置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 });
}
}