Я особо не считал, но похоже, что в каждом другом мобильном приложении, с которым я сталкиваюсь в настоящее время, есть функция входа в Facebook. В последнее время я много изучаю react-native и считаю его чертовски удивительным с точки зрения не такой уж крутой кривой обучения. Вместо того, чтобы писать традиционное «Учебное пособие Hello World для react-native», я решил написать руководство о том, как с нуля интегрировать Facebook Login в приложение для react native.

Давайте начнем с базовой, очень простой схемы / каркаса приложения, которое мы попытаемся создать:

В процессе этого, к концу этого поста, вы изучите следующие концепции:

  • обработка навигации в приложении, поддерживающем реакцию
  • как интегрировать сторонний плагин в приложение, поддерживающее реакцию (для реализации входа в facebook)
  • выполнение вызова api графика (для получения информации из профиля facebook)

Я не буду здесь подробно останавливаться на каждой строчке кода, но постараюсь выделить суть изложенных выше концепций. Для справки вы можете открыть / клонировать / форкнуть следующий репозиторий git для примера проекта:



Создание приложения с поддержкой React и настройка навигатора

Сначала убедитесь, что среда настроена. Обратитесь к этому документу для настройки среды. Перейдите в командную строку и создайте новое собственное приложение React, используя простую команду:

react-native init FacebookLoginProject

Это создаст новый проект с заданным именем.

Настроим навигатор для нашего приложения. Откройте index.ios.js и внутри функции рендеринга основного компонента вместо представления по умолчанию мы возвращаем следующий код:

render() {
  return (
    <Navigator
      initialRoute={{id: 'FirstScreen', name: 'Index'}}
      renderScene={this.renderScene.bind(this)}
      configureScene={(route) => {
          if (route.sceneConfig) {
            return route.sceneConfig;
          }
          return Navigator.SceneConfigs.FloatFromRight;
        }} />
  );
}
renderScene(route, navigator) {
  var routeId = route.id;
  if (routeId === 'FirstScreen') {
    return (
      <FacebookLoginScreen
        navigator={navigator} />
    );
  }
  if (routeId === 'Homepage') {
    return (
      <Homepage
        navigator={navigator} />
    );
  }
}
  • в компоненте Navigator (из модуля response-native) маршрут обозначается простым объектом javascript с идентификатором и именем (вы можете добавлять дополнительные параметры в качестве объектов в маршрут).
  • initialRoute - это объект, обозначающий маршрут, который будет отображаться первым.
  • renderScene ожидает, что функция (в данном примере renderScene) будет описывать, какой маршрут какой компонент должен выполнять.
  • configureScene - это просто функция, которая возвращает конфигурацию того, как мы хотим отображать компонент в маршруте.

Интеграция сторонних плагинов (react-native-fbsdk)

Мы будем использовать следующую оболочку с открытым исходным кодом, чтобы добавить в наше приложение функцию входа в facebook:



После установки плагина (желательно с помощью rnpm) вам необходимо создать приложение на панели управления Facebook, чтобы начать использовать facebook apis. Этот процесс может быть немного обременительным, если вы делаете это впервые. Просто обратитесь к этим шагам, чтобы создать приложение. Теперь давайте создадим компонент FacebookLoginScreen.

componentWillMount () {
  console.log(AccessToken)
  AccessToken.getCurrentAccessToken().then(
    (data) => {
      if(data) {
       this.goToHomePage(); 
      }
     }
  )
}
  • Этот конкретный код в компоненте проверяет, вошел ли пользователь уже в систему. Если он вошел в систему, мы получим токен доступа, и в этом случае мы вызываем функцию, которая вызывает определенный маршрут для домашней страницы, просто заменяя маршрут в навигатор следующим образом:
goToHomePage(accessToken) {
  this.props.navigator.replace({id: 'Homepage'});
}
  • Теперь мы визуализируем кнопку входа в систему следующим образом (LoginButton доступен из модуля response-native-fbsdk, установленного выше):
render() {
  return (
    <View style={styles.container}>
      <LoginButton
        onLoginFinished={
          (error, result) => {
            if (error) {
              alert("login has error: " + result.error);
            } else if (result.isCancelled) {
              alert("login is cancelled.");
            } else {
              AccessToken.getCurrentAccessToken().then(
                (data) => {
                  this.goToHomePage();
                }
              )
            }
          }
        }
      />
    </View>
  );
}
  • onLoginFinished ожидает функцию обратного вызова, которая описывает поведение приложения после входа в систему. В текущем примере мы хотим перенаправить пользователя на домашнюю страницу в соответствии с каркасами.

Выполнение вызова api графика

Теперь давайте попробуем определить целевой экран после входа в систему (компонент Homepage в нашем примере).

constructor() {
  super();
  this.state = {
    name : '',
    pic : ''
  }
}
  • Этот конструктор просто устанавливает начальное состояние для компонента домашней страницы.
render() {
  return (
    <View style={styles.container}>
      <Text style={styles.welcomeMsg}>Welcome</Text>
      <Text style={styles.name}>{this.state.name}</Text>
      <Image source={{uri:this.state.pic}} style={styles.image} />
      <LoginButton
        onLogoutFinished = {() => {
          this.props.navigator.replace({id:'FirstScreen'})
        }}
      />
    </View>
  );
}
  • Вышеупомянутый метод рендеринга компонента Homepage возвращает представление, содержащее два текстовых узла и изображение. Обратите внимание, что все символы внутри "{}" означают, что это javascript, а не jsx. (JSX используется для придания компонентам вида структуры html, к которой мы все так привыкли. Прочтите this, чтобы узнать больше о JSX)
{this.state.name}
  • приведенный выше оператор просто заменит выражение значением выражения javascript.
//Create response callback.
_responseInfoCallback = (error, result) => {
  if (error) {
    alert('Error fetching data: ' + error.toString());
  } else {
    this.setState({name: result.name, pic:              result.picture.data.url});
  }
}

componentWillMount() {
  // Create a graph request asking for user information with a callback to handle the response.
  const infoRequest = new GraphRequest(
    '/me?fields=name,picture',
    null,
    this._responseInfoCallback
  );
  // Start the graph request.
  new GraphRequestManager().addRequest(infoRequest).start();
}
  • Вышеупомянутый блок кода отвечает за вызов api графа. Для этого мы используем модуль GraphRequest, который также предоставляется «react-native-fbsdk», например LoginButton.
  • this.setState - важный метод (здесь часто случаются ошибки), который гарантирует, что компоненты будут повторно отрисованы при получении ответа от API.
  • ** Обратите внимание, что следующий код НЕ РАБОТАЕТ вместо this.setState
this.state = {name: result.name, pic:        result.picture.data.url}
  

Окончательное приложение теперь должно выглядеть примерно так:

Не стесняйтесь, присылайте мне любые вопросы относительно проекта по адресу [email protected].

Удачного кодирования.

Ваше здоровье !!!