React NativeでサクッとIOSアプリを作ってみた
PR TIMESエンジニアの吉です。本日はスマートフォンアプリ開発について話したいと思います。
基本的にIOSアプリはSwiftかObjective-C、AndroidはJavaで開発しますが学習コストが必要です。シンプルなアプリあるいはプロトタイプのアプリなど早くアプリを作りたい場合はSwift、javaを使わなくても作れる方法はいろいろあります。 Monaca, PhoneGap, Titanium Mobile, React Native...
私はプロジェクト性質や開発メンバーのスキルなどを考慮してどれを選ぶのかを決めるべきたと思っています。適切な判断をするためには様々な技術を積極的に触ってみるのがいいでしょう。
このブログで紹介したいのはReact Nativeです。
開発元はfacebookでjavascriptを使ってとても簡単にアプリを開発できるのが特徴です。今年のF8イベントのアプリもReact Nativeで開発したようでダウンロードして使ってみたらすごく完成度が高いアプリでした。
ソースコードも公開されているので本格的に勉強してみたい方はぜひ中身を確認してみてください。 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, }; }
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に公開しました。
iosアプリをビルドする
react-native run-ios
感想
react nativeを利用するためにはreact.jsの使い方をある程度覚えないといけないことに気づきました。それにしてもswift,javaを使わずjavascriptだけで数時間でシンプルなアプリを開発できるのはすごく嬉しいですね。
使い方次第ではfacebookのf8アプリのような洗練されたアプリも開発できますし、ほぼ同じコードでIOS, Androidのアプリが同時開発できます。React Nativeは現時点でバージョン0.24です。メージャーリリースはしてないので仕事で導入するのはまだ早いと思いますが、これからもっと使いやすく高機能になると思いますのでみなさんもぜひ使ってみてはいかがでしょうか。