React Native,如何在应用程序从后台运行时获得用户本地身份验证?

ibrsph3r  于 2023-10-23  发布在  React
关注(0)|答案(2)|浏览(145)

好吧,我在网上找不到这样的东西,所以我希望有人能在这方面帮助我。
我正在创建一个裸露的react原生android应用程序,每当应用程序从后台运行时,我需要检查用户的本地身份验证。
我使用Expo Authentication来处理身份验证,但是,从React Native使用AppState检查应用状态是没有用的,因为每次身份验证屏幕(生物识别,面部识别甚至PIN码)显示在屏幕上时,AppState都会从活动变为后台,所以它需要一次又一次的身份验证,因为它总是来自“后台”。
我不能用变量控制它,因为我没有任何标识符可以告诉我应用程序来自世博会本地身份验证屏幕,所以我被困在这个“先有鸡还是先有蛋”的问题上。
以下是我到目前为止创建的用于处理它的组件的一部分:

AppState.addEventListener('change', _handleAppStateChange);

    return () => {
      AppState.removeEventListener('change', _handleAppStateChange);
    };
  }, []);

  const _handleAppStateChange = async (nextAppState: any) => {
    if (
      appState.current.match(/inactive|background/) &&
      nextAppState === 'active'
    ) {
      clearTimeout(authenticationRequiredTimeout);
      if (user && shouldAuthenticate) {
        LocalAuthentication.hasHardwareAsync().then((hasHardware) => {
          if (hasHardware) {
            LocalAuthentication.isEnrolledAsync().then((isEnrolled) => {
              if (isEnrolled) {
                LocalAuthentication.authenticateAsync().then(
                  (authentication) => {
                    if (authentication.success !== true) {
                      logout();
                    }
                    setShouldAuthenticate(false);
                    console.log(authentication);
                  },
                );
              }
            });
          }
        });
      }
    } else {
      let timeout = setTimeout(() => {
        setShouldAuthenticate(true);
      }, 5000);
      setAuthenticationRequiredTimeout(timeout);
    }
    console.log(shouldAuthenticate);
    appState.current = nextAppState;
    console.log('AppState', appState);
  };```

Any help would be much appreciatted
slmsl1lt

slmsl1lt1#

我遇到了同样的问题,并解决了它如下:
我的应用程序包含一个商店(只是类的单个示例)。在这个商店中,我添加了一个属性temporarilyMovedToBackground。每当我调用Expo的localAuthentication时,我首先将temporarilyMovedToBackground属性设置为true。调用完成后,我再次将其设置为false,超时为1000。然后,在检查appState是否更改为后台时,我还检查temporarilyMovedToBackground是否为false。

0pizxfdo

0pizxfdo2#

我让它变得简单了一点。我只是记录应用程序进入存储后台的时间。当状态变为“active”时,我比较时间差,如果这个时间差大于我需要的延迟,我就调用身份验证方法。

export const useAppStateCheck = () => {
    const verificationHandle = () => {
      // YOURT BOI AUTH CODE HERE...
    };

    const changeAppStateListener = async (status: AppStateStatus) => {
        if (status === "background") {
            const date = Date.now();
            await Storage.set("temporaryMovedToBg", date);
        }

        if (status === "active") {
            const date = await Storage.get("temporaryMovedToBg");
            if (Date.now() - Number(date) >= CONFIG.BIO_AUTH_EXPIRATION_TIME) verificationHandle();
        }
    };

    useEffect(() => {
        const subscription = AppState.addEventListener("change", changeAppStateListener);
        return subscription.remove;
    }, []);
};

相关问题