代码之家  ›  专栏  ›  技术社区  ›  Jordan

阻止Facebook登录重新安装应用程序

  •  0
  • Jordan  · 技术社区  · 7 年前

    我的Facebook登录实现似乎有问题 react-native

    当我点击“使用Facebook应用程序登录”时,它会打开Facebook应用程序,然后当我点击“继续”时,它会重新打开我的应用程序,但它会执行重新安装。我的一部分逻辑是在那之后打开另一个模式,从用户那里获取一些额外的信息,但是调用 this.setState() 在facebook的回调中,登录名给出了一个'不能对未装载的组件调用setstate(或forceupdate)。我好像不知道该怎么解决这个问题。

    facebookLogin = async () => {
      let result;
      try {
        this.setState({
          loggingInWithFacebook: true
        }) 
        LoginManager.setLoginBehavior('native');
        result = await LoginManager.logInWithReadPermissions(['public_profile', 'email']);
      } catch (nativeError) {
        this.setState({
          loggingInWithFacebook: false
        })
        this.props.dispatch(openSnackBar({
          message: "There was an error opening facebook to login"
        }))
      }
      if (result.isCancelled) {
        this.setState({
          loggingInWithFacebook: false
        })
      } else {
        this.FBGraphRequest('first_name, last_name, id, email', this.FBLoginCallback);
      }
    }
    FBGraphRequest = async (fields, callback) => {
      const accessData = await AccessToken.getCurrentAccessToken();
      const infoRequest = new GraphRequest('/me', {
        accessToken: accessData.accessToken,
        parameters: {
          fields: {
            string: fields
          }
        }
      }, callback);
      new GraphRequestManager().addRequest(infoRequest).start();
    }
    FBLoginCallback = async (error, result) => {
      if (error) {
        this.setState({
          loggingInWithFacebook: false
        });
      } else {
        const {id, picture, ...rest} = result
        this._handleSocialLogin({...rest, facebook: id})
      }
    }
    _handleSocialLogin = (data) => {
      this.props.dispatch(socialLogin(data)).then(res => {
        this.props.dispatch(getGroups()).then(res => {
          this.setState({
            loggingInWithFacebook: false,
            loggingInWithGoogle: false
          })
          AsyncStorage.getItem('onBoarded').then((res)=> {
            if (res === 'true') {
              this.props.navigation.navigate("Map")
            } else {
              this.props.navigation.navigate("OnBoarding")
            }
          })
        }).catch(err => console.log(err.response.body))
      }).catch(err => {
        if (err.err === 'not found') {
          this.setState({
            enterPhoneModalVisible: true,
            socialData: data
          })
        } else {
          this.props.dispatch(
            openSnackBar({
              message: "There was an error logging in, please try again"
            })
          );
          this.setState({
            loggingInWithFacebook: false,
            loggingInWithGoogle: false
          })
        }
      })
    }
    

    编辑:

    我的AppDelegate如下所示

    #import <FBSDKCoreKit/FBSDKCoreKit.h>
    

    在我的 didFinishLaunchingWithOptions

    return [RCTLinkingManager application:application
                   continueUserActivity:userActivity
                     restorationHandler:restorationHandler];
    
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    
      BOOL handledFB = [[FBSDKApplicationDelegate sharedInstance] application:application
        openURL:url
        sourceApplication:sourceApplication
        annotation:annotation
      ];
    
      BOOL handledRCT = [RCTLinkingManager application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
    
      return handledFB || handledRCT;
    

    编辑2:

    我好像是通过改变我的 openUrl 到下面

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    
      return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                     openURL:url
                                           sourceApplication:sourceApplication
                                                  annotation:annotation
       ] || [RCTLinkingManager application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
    }
    

    知道为什么吗?

    编辑3:

    我仍然得到一个 Login Failed 错误是随机发生的,似乎没有任何明确的方法可以导致这种情况的发生,只是有时会发生,然后在通常情况下会发生之后再次尝试登录

    0 回复  |  直到 7 年前