代码之家  ›  专栏  ›  技术社区  ›  Peyotle

在iOS上反应本机WebView缺少会话cookie

  •  5
  • Peyotle  · 技术社区  · 7 年前

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

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

    它在Android上工作得很好,但在iOS上却不行。

    昨天,我尝试了许多不同的方法,比如用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设备上进行了测试。

    总结一下问题: 为什么我在fetch中得到的cookie没有仅在iOS上传递给WebView。

    2 回复  |  直到 7 年前
        1
  •  2
  •   David    6 年前

    使用属性 sharedCookiesEnabled={true} 在webView中。这对我的情况有效。

        2
  •  1
  •   Peyotle    7 年前

    我发现了问题。缺少Cookie仅仅是由错误的“用户代理”标题导致的错误授权的结果。 我试图在WebView标题中传递用户代理。它在android上运行良好,但需要iOS的变通方法。 要在iOS上设置用户代理标头,需要从AppDelegate更改UserDefaults。

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

    感谢您的回答: https://stackoverflow.com/a/37917932/3055378