iOS 上的 React Native WebView 缺少会话 cookie

React Native WebView missing session cookies on iOS

我的 WebView 应显示具有 cookie 身份验证的网页。 该页面需要一个在登录时获取的会话 ID cookie。 为了进行身份验证,我使用 fetch() 将登录请求发送到网站。

登录成功后,我可以看到收到了正确的 cookie。 成功后,我将启动 WebView。

它在 Android 上完美运行,但在 iOS 上运行不佳。

昨天我尝试了很多在 SO 上建议的不同方法,比如使用 react-native-cookie 手动获取 cookie,但没有任何帮助。

下面是一个示例组件,其功能与我的应用相同。我认为问题可能出在我的应用程序配置上,所以我创建了这个非常简单的示例,它也有同样的问题。

export default class App extends Component {
constructor(props) {
  super(props)
  this.state = {
    response: null,
  }
}

async componentDidMount() {
  const response = await this.logIn()
  console.log('LogIn completed', response)
  this.setState({
      response: response
    })
}

async logIn() {
  const url = 'myurl/login?email=email&password=password'
  const headers = {'MyHeader': 'Header text'}
  try {
    let response = await fetch(url, {
      method: 'POST',
      headers: headers,
      // credentials: 'same-origin',
      credentials: 'include',
    })
    return Promise.resolve(response)
  } catch (error) {
    return Promise.reject(error)
  }
}

render() {
  const url = 'myurl/dashboard'
  const headers = {'MyHeader': 'Header text'}
  return (
    <WebView source = {{
      uri: url,
      headers: headers
    }}
    />
  )
}
}

我在 iOS 9 和 iOS 11 模拟器以及 iOS 11 设备上测试了它。

总结一下这个问题:为什么只有 iOS 时我通过提取得到的 cookie 没有传递到 WebView。

我找到问题了。 cookies的缺失只是错误的'User-Agent'header导致授权错误的后果。 我试图在 WebView header 中传递 User-Agent。它在 android 上工作正常,但需要 iOS 的解决方法。 要在 iOS 上设置 User-Agent header,您需要从 AppDelegate 更改 UserDefaults。

NSString *userAgent = @"YourUserAgentString";
NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:userAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

感谢这个回答:https://whosebug.com/a/37917932/3055378

在 webView 中使用 属性 sharedCookiesEnabled={true}。它在我的案例中有效。