我想在加载Web应用之前在Web视图中注入访问令牌。基本上,Web应用程序将从浏览器存储中读取访问令牌,并使用它来调用安全API。
申请流程如下:
我尝试过的事情:
代码:
// Inject Access Token
_injectAccessToken = () => {
const script = `window.sessionStorage.setItem("access_token", "token")`;
this.webview.injectJavaScript(script);
};
// Render
<WebView
ref={ref => (this.webview = ref)}
source={{ uri: `` }}
onLoadStart={this._injectAccessToken}
domStorageEnabled={true}
/>;
需要解决的问题:
现在,我想摆脱视图加载和注入之间的竞争状况。我并不一定要使用此解决方案,只要在视图加载之前进行注入,其他任何技巧或解决方案都可以。
任何对其他文章的引用或建议,都将受到赞赏。
答案 0 :(得分:1)
我能够解决这个问题并将应用投入生产。
那时,我使用的是 React Native 自带的 WebView。效果不太好,所以不得不切换到新的分离包:https://www.npmjs.com/package/react-native-webview
在 WebView 上使用以下道具:
<WebView
ref={ref => (this.webview = ref)}
source={{ uri: "SOME_URL" }}
onLoadStart={() => this._injectAccessTokenOnLoad(params)}
startInLoadingState
useWebKit
javaScriptEnabled
domStorageEnabled
/>
在加载方法中注入访问令牌:
_injectAccessTokenOnLoad = (params) => {
// Assuming that we are passing an object for "params"
// No need to stringify if you are passing a string or a number
const value = JSON.stringify(params);
const script = `
setTimeout(() => {
window.sessionStorage.setItem("SOME_KEY", '${value}');
}, 100);
`;
this.webview.injectJavaScript(script);
};
答案 1 :(得分:0)
使用componentWillMount()
方法或constructor()
(请参阅React native component lifecycle)为存储增加价值
然后使用本机AsyncStorage
来增加存储价值。
import AsyncStorage from '@react-native-community/async-storage';
...
async componentWillMount() {
await AsyncStorage.setItem('key', 'value');
}
注意::react-native先前的AsyncStorage
API已被弃用,以后将被删除。它是作为separate API (@react-native-community/async-storage)