Issue
Unable to Open React Native WebView Using Deep Link from Email in iOS Simulator
I'm developing a React Native
app with a WebView
that should display a password reset page. This page is hosted locally during development http://localhost:3000/reset-password
. The goal is to open this WebView
in my app when a user clicks on a deep link in an email. The email is sent to the user whenever he tries to set his password. I did this using AWS
and the link that is sent to the user to reset the password is the following:
link:http://localhost:3000/reset-password?token=${jwt.sign({ data: userMatch }, config.app.secret, {expiresIn: "1h", algorithm: <jwt.Algorithm>config.app.algorithm})}
What Works
The WebView
loads correctly when I manually navigate to it within the app.
Communication between my web content and React Native
component is functional; I can navigate back to the Login screen from the WebView.
What Doesn't Work
When clicking the deep link from an email, the link opens in the browser outside of my app instead of navigating to the WebView
within the app.
My DeepLinking Configuration is found in App.tsx
const linking = {
prefixes:["localhost:3000","yourapp://"],
config:{
screens:{
// Reset:"reset-password",
Local:"reset-password"
}
}
}
const App = () => {
const [initialURL, setInitialURL] = useState(null);
useEffect(() => {
Linking.getInitialURL().then((url:any) => {
if (url) {
setInitialURL(url);
}
});
}, []);
return (
<>
<QueryClientProvider client={queryClient}>
<StatusBar backgroundColor="white" barStyle="dark-content" ></StatusBar>
<NavigationContainer linking={linking}>
<Stack.Navigator initialRouteName='Login' screenOptions={{ headerStyle :{
backgroundColor: 'white',
}}}>
<Stack.Screen name="Login" component={LoginScreen} initialParams={{ initialURL }} options={{headerShown:false}} />
<Stack.Screen name="Home" component={MyTabs} options={{ headerShown: false}}/>
<Stack.Screen name="Reset" component={ResetPasswordScreen} options={{headerShown:false}}/>
<Stack.Screen name="Local" component={LocalWebViewScreen} options={{headerShown:false}} />
</Stack.Navigator>
</NavigationContainer>
</QueryClientProvider>
</>
)
}
const styles= StyleSheet.create({
container:{
flex:1,
backgroundColor:'#121212',
}
})
export default App;
/// And this is the LocalWebviewComponent
that renders my react web page running on localhost:3000
LocalWebview.tsx
const LocalWebViewScreen = ({route}:any) => {
const navigation = useNavigation<StackNavigationProp<RootStackParamList>>();
const webViewRef = useRef(null);
const handleMessage = (event:any) => {
const message = event.nativeEvent.data
if(message === "navigateBack"){
console.warn("they are communicating")
navigation.navigate("Login")
}
}
const token = route.params?.jwt
const url = `http://localhost:3000/reset-password?token=${token}`;
return (
<WebView
javaScriptEnabled={true}
domStorageEnabled={true}
startInLoadingState={true}
ref={webViewRef}
source={{ uri: url }}
onMessage={handleMessage}
/>
);
};
export default LocalWebViewScreen;
Solution
AFAIK you cannot test deep links on iOS simulator from e2e.
If you wanna test if your can handle your link use npx uri-scheme open "exp://127.0.0.1:19000/--/reset-password" --ios
Docs are here
Answered By - Michael Bahl
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.