如何从 iOS 上的 React Native webView 获取 cookie?
How can I get cookies from react native webView on iOS?
我在 webView 中打开了一个单点登录网站。用户登录后,我需要获取一个 cookie 以从 API 请求令牌,并在应用程序中将其用于所有其他请求。
这在 Android 上一切正常,但是在 iOS 上,当我请求令牌时没有 cookie。
WebView 配置为使用共享 cookie 存储:
<WebView
source={{ uri: loginUrl }}
onMessage={handleSsoLogin}
injectedJavaScriptBeforeContentLoaded={JS_INTERFACE}
sharedCookiesEnabled={true}
/>
如果我使用 devTools 检查 webView,我可以看到 cookie。另外,如果我再次访问 SSO 站点,我已经记录了它。因此,cookie 被 webView 持久化和使用。 fetch
只是没有使用它们,CookieManager 也没有访问它们:
const cookies = await CookieManager.get(url);
console.log({ cookies });
...
{"cookies": {}}
所以,问题是,如何从 webView 获取这些 cookie?
您需要使用 import CookieManager from "@react-native-community/cookies";
在网络视图中,您可以这样做:
<WebView
cacheEnabled={false}
ref={ref => (this.webView = ref)}
source={{
uri: "http://yoururl.com"
}}
style={{ marginTop: 20 }}
onNavigationStateChange={this.navChange}
thirdPartyCookiesEnabled={true}
/>
{this.state.loading && (
<ActivityIndicator
color={"blue"}
style={{ flex: 20 }}
size={"large"}
/>
navChange = e => {
console.log("e", e);
this.setState({ loading: e.loading });
if (e.url == "http://yoururl.com/landing") {
CookieManager.getAll(true).then(res => {
console.log("CookieManager.getAll =>", res);
if (!!res) {
console.log({res})
CookieManager.clearAll(true).then(res => {
console.log("LoginScreen CookieManager.clearAll =>", res);
});
}
});
}
};
我在 webView 中打开了一个单点登录网站。用户登录后,我需要获取一个 cookie 以从 API 请求令牌,并在应用程序中将其用于所有其他请求。 这在 Android 上一切正常,但是在 iOS 上,当我请求令牌时没有 cookie。 WebView 配置为使用共享 cookie 存储:
<WebView
source={{ uri: loginUrl }}
onMessage={handleSsoLogin}
injectedJavaScriptBeforeContentLoaded={JS_INTERFACE}
sharedCookiesEnabled={true}
/>
如果我使用 devTools 检查 webView,我可以看到 cookie。另外,如果我再次访问 SSO 站点,我已经记录了它。因此,cookie 被 webView 持久化和使用。 fetch
只是没有使用它们,CookieManager 也没有访问它们:
const cookies = await CookieManager.get(url);
console.log({ cookies });
...
{"cookies": {}}
所以,问题是,如何从 webView 获取这些 cookie?
您需要使用 import CookieManager from "@react-native-community/cookies";
在网络视图中,您可以这样做:
<WebView
cacheEnabled={false}
ref={ref => (this.webView = ref)}
source={{
uri: "http://yoururl.com"
}}
style={{ marginTop: 20 }}
onNavigationStateChange={this.navChange}
thirdPartyCookiesEnabled={true}
/>
{this.state.loading && (
<ActivityIndicator
color={"blue"}
style={{ flex: 20 }}
size={"large"}
/>
navChange = e => {
console.log("e", e);
this.setState({ loading: e.loading });
if (e.url == "http://yoururl.com/landing") {
CookieManager.getAll(true).then(res => {
console.log("CookieManager.getAll =>", res);
if (!!res) {
console.log({res})
CookieManager.clearAll(true).then(res => {
console.log("LoginScreen CookieManager.clearAll =>", res);
});
}
});
}
};