1

我是 react native 初学者,我使用最新版本的 react-native 和 expo 创建了应用程序。该应用程序在 iPhone 和 android 上expo go启动,我可以通过单击按钮启动网络浏览器。网络浏览器显示我公司的登录页面,成功登录后,用户应在特定屏幕上重定向到应用程序,其中包含我需要在我的应用程序中继续的值(下面的代码片段中的值“myCode”)。

但深度链接实际上打开了我的应用程序的一个新实例(从 expo 服务器再次下载捆绑包),而不是仅仅将已经运行的应用程序带到前台。然后当我再次启动登录过程时,深层链接会打开我的应用程序而无需再次下载应用程序,但是当我尝试处理重定向时立即崩溃,但出现以下异常:“找不到变量:常量”。我真的不明白这个错误,想得到帮助。如果您知道如何在 react-native 中使用链接,您可能可以帮助我。

我尝试了这些深层链接。从我的公司登录页面调用它们以将用户发送回应用程序:

exp://127.0.0.1:19000/success?code={mycode}

exp://fa-p2b.<myExpoUser>.test.exp.direct:80/success?code={mycode}

即使在用户第一次完成登录时没有再次下载捆绑包,本地主机链接也能正常工作。但它仍然因同样的警告而崩溃。

这是我用来处理重定向回应用程序的代码:

export default class StartScreen extends React.Component {
    state = {
        redirectData: null,
    };

    render() {
        return (
            <TouchableOpacity onPress={_openBrowserAsync}>
                    <Image
                        source={require('../assets/button.png')}
                        style={{ width: 200, height: 100 }}
                    />
                </TouchableOpacity>
        );
    }
};

_openBrowserAsync = async () => {
    try {
        this._addLinkingListener();
        let result = await WebBrowser.openBrowserAsync(
            `https://mycompany.com/login`
        );

        if (Constants.platform.ios) {
            this._removeLinkingListener();
        }

        this.setState({ result });
    } catch (error) {
        alert(error);
        console.log(error);
    }
};

_handleRedirect = (event) => {
    alert("handle redirect")
    alert(event.url)
    alert("passed eventurl")
    if (Constants.platform.ios) {
        WebBrowser.dismissBrowser();
        alert("dismissedBrowser")
    } else {
        alert("_removeLinkingListener")
        this._removeLinkingListener();
        alert("_removeLinkingListener")
    }
    alert("parse")
    let data = Linking.parse(event.url);
    alert("parse")
    this.setState({ redirectData: data });
    alert("setState")
};

_addLinkingListener = () => {
    Linking.addEventListener("url", this._handleRedirect);
};

_removeLinkingListener = () => {
    Linking.removeEventListener("url", this._handleRedirect);
};

_maybeRenderRedirectData = () => {
    if (!this.state.redirectData) {
        return;
    }

    return (
        <Text style={{ marginTop: 30 }}>
            {JSON.stringify(this.state.redirectData)}
        </Text>
    );
};

在用户登录函数_handleRedirect被调用后,我看到了第一个警报, alert("handle redirect") 但随后它崩溃了Can't find variable: Constants

代码基本上取自这里: https ://github.com/expo/examples/blob/master/with-webbrowser-redirect/App.js

4

2 回答 2

2

缺少导入:

import Constants from 'expo-constants';

-> 解决了常量警告。(我不习惯即使缺少导入也能编译的编程语言,这就是为什么我被困在这个简单的事情上)之后深度链接也起作用了。

于 2021-04-03T15:22:38.717 回答
0

我设法通过以不同方式处理 iOS 和 Android 用例来解决这个问题:

      if (EXPOCONSTANTS.platform.ios) {
        result = await WebBrowser.openAuthSessionAsync(u_r_l);
        saveToken(result.url);
      }else{
        result = await WebBrowser.openBrowserAsync(u_r_l);
      } 

我希望这对将来的人有所帮助。

于 2021-08-10T17:36:03.827 回答