iOS,Android両OSのアプリを開発するための手法検討

# 概要
クロスプラットフォーム開発のまとめは色々な所にあるので改めてここでまとめる必要はないかもしれませんが、個人的に整理したかったのでまとめます。結局この手の話は結論(これがいい！)というのはなく、開発する人やその時の状況によって変わってくると思うのであくまで参考程度に。

# 開発手法
## まとめ
|手法|使用言語|特徴|
|:--:|:--:|:--:|
|ネイティブ|iOS:Swift<br>Android:Kotlin|ネイティブアプリ|
|Cordova|HTML,JS,CSS|WebViewベース|
|Xamarin|C#|ネイティブアプリ|
|Unity|C#|ゲーム用|
|Cocos2d-x|C++|ゲーム用|
|TitanumMobile|JS|WebViewベース|
|React Native|JSX,JS,CSS|ネイティブアプリ|
|Swift|Swift|ネイティブアプリ|
|Kotlin|Kotlin|ネイティブアプリ|

## トレンド
<img width="1159" alt="スクリーンショット 2017-12-19 23.54.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/eef5353c-3935-de14-5504-4f8d75618106.png">
https://trends.google.co.jp/trends/explore?q=react%20native,Cordova,Xamarin,Titanum

## ネイティブ
* iOSをSwift(Objective-C)で、AndroidをKotlin(Java)で開発するパターン
* リソースが十分にあるならこれが一番いいと思う
* この後出てくるワンソースで両OSのアプリを開発できる手法でも**必ずそれぞれのOSの知識は必要になってくる**と思うので複雑なアプリを作ろうとすればするほど逆にネイティブで書いた方が良いということはありそう

## Cordova
* WebViewベースでアプリ開発ができる
* 基本はWebベースの技術でアプリを開発するため言語としてはHTML,JS,CSSを使う
* [Monaca](https://ja.monaca.io/)を使った開発が一般的
  * MonacaとはCordovaアプリを開発するために特化した統合開発環境
* Hello Worldくらいならすぐにできる(以下iOSの場合)

```
$ npm install -g cordova
$ cordova create MyApp
$ cd MyApp
$ cordova platform add ios
$ cordova run ios
```
* 参考
  * [Apache Cordova](https://cordova.apache.org/)

## Xamarin
* XamarinはMicrosoftよりVisual Studioの一部として提供されている
* C#で開発する
* XamarinのAPIはネイティブのAPIを100％移植しており**ロジックの共通化が可能**
* Xamarin.Formsを使うとUIの共通化もできるが一部しか提供されていない
* そのため共通化としてはだいたい60%くらいが妥当のよう
* 参考
  * [10分間で分かった気になれるXamarin概要](http://www.buildinsider.net/mobile/xamarin/01)
  * [Xamarin(ザマリン) とはなんぞや](https://qiita.com/amay077/items/38ee79b3e3e88cf751b9)

## Unity
* ゲーム開発エンジン
* GUIでの開発ができる。必要に応じてコードを書く
* コードはC#で開発する。JSでの開発もできるがUnity用のJSになっている
* 参考
  * [【入門者必見】Unityとは？意味や特徴、特性、使い道を徹底解説](https://www.sejuku.net/blog/6616)

## Cocos2d-x
* ゲーム開発フレームワーク
* C++で開発する
* 参考
  * [Cocos2d-x超入門 そもそも何からはじめればいいの？](https://qiita.com/kanacha/items/97d020c04ff311eca735)

UnityとCocos2d-xではUnityの方がよく使われていそう
<img width="1150" alt="スクリーンショット 2017-12-24 17.14.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/cc754390-67e8-79f0-f7cd-93e763056dd5.png">
https://trends.google.co.jp/trends/explore?q=Unity,Cocos2d

* [UnityとCocos2d-xを比較 開発環境で割と本気で悩んだ話](http://taiyoproject.com/post-415)

## TitanumMobile
* WebViewベースでアプリ開発ができる
* JSで開発できる
* **Cordovaとの違いはネイティブのUIコンポーネントをJSで扱えるところ**
* 2011年頃少し流行ったが現在はあまり積極的に使われているイメージがない(ReactNativeなどが出てきたためだと思われる)
* 参考
  * [Titanium 最近の動向 (2016年)](https://www.slideshare.net/tdtsh/titanium-2016)

## React Native
* JSX,JS,CSSを使って開発できる
* WebViewではなくあくまでもJavaScriptランタイムでNativeのAPIを叩いて、Naitveによる描画を実現しています
* 最近話題のライセンス問題ではReactの方はMITに変わったが、ReactNativeは未だBSDになっている
* 参考
  * [React Nativeとは何なのか](https://qiita.com/Iwark/items/7c27e919bb71f8b256f6)

## Swift
* Swiftを使ってAndroidアプリも開発する
* Androidの簡単なプログラムであればSwiftで開発ができる
* 但し、まだ一般的な感じはせず実用性もあまり高くなさそう
* グーグルがKotlinを正式サポートする前はJavaのライセンス問題でOSSのSwiftを採用するのでは！？という噂も一部あった(あくまで噂..)
  * [グーグルの「Swift」採用はあり得るのか、アプリ開発言語を考える](http://ascii.jp/elem/000/001/148/1148860/)
* 参考
  * [Androidの開発コードにSwiftを使用する](https://www.infoq.com/jp/news/2016/05/swift-for-android)

## Kotlin
* Kotlinを使ってiOSアプリも開発する
* Kotlin/Nativeを使ってKotlinをネイティブコードにコンパイルできる
* 参考
  * [Kotlin/Nativeを使ってiOSアプリを作ってみる](https://qiita.com/noripi/items/4ee969c48b3da5ca6fbd)

# 参考資料
 * [【2017】結局RailsユーザーがiPhone&Androidアプリを作る一番良い方法はなんなのか？→「Xamarin ハイブリッド」がいいと思います](http://blog.sesere.net/entry/2017/12/03/203149)
 * [iOSもAndroidも同時に開発できる！クロスプラットフォーム開発ツール7個 | フリーランス大学](https://futurizm.jp/jobs/columns/crossplatform)
 * [ネイティブアプリ開発はReact Native一本でいいんじゃないか説](https://comemo.io/entries/2464)