Запретить повторную установку приложения на Facebook - PullRequest
0 голосов
/ 11 декабря 2018

Кажется, есть проблема с моей реализацией логина Facebook для react-native

Когда я нажимаю «Войти в приложение Facebook», открывается приложение facebook, затем, когда я нажимаю «Продолжить«Это снова открывает мое приложение, но выполняет перемонтирование.Часть моей логики заключается в том, чтобы открыть другой модал после этого для получения некоторой дополнительной информации от пользователя, но вызов this.setState() в обратном вызове из входа в Facebook дает `Can't call 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, и, похоже, не существует какого-либо определенного способа заставить это произойти, это просто иногда случается, а затем пытаетсявойти снова сразу после того, как он обычно проходит

...