gpt4 book ai didi

react-native - 如何在 react-native-webview 中保持最后一个 Web session 处于事件状态?

转载 作者:行者123 更新时间:2023-12-03 13:34:12 26 4
gpt4 key购买 nike

我正在开发一个应用程序,在该应用程序中,我需要让用户在 react-native-webview 中保持最后一个网络 session 处于事件状态.

这是一个必需的工作流程。

  • 我的应用程序只有一个 WebView,正在加载固定 url。
  • 用户将打开应用程序并登录该网站。
  • 当用户将终止应用程序并再次打开它时,我需要让该用户保持登录状态,因为他上次已经登录。

  • 这是我到目前为止尝试过的:
  • 我确实尝试过 https://github.com/react-native-community/cookies .到目前为止,我只能通过以下功能保存 cookie:

  • //列出 cookie(仅限 IOS)
    CookieManager.getAll(useWebKit)
    .then((res) => {
    console.log('CookieManager.getAll from webkit-view =>', res);
    });

    但正如它所建议的那样,它只能在 iOS 中运行。我也无法在 WebView 中打开的网站中设置该 cookie 以保持该 session 处于事件状态。
  • 也用过这个,https://gist.github.com/kanzitelli/e5d198e96f81b7a8263745043766127c

  • 但我还没有发现任何成功。

    任何建议或解决方案将不胜感激。

    ====== 更新 ========

    对于安卓:

    它默认工作,
    这意味着我们只需要为 iOS 进行检查。

    最佳答案

    实际上这个问题存在于 react-native-webview

    Cookies are lost on iOS after application closing

    它应该通过 native 代码解决。但是今天我做了一个解决方案并用PHP网站进行了测试

    完整代码

    import React, {Component} from 'react';
    import {StyleSheet, SafeAreaView} from 'react-native';
    import {WebView} from 'react-native-webview';
    import CookieManager from '@react-native-community/cookies';
    import AsyncStorage from '@react-native-community/async-storage';

    let domain="http://example.com";

    export default class App extends Component {
    constructor(props) {
    super(props);
    this.currentUrl = '';
    this.myWebView = React.createRef();
    this.state = {
    isReady: false,
    cookiesString: '',
    };
    }

    jsonCookiesToCookieString = (json) => {
    let cookiesString = '';
    for (let [key, value] of Object.entries(json)) {
    cookiesString += `${key}=${value.value}; `;
    }
    return cookiesString;
    };

    componentWillMount() {
    this.provideMeSavedCookies()
    .then(async (savedCookies) => {
    let cookiesString = this.jsonCookiesToCookieString(savedCookies);
    const PHPSESSID = await AsyncStorage.getItem('PHPSESSID');
    if (PHPSESSID) {
    cookiesString += `PHPSESSID=${PHPSESSID};`;
    }
    this.setState({cookiesString, isReady: true});
    })
    .catch((e) => {
    this.setState({isReady: true});
    });
    }

    onLoadEnd = (syntheticEvent) => {
    let successUrl = `${domain}/report.php`;
    if (this.currentUrl === successUrl) {
    CookieManager.getAll(true).then((res) => {
    AsyncStorage.setItem('savedCookies', JSON.stringify(res));
    if (res.PHPSESSID) {
    AsyncStorage.setItem('PHPSESSID', res.PHPSESSID.value);
    }
    });
    }
    };
    onNavigationStateChange = (navState) => {
    this.currentUrl = navState.url;
    };


    provideMeSavedCookies = async () => {
    try {
    let value = await AsyncStorage.getItem('savedCookies');
    if (value !== null) {
    return Promise.resolve(JSON.parse(value));
    }
    } catch (error) {
    return {}
    }
    };

    render() {
    const {cookiesString, isReady} = this.state;
    if (!isReady) {
    return null;
    }
    return (
    <SafeAreaView style={styles.container}>
    <WebView
    ref={this.myWebView}
    source={{
    uri: `${domain}`,
    headers: {
    Cookie: cookiesString,
    },
    }}
    scalesPageToFit
    useWebKit
    onLoadEnd={this.onLoadEnd}
    onNavigationStateChange={this.onNavigationStateChange}
    sharedCookiesEnabled
    javaScriptEnabled={true}
    domStorageEnabled={true}
    style={styles.WebViewStyle}
    />
    </SafeAreaView>
    );
    }
    }

    const styles = StyleSheet.create({
    container: {
    flex: 1,
    backgroundColor: '#FFF',
    },
    WebViewStyle: {
    flex: 1,
    resizeMode: 'cover',
    },
    });

    细节:

    第一步:

    获取 cookies登录后保存在 AsyncStorage像这样
    onNavigationStateChange = (navState) => {
    this.currentUrl = navState.url;
    };
     onLoadEnd = () => {
    let successUrl = `${domain}/report.php`;
    if (this.currentUrl === successUrl) {
    CookieManager.getAll(true).then((res) => {
    AsyncStorage.setItem('savedCookies', JSON.stringify(res));
    if (res.PHPSESSID) {
    AsyncStorage.setItem('PHPSESSID', res.PHPSESSID.value);
    }
    });
    }
    };

    第 2 步:

    启用 sharedCookiesEnabled props 并在 componentWillMount 中获取保存的 cookie 并使其成为必需的 webview header cookies formate来自 jsonCookiesToCookieString功能并停止渲染 webview isReady props utils 你得到cookies
    jsonCookiesToCookieString = (json) => {
    let cookiesString = '';
    for (let [key, value] of Object.entries(json)) {
    cookiesString += `${key}=${value.value}; `;
    }
    return cookiesString;
    };
    provideMeSavedCookies = async () => {
    try {
    let value = await AsyncStorage.getItem('savedCookies');
    if (value !== null) {
    return Promise.resolve(JSON.parse(value));
    }
    } catch (error) {
    return {}
    }
    };
    componentWillMount() {
    this.provideMeSavedCookies()
    .then(async (savedCookies) => {
    let cookiesString = this.jsonCookiesToCookieString(savedCookies);
    const PHPSESSID = await AsyncStorage.getItem('PHPSESSID');
    if (PHPSESSID) {
    cookiesString += `PHPSESSID=${PHPSESSID};`;
    }
    this.setState({cookiesString, isReady: true});
    })
    .catch((e) => {
    this.setState({isReady: true});
    });
    }

    第 3 步:

    Webview Header 中传递 cookiesString并像这样编写渲染函数
    render() {
    const {cookiesString, isReady} = this.state;
    if (!isReady) {
    return null;
    }
    return (
    <SafeAreaView style={styles.container}>
    <WebView
    ref={this.myWebView}
    source={{
    uri: `${domain}`,
    headers: {
    Cookie: cookiesString,
    },
    }}
    scalesPageToFit
    useWebKit
    onLoadEnd={this.onLoadEnd}
    onNavigationStateChange={this.onNavigationStateChange}
    sharedCookiesEnabled
    javaScriptEnabled={true}
    domStorageEnabled={true}
    style={styles.WebViewStyle}
    />
    </SafeAreaView>
    );
    }

    关于react-native - 如何在 react-native-webview 中保持最后一个 Web session 处于事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62057393/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com