RN GoogleSignin 本机模块未正确链接。请仔细阅读自述文件、设置和故障排除说明 Expo+ Firebase JS SDK

问题描述 投票:0回答:1

我对世博会有疑问。我正在使用 RN 谷歌登录来实现跨平台谷歌登录以及 Firebase JS-sdk

网络上

错误

未捕获错误:RN GoogleSignin 本机模块不正确 已链接。请阅读自述文件、设置和故障排除说明 小心。如果您使用的是 Expo,请确保您使用的是 Custom dev 客户,不是世博会去

当我使用googole登录按钮时发生错误 像那样 注册屏幕.tsx

import {GoogleSignin,GoogleSigninButton} from '@react-native-google-signin/google-signin';

//...
<GoogleSigninButton
            size={GoogleSigninButton.Size.Wide}
            color={GoogleSigninButton.Color.Light}
           // onPress={}
            //disabled={}
            style={{ width:'100%', height:SIZES.xxSmall}}
          />

app.json:

"ios": {
      "config": {
        "usesNonExemptEncryption": false
      },

      "supportsTablet": true,
      "bundleIdentifier": "bundleIdentifier",

    },
    "android": {
      "adaptiveIcon": {
        "foregroundImage": "./src/assets/adaptive-icon.png",
        "backgroundColor": "#ffffff"
      },

      "package": "my package"
    },
    "web": {
      "bundler": "metro",
      "favicon": "./src/assets/favicon.png"
    },
    "experiments": {
      "tsconfigPaths": true
    },
    "extra": {
      "eas": {
        "projectId": "projectId"
      }
    },
    "plugins": [
      
      "expo-font",
      **"@react-native-google-signin/google-signin"**
    ],
    "owner": "owner"

metro.config.ts


const { getDefaultConfig } = require("expo/metro-config");

module.exports = (() => {
  const config = getDefaultConfig(__dirname);
  const { transformer, resolver } = config;
  config.transformer = {
    ...transformer,
    babelTransformerPath: require.resolve("react-native-svg-transformer")
  };
  config.resolver = {
    ...resolver,
    assetExts: resolver.assetExts.filter((ext:any) => ext !== "svg"),
    sourceExts: [...resolver.sourceExts, "svg",'cjs','mjs','d.ts',
  ]
  };
  
  
  return config;
})();

package.json:

dependencies:{
    "firebase": "^10.7.0",
    "@react-native-google-signin/google-signin": "^11.0.0",
    "@reduxjs/toolkit": "^1.9.7",
     "expo": "^50.0.0",
    "expo-auth-session": "~5.4.0",
    "expo-crypto": "~12.8.0",
    "expo-dev-client": "~3.3.5",
    "expo-system-ui": "~2.9.3",
    "expo-web-browser": "~12.8.1",
    "react": "^18.2.0",
    "react-dom": "18.2.0",
    "react-hook-form": "^7.49.2",
    "react-native": "^0.73.2",}

GoogleLogin.tsx

import React,{useEffect ,useState} from 'react'
import * as WebBrowser from 'expo-web-browser';
import { makeRedirectUri } from 'expo-auth-session';
import app,{ auth,provider } from '../../../firebaseConfig';
import { 
  GoogleSignin,
  statusCodes,
  GoogleSigninButton,} from '@react-native-google-signin/google-signin';
 import {Web_Client_ID  } from "../../utils/clientKeys";


const GoogleLogin =() => {

 
 
  const googleSigninConfig = ():void =>{
    GoogleSignin.configure({
      webClientId:Web_Client_ID , 
      scopes: ["profile", "email"],
      offlineAccess: true, 
      forceCodeForRefreshToken: true, 
      profileImageSize: 120, 
    });
  }
  const onAuthStateChanged = (user:any)=> {
    if(user){
     console.log(user)
    }else{
      //set user info to null
    }
  }

  useEffect(() => {
    googleSigninConfig()
    getCurrentUserInfo()
    const subscriber = auth().onAuthStateChanged(onAuthStateChanged) 
      //triggered once user either log in or out 
    return subscriber;
  },[])


  const signinWithGoogle = async () => {//ongoogle btn press
    try {
        await GoogleSignin.hasPlayServices({ showPlayServicesUpdateDialog: true });
       
        const userInfo = await GoogleSignin.signIn();
        const {idToken, accessToken} = await GoogleSignin.getTokens()
        console.log(idToken,accessToken)
     
        const credential = 
        firebase.auth.GoogleAuthProvider.credential(idToken, accessToken,);
        await auth().signInWithCredential(credential); 
        
    }  catch (error :any) {
        if (error.code === statusCodes.SIGN_IN_CANCELLED) {
          console.log('SIGN_IN_CANCELLED')

        } else if (error.code === statusCodes.IN_PROGRESS) {
          console.log('IN_PROGRESS')

        } else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
          console.log('PLAY_SERVICES_NOT_AVAILABLE')

        } else {
          // some other error happened
        }
    }
  }

   
  //return nyll if user didnt signin previously
  const getCurrentUserInfo = async () => {
    try {
      const userInfo = await GoogleSignin.signInSilently()
      console.log(userInfo)
    } catch (error :any) {
        if (error.code === statusCodes.SIGN_IN_REQUIRED) {
          console.log('SIGN_IN_REQUIRED')
        } else {
          console.log('error')
           
        }
    }

  }
    
  const GoogleSignout = async ()=>{
    try {
      await GoogleSignin.revokeAccess()
      await GoogleSignin.signOut()
      //.then(() => alert('Your are signed out!'));
      // setloggedIn(false);
    } catch (error :any) {
           // Alert.alert('Something else went wrong... ', error.toString())
          }
  }
     
}

实现它的步骤 1_ Expo 管理工作流程

2_开发构建eas build --profile开发--platform android

3_ npx expo 安装@react-native-google-signin/google-signin

4_expo doctor 没有发现项目有任何问题

5_ npx expo 预构建 --clean

6_ npx expo 启动 --dev-client

在 android 模拟器上卡在启动屏幕中,没有任何问题“Android 捆绑完成”。

在网上给出上面的错误

github 文档说遵循自述文件说明,但与我的设置没有什么不同。 这个自述文件 https://github.com/react-native-google-signin/google-signin/blob/master/README.md 我做错了什么?这个错误的原因是什么? 或者是否缺少任何设置?

firebase react-native firebase-authentication expo google-signin
1个回答
0
投票

对于遇到类似问题的人, 它只是与 Web 平台的 Firebase 设置相关


import {Platform} from 'react-native';
import { initializeApp, } from "firebase/app";

import { getStorage } from 'firebase/storage';
import Constants from "expo-constants";
import AsyncStorage from "@react-native-async-storage/async-storage";
import { getFirestore, enableIndexedDbPersistence } from "firebase/firestore";

// @ts-ignore 
import{initializeAuth, GoogleAuthProvider , inMemoryPersistence,
  getReactNativePersistence,setPersistence,}from 'firebase/auth';

import firebase from "firebase/compat/app"
import 'firebase/compat/auth';
import 'firebase/compat/firestore';
import 'firebase/compat/functions';

let app: firebase.app.App;

 firebase.apps.length === 0 ?
 app = firebase.initializeApp(firebaseConfig)
:  app = firebase.app();
export const db = getFirestore(app);
const persistence = 
Platform.OS === 'web'                            //this line
            ?inMemoryPersistence as any         //this line
            :getReactNativePersistence(AsyncStorage);           
export const auth = initializeAuth(app, { persistence });
export const provider = new GoogleAuthProvider();
export const database = getFirestore();
const storage = getStorage(app);
export {app}

© www.soinside.com 2019 - 2024. All rights reserved.