React Native+Expoで始めるスマホアプリ開発

# 初めに
こんにちは。これが初めての投稿になります。

この記事は、株式会社富士通システムズウェブテクノロジーが企画する
[いのべこ夏休みアドベントカレンダー2020](https://qiita.com/jugemsan/items/5761773308fb1df0c23a) の30日目の記事です。

参加の機会を頂き、感謝の限りです。ありがとうございます!!! :bow:
`本記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません。`

# 背景
スマホアプリ開発に興味があったものの、物ぐさで重い腰が上がりませんでした・・・

最近、朝・夜のウォーキングをするようになり、体重とフットワークが軽くなったことで、
興味があったアプリ開発勉強欲が再燃してきたので、`React Native + Expo`を使って
今学んでいることを書いていきたいと思います。

今回、WebViewを使って、Qiita画面をAndroidエミュレータで表示する所までを記載します。
これからスマホアプリ開発を始めたいという方に、React Native + Expoを知って頂き、
スマホアプリ開発導入の手助けになれば嬉しい限りです。:relaxed:

# React Native とは？
Facebook が開発したJavaScriptであり、iOSとAndroidのアプリ開発を行うことが可能な、
クロスプラットフォームフレームワークとなります。ロジックは、Reactのお作法に則り、
JavaScriptとJSXと呼ばれるXMLライクなマークアップを使い記述します。
Reactを勉強したことがある人にとっては、学習コストが低くなります。

# Expo とは？
React Nativeでの開発を、よりお手軽にするツールとなります。
変更がリアルタイムに反映(ホットリロード)されるため、WEB感覚の開発が可能となります。
作成後のアプリをリリースする際、最初の審査のみで、その後は審査不要でアップデートが
可能のようです(※OTAアップデート)。
デメリットとして、ネイティブモジュールが使えないことや、また基本Expoが提供している
APIのみ利用といった点が挙げられます。

# アプリ開発
前段はこれぐらいにして、そろそろアプリ開発の話に入っていきたいと思います。

## 事前準備
・JDK(Java Development Kit)のインストール
・Node.jsのインストール
　[公式サイト](https://nodejs.org/ja/)より事前にNode.jsをダウンロードします。
　ダウンロード後、下記コマンドでインストール可否をチェックします。

```
$ node --version
```

・VSCode, Android Studioのインストール
　・VSCode
　　[MicroSoftのダウンロードページ](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)よりVSCodeをインストールします。
　・Android Studio
　　[Googleのダウンロードページ](https://developer.android.com/studio/index.html)よりAndroid Studioをインストールします。
　　その上で、エミュレータを作成し、起動できるようにしておく必要があります。

## Expoインストール
[公式サイト](https://expo.io/learn)の手順に従い導入します。

１．npmコマンドを利用して`global`インストールを実施します。

```
$ npm install expo-cli --global
```

２．expoコマンドでプロジェクトを作成します。
　下記コマンドでは、`myApp`のプロジェクトを作成します。

```
$ expo init myApp
```

　コマンド実行すると対話モードが始まり、プロジェクトのテンプレートを選択します。

```
┌─────────────────────────────────────────────────────────────────────────┐
│                                                                         │
│   There is a new version of expo-cli available (3.25.0).                │
│   You are currently using expo-cli 3.22.3                               │
│   Install expo-cli globally using the package manager of your choice;   │
│   for example: `npm install -g expo-cli` to get the latest version      │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
? Choose a template: (Use arrow keys)
  ----- Managed workflow -----
> blank                 a minimal app as clean as an empty canvas
  blank (TypeScript)    same as blank but with TypeScript configuration
  tabs (TypeScript)     several example screens and tabs using react-navigation and TypeScript
  ----- Bare workflow -----
  minimal               bare and minimal, just the essentials to get you started
  minimal (TypeScript)  same as minimal but with TypeScript configuration
```

　今回、シンプルモードでの作成としますので、`blank`テンプレートを選択します。
　テンプレート選択後、`myApp`プロジェクトのフォルダが作成されます。

３．作成されたmyAppフォルダに移動して、npmコマンドにより`node_modules`を
　　インストールします。

```
$ cd myApp
$ npm install
```

　ここまでの操作が完了することで、開発出来る環境が整います。
　`myApp`のディレクトリ構造は、下記のようになります。
　![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683402/e5e7c3a5-a09b-f193-7bd2-45d66be39e99.png)
　開発は、`App.js`を修正して進めていくことになります。

## Expo起動
Androidエミュレータと連動して動作確認を実施するために、エミュレータを
事前に起動しておきます。エミュレータを起動後、下記コマンドによりExpoを起動します。

```
$ expo start
```

起動すると、下記画面が表示されます（QRコード部分は加工しています）。
※画面が表示されない場合、http://localhost:19002/ にアクセスして下さい。
![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683402/0f895f94-07fb-5ad7-fe34-50486f881381.png)
こちらの画面を利用することで、エミュレータおよび実機による開発が可能となります。

## ExpoとAndroidエミュレータの接続
Expo画面の`Run on Android device/emulator`をクリックします。
下記のような画面が表示されていれば、Expoとエミュレータの接続OKとなります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683402/1b0266a2-2b90-d940-74ef-41f94b3c479d.png" alt="pic3" width="350"/>

## WebViewを利用した実装
WebViewを利用して、Qiita画面をAndroidエミュレータ上に表示したいと思います。
表示するQiita記事は、[いのべこ夏休みアドベントカレンダー2020](https://qiita.com/jugemsan/items/5761773308fb1df0c23a)の画面にしたいと思います。

まずは、下記コマンドにより必要なライブラリをインストールします。
※コマンド実行は、作成されたmyAppフォルダ下で実施下さい。

```
$ expo install react-native-webview
```

インストール後、ExpoとAndroidエミュレータを再起動下さい。
再起動しない場合、正しくJSファイルが読み込まれず、エラーとなることがあります。
Expo再起動の際は、オプション`-c`を付与することでキャッシュクリアを行い起動します。

次に、`App.js`を下記のように修正します。${URL}には、表示させたいURLを指定します。
※今後のことを考慮すると、`View`や`SafeAreaView`タグでWebViewをネストしておく
　のが良いです。しかし、ネストされたWebViewの`uri`では、指定するURLのローディングが
　実施されない問題が確認できたために、下記の記載のようにシンプルな記載としています。

```js
import React from "react";
import { StyleSheet } from "react-native";
import { WebView } from "react-native-webview";

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
  },
});

export default function App() {
  return (
    <WebView
      sytle={styles.container}
      source={{ uri: ${URL} }}
    />
  );
}
```

最後に、修正した`App.js`を保存します。
保存後、Androidエミュレータにリアルタイム反映され、直ぐに結果確認が出来ます。
WebViewの`uri`に設定したURL先が表示されていますので、今回の検証は成功になります!!!:v:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683402/c2628b23-3c7f-8d47-5ad7-daa4599a6c20.png" alt="pic4" width="350"/>

## 実機を利用する場合
実機を利用する場合、iOSまたはAndroidで`Expo Clientアプリ`のインストールが必要です。
アプリインストール後、Expo画面のQRを読み込むことで動作確認が可能となります。
Expoを起動するネットワークと、同一ネットワークで操作する必要がありますが、
コードを繋ぐ必要が無く実機で確認できることは大きなメリットだと思います。

# おわりに
現状、WebViewを利用してAndoroidエミュレータに表示する部分を行いました。
今後は、Prettierを組込み整形ルールを定義したり、`Props`や`State`を利用して、
情報の引き渡しやComponentの状態を変更する対応などを実装していきたいと考えています!!!
※Componentには、`Class Component`と`Function Componet`の2種があるようなので、
　このあたりの違いも意識して進めていけたらと思っています。

# 参考資料
参考にさせて頂きました。ありがとうございました。  :bow: 
・[React Nativeとは何なのか](https://qiita.com/Iwark/items/7c27e919bb71f8b256f6)
・[expoによるReact Nativeのおさらい（最低限）](https://qiita.com/zaburo/items/b47bfe27d0b8910a1488)
・[ExpoのOTAアップデートとrelease-channelについてまとめてみた。](https://qiita.com/kaba/items/b6e777d1c0b7ce1f78c6)
・[Windows10でAndroidStudioの環境構築](https://qiita.com/k_moto/items/cefb4bca13f6a99b2ea2)
・[ExpoでAndroidエミュレータが起動しない場合](https://qiita.com/krile136/items/47b2e2cf2a7e586b6da3)