如何在react-native-webview中保持最后一个网络会话处于活动状态?

2024-02-16

我正在开发一个应用程序,在该应用程序中我需要使用户的最后一个网络会话保持活动状态react-native-webview.

这是所需的工作流程。

  • 我的应用程序只有一个 WebView,其中有固定的 url 正在加载。

  • 用户将打开应用程序并登录该网站。

  • 当用户杀死应用程序并再次打开它时,我需要保持该用户登录,因为他上次已经登录了。

这是我到目前为止所尝试的:

  • 我确实尝试过https://github.com/react-native-community/cookies 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 以保持该会话处于活动状态。

  • 也用过这个,https://gist.github.com/kanzitelli/e5d198e96f81b7a8263745043766127c https://gist.github.com/kanzitelli/e5d198e96f81b7a8263745043766127c

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

任何建议或解决方案将受到高度赞赏。

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

对于安卓:

它默认工作, 这意味着我们只需要针对 iOS 检查这一点。


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

应用程序关闭后,iOS 上的 Cookie 会丢失 https://github.com/react-native-community/react-native-webview/issues/528

它应该通过本机代码来解决。但今天我做了一个解决方案并用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',
  },
});

Detail:

Step 1:

get cookies https://github.com/react-native-community/cookies登录并保存后异步存储 https://github.com/react-native-community/async-storage像这样

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);
        }
      });
    }
  };

Step 2:

enable sharedCookiesEnabledprops 并在 componentWillMount 中获取保存的 cookie 并制作为必需的webview header cookies 格式 https://github.com/react-native-community/react-native-webview/blob/v10.1.0/docs/Guide.md#managing-cookies by jsonCookiesToCookieString函数并停止渲染 webviewisReadyprops utils 你得到cookie

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});
      });
  }

Step 3:

将 cookiesString 传入网页视图标题 https://github.com/react-native-community/react-native-webview/blob/v10.1.0/docs/Guide.md#managing-cookies并像这样编写渲染函数

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>
    );
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在react-native-webview中保持最后一个网络会话处于活动状态? 的相关文章

  • 获取所有连接的用户 (Laravel 5)

    如何显示我家中所有已连接的用户 这是一个非常基本的方法 但希望是检测两者的有效方法Guest and RegisteredLaravel5 应用程序上的用户 Step 1 打开文件config session php并将驱动程序更改为数据库
  • 使用 https 的 Web 服务身份验证给出错误

    我编写了一个简单的 Web 服务 并使用摘要和 HTTPS 身份验证来保护它 我已经使用 Java 中的 keytool 生成了我的证书 当我通过创建 war 文件在 Tomcat 中部署 Web 服务时 axis 的欢迎页面正确显示 但是
  • 在同一服务器上的 2 个子域中安装 2 个 WordPress 时共享用户

    我有 2 个 WordPress 网站 位于 2 个不同的子域中 例如test1 abc com and test2 abc com 这两个网站都激活了 wp require 插件 只有登录用户才能看到该网站 我们想要创建一个系统 如果用户
  • PHP7.1上读取会话数据失败

    分享一个我遇到的问题 现已解决 在我的开发机器上 我使用 PHP 运行 IIS 我升级到 PHP7 突然我的代码不再工作 返回此错误 session start 读取会话数据失败 用户 路径 C WINDOWS temp 看起来像是权限问题
  • 使用 ASP.Net 和 Ajax 的登录页面

    我正在尝试使用 html ajax 和 ASP NET 制作登录页面 数据确实传递给 ajax 函数 但是当我调试 asp 页面时 用户名和密码以 NULL 发送 该代码应该获取用户名和密码 然后返回用户 ID html页面 div Use
  • 测试 CodeIgniter 会话变量的正确方法是什么?

    获取以下代码片段 测试确保会话变量不为空的最佳方法是什么 如果稍后在我的脚本中 我调用以下内容 第一个打印正确 但在第二个我收到消息 未定义的变量 已登录 我尝试过使用 empty and isset 但两者均未成功 我还尝试使用向后执行
  • 如何使用我自己的自定义身份验证服务使用团队机器人对用户进行身份验证?

    我在 azure 上创建了一个机器人 并在机器人注册通道中注册了它 现在 我想使用我自己托管的自定义身份验证服务 例如 https domainname auth 来使用机器人对用户进行身份验证 我不知道该怎么做 我已阅读 bot 框架文档
  • websockets 如何处理同一浏览器的两个选项卡

    I have 1 个 PHP 服务器 提供 http 请求 和 1 node js 发布更新的数据消息 每个连接都带有 websocket php 服务器设置其 cookie 在一个浏览器中 此 cookie 可在所有选项卡中使用 当浏览器
  • 如何在 React Native 中使用相同的 Firebase 数据库在两个应用程序之间进行通信?

    我有两个不同的应用程序使用相同的实时数据库 在第一个应用程序中 我发送的订单包含一些要保存在数据库中的数据字段 在另一个应用程序中 我只添加一个侦听器 firebase database ref userOrder currentUser
  • 公式无效:/usr/local/Homebrew/Library/Taps/facebook/homebrew-fb/buck.rb

    我运行了brew 命令来安装Facebook homebrew tap 我有一个 M1 Apple Silicon 芯片组 并使用 Rosetta 下的终端来执行 brew 命令 brew tap facebook fb 我收到错误消息 g
  • 如何保护Web应用程序免受cookie窃取攻击?

    我的网络应用程序的身份验证机制目前非常简单 当用户登录时 网站会发回一个存储的会话 cookie 使用localStorage 在用户的浏览器上 但是 此 cookie 很容易被窃取并用于从另一台计算机重播会话 我注意到其他网站 例如 Gm
  • 如何使用 AngularJS ngView 为未经授权的用户隐藏模板?

    我有一个基本的 PHP 应用程序 其中用户登录信息存储在 HTTP 会话中 该应用程序有一个主模板 例如index html 它使用 ngView 切换子视图 如下所示 div div 现在 这个主模板可以通过基本的 PHP 控件进行保护
  • TypeError:cli.init 不是 React Native 的函数

    在 MacBook Air M1 芯片中运行 npx react native init appName 时 TypeError cli init is not a function at run opt homebrew lib node
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • ASP.NET Core 2.0禁用自动质询

    将我的 ASP NET Core 项目升级到 2 0 后 尝试访问受保护端点不再返回 401 而是重定向到 不存在的 端点以尝试让用户进行身份验证 应用程序所需的行为只是返回 401 以前我会设置AutomaticChallenge fal
  • 从 swagger UI 将 Jwt 令牌作为不记名令牌传递到标头中不起作用

    我正在生成 jwt 令牌 Web api 核心应用程序 在应用程序中 我使用 swagger 并应用了不记名令牌身份验证 但是当我尝试从 swagger UI 传递不记名令牌时 我收到 401 错误 请有人帮助我解决这个问题 service
  • 使用 OWIN 自托管 WebApi 进行声明身份验证

    我使用以下配置自托管 WebApi Visual Studio 2012 NET 4 0 public void Configuration IAppBuilder appBuilder var config new HttpConfigu
  • 建立了无需 SSL 即可进行安全注册和身份验证的 javascript 解决方案

    有没有无需 SSL 即可实现安全用户注册和身份验证的解决方案 安全 我的意思是免受被动窃听 不是来自中间人 http en wikipedia org wiki Man in the middle attack 我知道只有带有签名证书的 S
  • 生成 Flask 中使用的签名会话 cookie 值

    我正在用另一个需要将项目注入会话的 Flask 服务器代理 Flask 服务器 两台服务器具有相同的密钥 因此加密签名将相同 当使用 Flask 和会话时 http 响应包含一个 Set Cookie 标头session text 其中 t
  • Phonegap 上基于 Cookie 的身份验证

    我面临基于phonegap cookie的身份验证的问题 在我强制iPhone关闭我的应用程序 双击物理按钮并关闭 后 我丢失了与服务器建立的cookie 我怎样才能避免它 有什么配置吗 或者有替代方法吗 当我第一次运行它时它工作正常 当我

随机推荐

  • Gridview动态添加新行

    我有一个文件上传控件 并且有一个按钮 上传 因此当单击通风口触发时 我希望在 gridview 中创建一个新行并获取文件名并绑定到列并将其显示在页面上 请问有什么想法该怎么做吗 这是代码 protected void Button1 Cli
  • Android - 将对象传递给另一个活动

    我正在利用以下类 我将其作为对象 http pastebin com rKmtbDgF http pastebin com rKmtbDgF 我正在尝试使用以下方式传递它 Intent booklist new Intent getBase
  • JDK 1.8.0_92 Nashorn JS 引擎indexOf 行为

    我在 java8 中使用 nashorn javascript 引擎在运行时评估一些表达式 我有一个 util 类 方法如下 public static String evaluateJavaScriptExpression String
  • Android向viewpager添加了圆圈指示器[重复]

    这个问题在这里已经有答案了 您好 我创建了一个视图寻呼机 但有谁知道我如何在页面视图上显示代表分页的圆圈 我认为它提供了一个指示器 但我不完全确定 这是迄今为止包含我的视图寻呼机的代码 public class LevelSelect ex
  • TFS 与 VSTS 的未来

    微软还在开发这两种产品吗 TFS 的开发是否已被放弃而转而支持 VSTS 就上下文而言 我们现在正在使用 TFS 而 VSTS 显然具有更好的集成性 特别是 Microsoft Teams 和 ZenDesk 这对于让我们的工作流程处于更易
  • (Android)如何填充ListView背景并保持标题透明度

    我有一个自定义图像背景 它填充 ListView 后面的整个屏幕 ListView 有一个包含一些数据的标题 然后是一个透明的 10dp 边距 允许我们看到一点背景图像 然后是更多数据 在这个标题下方 在 ListView 的 主体 中 我
  • Laravel 4 查询生成器 - 具有复杂的左连接

    我是 Laravel 4 的新手 我有这样的疑问 SELECT a id active name email img location IFNULL b Total 0 AS LeadTotal IFNULL c Total 0 AS In
  • 使用新的用户名和密码更新 vsts-npm-auth

    我已经安装了vsts npm auth使用以下命令进行打包 npm install g vsts npm auth registry https registry npmjs com 我跑了vsts npm auth config npmr
  • Nuget 4安装在哪里

    Visual Studio 2017 附带 Nuget 4 0 0 但是 它没有放置在路径上 在哪里可以找到使用 CLI 的 nuget 可执行文件 视觉工作室 2017不使用NuGet exe而是使用扩展名NuGet为了达成这个 您应该能
  • 正则表达式解析CSS选择器

    我想解析这个 CSS 选择器 以及其他类似形式的选择器 div class1 myid class2 key value 并让它匹配 class1 和 class2 但我不知道要使用什么正则表达式 例子 http www rubular c
  • 使用 gitlab runner 安装 hostpah 卷的正确方法是什么?

    我需要创建一个卷来公开 maven m2 文件夹 以便在我的所有项目中重用 但我根本无法做到这一点 我的 gitlab 运行程序作为容器在我的 kubernetes 集群中运行 遵循部署和配置图 apiVersion extensions
  • 如何使用 Ms Access 日期/时间扩展数据类型

    访问女士表明有一种名为 日期 时间扩展 的数据类型 其中 日期 时间扩展数据类型存储日期和时间信息 与日期 时间数据类型类似 但它提供更大的日期范围 更高的小数精度以及与 SQL Server datetime2 日期类型的兼容性 但是 我
  • 将一个目录和子目录中的所有文件复制到单个位置[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 以下是将所有 txt 文件从一个位置复制到另一个位置的代码
  • 使用 Objective-C/Cocoa 启动 Mac 应用程序

    使用命令行启动路径查找器应用程序时 我使用open a Path Finder app Users 基于这个想法 我使用以下代码来启动路径查找器 我可以在不使用的情况下启动应用程序吗open命令行 NSTask task task NSTa
  • 恒定值变化

    假设我有一个结构体定义 struct thing thing x int z thing x this z 0 void foo const this gt x gt z 请注意 我创建了一个指向我自己的可变指针 邪恶的笑 然后我可以像这样
  • React Router v4 - 使用不同的查询参数重定向到相同的路由

    设想 有一个主页 搜索用户将被重定向到带有查询参数 例如 q abc 的搜索页面 现在在搜索页面上 用户再次尝试搜索不同的值 因此他再次被重定向到相同的搜索页面 但具有不同的查询参数 例如 q xyz Problem 当我尝试使用不同的查询
  • 嵌套 mybatis 映射

    我不知道如何在复杂的对象中使用 mybatis 结果 我有以下映射器类 public interface StationMapper MapKey stationId Map
  • Hibernate 根据条件选择顶部和底部 n 行

    假设我有两个表 书籍和评论 评论有一个列 星星 其值可以在 1 到 5 之间 一本书可以有许多评论 我如何选择所有书籍 以便使用 Criteria API 仅返回每本书的顶部和底部 3 条评论 而不是所有评论 如果 Criteria API
  • 有没有好的 jQuery 拖放文件上传插件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在react-native-webview中保持最后一个网络会话处于活动状态?

    我正在开发一个应用程序 在该应用程序中我需要使用户的最后一个网络会话保持活动状态react native webview 这是所需的工作流程 我的应用程序只有一个 WebView 其中有固定的 url 正在加载 用户将打开应用程序并登录该网