PR TIMESデザイナー&エンジニアブログ BREAK TIMES

PR TIMES Developer Blog(デザイナー&エンジニアによる開発者ブログ)

PR TIMES Developer Blog

当ブログは下記URLに移転しました。
https://developers.prtimes.jp/

React NativeでサクッとIOSアプリを作ってみた

PR TIMESエンジニアの吉です。本日はスマートフォンアプリ開発について話したいと思います。

基本的にIOSアプリはSwiftObjective-CAndroidJavaで開発しますが学習コストが必要です。シンプルなアプリあるいはプロトタイプのアプリなど早くアプリを作りたい場合はSwiftjavaを使わなくても作れる方法はいろいろあります。 Monaca, PhoneGap, Titanium Mobile, React Native...

私はプロジェクト性質や開発メンバーのスキルなどを考慮してどれを選ぶのかを決めるべきたと思っています。適切な判断をするためには様々な技術を積極的に触ってみるのがいいでしょう。

このブログで紹介したいのはReact Nativeです。 f:id:breaktimes:20160422133322p:plain

開発元はfacebookjavascriptを使ってとても簡単にアプリを開発できるのが特徴です。今年のF8イベントのアプリもReact Nativeで開発したようでダウンロードして使ってみたらすごく完成度が高いアプリでした。

F8

F8

ソースコードも公開されているので本格的に勉強してみたい方はぜひ中身を確認してみてください。 github.com

本ブログではReact Nativeの公式ドキュメントのチュートリアルを参考にして書きました。 instagram APIとReact Nativeを使用して簡単なIOSアプリを作ってみました。

準備

1.homebrewでファイル監視ツールのwatchmanとjavascriptチェッカーツールのflowをインストールする

brew install watchman flow

2.node4.0以上のバージョンをインストール - nvmかnodebrewを利用バージョンコントロールすることをおすすめ

3.xcode7.0以上のバージョンをインストール

セットアップ

1.react nativeのcliをインストール

npm install -g react-native-cli

2.react nativeのプロジェクトファイルを作成する

react-native init react_ios_app

上記のコマンドで生成されたreact_ios_app/index.ios.jsファイルを修正します。

ソースコードの解説

使用するコンポーネントを読み込み

import React, {
  AppRegistry,
  Component,
  Image,
  ListView,
  StyleSheet,
  Text,
  View,
} from 'react-native';

InstagramのリクエストURLを定義

アクセストークン生成方法についてはInstagramデベロッパーページを参照してください。

var ACCESS_TOKEN = '';
var API_URL = 'https://api.instagram.com/v1';
var PARAMS = '/users/self/media/recent/?access_token=' + ACCESS_TOKEN;
var INSTAGRAM_REQUEST_URL = API_URL + PARAMS;

クラスとコンストラクタの定義

みなさんご存知のようにクラスが生成されるときに呼び出されるconstructorにリスト表示で使用するListViewのデータソースを初期化します。

class react_ios_app extends Component {

  constructor (props) {
    super(props);
    this.state = {
       dataSource: new ListView.DataSource({
         rowHasChanged: (row1, row2) => row1 !== row2, }),
         loaded: false,
    };
  }

Instagram APIから取得したデータをセットする

componentDidMountはコンポーネントがロードされた直後に1回だけ呼び出されます。

  componentDidMount() {
    this.fetchData();
  }

  fetchData() {
    fetch(INSTAGRAM_REQUEST_URL)
      .then((response) => response.json())
      .then((responseData) => {
        this.setState({
          dataSource: this.state.dataSource.cloneWithRows(responseData.data),
          loaded: true,
        });
      })
      .done();
  }

レンダリング

Instagram APIコール前はローディングの文字をAPIからデータ取得完了後は実データをリストに表示する処理です。

  render() {
    if (!this.state.loaded) {
      return this.renderLoadingView();
    }
    return (
      <ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderMovie}
        style={styles.listView}
      />

    );
  }

  renderLoadingView() {
    return (
      <View style={styles.container}>
        <Text>
          Loading Photos ...
        </Text>
      </View>
    );
  }

  renderMovie(feed) {
    return (
      <View style={styles.container}>
        <Image
          source={{uri: feed.images.thumbnail.url}}
          style={styles.thumbnail}
        />
        <View style={styles.rightContainer}>
          <Text style={styles.title}>{feed.caption.text}</Text>
          <Text style={styles.year}>{feed.caption.created_time}</Text>
        </View>
      </View>
    );
  }
}

スタイル設定

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  thumbnail: {
    width: 150,
    height: 150,
  },
  rightContainer: {
    flex: 1,
  },
  title: {
    fontSize: 13,
    marginBottom: 8,
    textAlign: 'center',
  },
  year: {
    fontSize: 13,
    textAlign: 'center',
  },
  listView: {
    paddingTop: 20,
    backgroundColor: '#F5FCFF',
  },
});

全てのソースコードに関しては私のGitHubに公開しました。

github.com

iosアプリをビルドする

react-native run-ios


react native ビルド

感想

react nativeを利用するためにはreact.jsの使い方をある程度覚えないといけないことに気づきました。それにしてもswift,javaを使わずjavascriptだけで数時間でシンプルなアプリを開発できるのはすごく嬉しいですね。

使い方次第ではfacebookのf8アプリのような洗練されたアプリも開発できますし、ほぼ同じコードでIOS, Androidのアプリが同時開発できます。React Nativeは現時点でバージョン0.24です。メージャーリリースはしてないので仕事で導入するのはまだ早いと思いますが、これからもっと使いやすく高機能になると思いますのでみなさんもぜひ使ってみてはいかがでしょうか。