Android、iOSアプリの勉強に手を出せずにいる方へ

##はじめに

エンジニアの皆さん、年末の追い込み、お疲れ様です。

2017年を振り返って、
Android、iOSアプリ開発・勉強したいけど全然手が出せてないな・・・
と、勉強を見送りにしてしまって後悔されている方、いらしゃいませんか？？

上記に当てはまる方へ**クロスプラットフォーム開発**に携わることをおすすめします。

##理由

まず、なんで勉強を見送ってしまったんだろう、
という**理由**を解析してみましょう。

- 業務がいそがしくて・・・
- 他に優先して勉強したいことがあった。

上記は仕方ないですね。
来年機会がありましたら頑張りましょう。:sweat_smile:

- Android、iOSどちらの勉強をするか迷っている。
- 異なる言語、SDKを覚えないといけないのはコストがかかる。

といったような**理由**で、
いまいち勉強のスタートを切れない方が多いのではないかと思います。

わかります。。。自分もその一人です。

ただ、クロスプラットフォーム開発に携わったおかげで、
自分は、2016年下旬からようやくAndroid、iOSの勉強がスタートできました。

その実体験をベースとして、
クロスプラットフォーム開発を行うことで得られるメリット、
また、どのような手法があるのかを紹介させていただきます。

##クロスプラットフォーム開発に携わるメリット

**クロスプラットフォーム開発**をオススメする理由を説明します。

クロスプラットフォーム開発と呼ばれる言語、フレームワークは、
いくつか存在しますが、共通して以下のメリットが得られます。

- 言語が統一できる。
- Android、iOSSDKの仕組みを同じレベルで勉強できる。
- 勉強して苦しいこともあるけど楽しい！

「**言語が統一できる。**」
まず、言語が統一できるというのは大きなメリットですね。
どの言語もプログラミングの基本は一緒と思っていますが、
文法が異なるだけで、コードを書くコストも大きくなりますからね。

「**Android、iOSSDKの仕組みを同じレベルで勉強できる。**」
クロスプラットフォーム開発用の言語やフレームワークでは、
ある程度プラットフォーム共通化ができるようなAPIをサポートしてくれていますが、
GPS・カメラ等のデバイス機能等は、Android、iOS独自で実装、
共通処理で呼び出す的な実装が必要となります。

例えば、クロスプラットフォーム開発ではなく、
それぞれのプラットフォーム・言語でカメラ制御処理を利用する際、

- Android
    - AndroidManifest.xmlに`android.permission.CAMERA`のパーミッションを追加
- iOS
    - Info.plistに`NSCameraUsageDescription`の設定を追加

のような設定を追加後、
Android、iOS各々の手法でカメラ制御処理を実装する必要があります。

上記のような実装は、クロスプラットフォーム開発でも同様です。[^1]

[^1]: 一部機能はフレームワークがサポートしていてくれたり、他開発者がライブラリとして公開してくれています。

このようにアプリをAndroid、iOS向けに展開することを想定している際、
機能を実現するために、各々のプラットフォーム毎の実装方法を学習する必要があるため、
Andorid、iOSに対しての知識を同じレベルで蓄えていくことができます。

「**勉強して苦しいこともあるけど楽しい！**」

クロスプラットフォーム開発は、
フレームワーク、プラットフォーム毎の知識が必要となるため、
問題発生→調査→エラー解消のサイクルが多く発生することが苦しいですが、
**プラットフォーム毎の処理を部分的に記述、あとは共通処理を記述するだけで、
プラットフォーム毎にアプリが動く**ので、「俺ってやればできるじゃん！」的な感覚となり、
開発していて楽しくなります！

##クロスプラットフォーム開発方法紹介

では、実際にどのような言語・フレームワークでクロスプラットフォーム開発が行えるのか、
紹介していきたいと思います。

###Kotlin

<img width="200" alt="kotlin_logo.png" src="https://qiita-image-store.s3.amazonaws.com/0/140704/695458e5-3d4a-68a9-81a6-24f6fa924bde.png">


え？KotlinってWebとAndroidアプリ開発向けでないの？
と思われた方もいらっしゃるかと思います。

2017年の[KotlinConf](https://www.kotlindevelopment.com/kotlin-conf-2017/)というカンファレンスにて、
iOS向けにも開発できるよ！的な発表がありました。

iOS用のAPIのコード補完等が効かない等、
まだ実案件には向かないと思いますが、
2017年のKotlinの人気を見ていると・・・
いずれ流行っていくのではないかと思います！

ちなみに[KotlinConfのアプリ](https://github.com/jetbrains/kotlinconf-app)はクロスプラットフォーム向けに作られているそうです。

年末年始に1,2時間暇ができましたら、
さっとダウンロードして一読してみてください。

###ReactNative
<img width="200" alt="reactnative_logo.png" src="https://qiita-image-store.s3.amazonaws.com/0/140704/b14eb3ee-2ff8-9142-021d-6996e8208fd2.png">


ReactというJavascriptのフレームワークがありますよね。
Reactをベースとして、
クロスプラットフォーム向けに開発されたのが、ReactNativeです。

ざっくり特徴を説明します。

- ReactNativeはReact同様、Javascript(スクリプト言語)で記述する。
- レイアウトはcssで記述。
- ネイティブアプリと遜色ないパフォーマンスで動作する。[^2]

[^2]: 仕組みを説明すると、JSから各プラットフォームのネイティブアプリにビルドし、動作するようなイメージです。

[公式サイト](https://facebook.github.io/react-native/showcase.html)を見ると、**Facebook**や**Instagram**のような
多くの方が知っているようなアプリでも採用されている事例を見ると、
まだまだこれから流行る可能性が大きいと思います。

以下記事にて、ReactNativeのハンズオン手順を公開されています。
ありがたいことです。:joy:

[React Nativeハンズオン〜initからtodoアプリ実装まで〜](https://qiita.com/togana/items/1f9580474436b826c0f3)

###Xamarin
<img width="200" alt="Xamarin_logo.png" src="https://qiita-image-store.s3.amazonaws.com/0/140704/af37f9de-555b-0764-56f0-163b70a112c8.png">

ざっくり特徴を説明します。

- C#でロジック、Xaml(ザムル)でレイアウトの記述が可能。[^3]
- Visual Studioにてコード補完がサポートされているため、コーディングしやすい。
- 頻繁にハンズオンが行われており、参加することでスタートしやすい。

もう少し掘り下げます。

「**C#でロジック、Xaml(ザムル)でレイアウトの記述が可能。**」

Xamarinは大きく２つの開発手法に別れています。

<img width="593" alt="Xamarin.png" src="https://qiita-image-store.s3.amazonaws.com/0/140704/4344ccec-de7a-6370-45cc-95c0ddec0830.png">

上記画像の左がXamarin.Native、右がXamarin.Formsという手法となります。

Xamarin.Nativeはビジネスロジックは共通し、
UI側はプラットフォーム毎の方法で実装する手法になります。

Xamarin.FormsはXamarin.Native+UI側も共通化する、
というような手法で、
「**C#でロジック、Xaml(ザムル)でレイアウトの記述が可能。**」は、
Xamarin.Formsの方を指しています。

Xaml(ザムル)は主にWPF,UWPでオブジェクトを定義できるマークアップ言語です。
主に画面レイアウト作成時に使用されています。

「**頻繁にハンズオンが行われており、参加することでスタートしやすい。**」

MicrosoftにてXamarinを買収した経緯もあるのか、
Web(ASP.NET Azure)、モバイルアプリ(Xamarin)をC#で実装可能！
という開発手法をベースとしたハンズオンをよく開いていただいてます。

また、[JXUGというXamarinのコミュニティ](http://jxug.org/)が発足されており、
所属するメンバーの方の登壇・LT・ハンズオンも行われています。

[techplayで"xamarin"と検索](https://techplay.jp/event/search?keyword=xamarin&pref=&pref=)すると、
2017年12月現在で、ハンズオンが3つも開催されています。

[神保町 Xamarin.Android ハンズオン](https://techplay.jp/event/648085)
[Xamarin.Forms 対応開発ツールを用いた効率的な iOS/Android アプリケーション開発入門ハンズオン](https://techplay.jp/event/650796)
[JXUG　Xamarin.iOS & Xamarin.Androidハンズオン！](https://techplay.jp/event/650970)

他にも、XLSOFT様にて[Xamarin入門者向けの日本語情報](https://www.xlsoft.com/jp/products/xamarin/documents.html)をまとめていただいてます。

[^3]: F#も可能です。[VisualBasicは制限が多い](https://www.xlsoft.com/jp/products/xamarin/xamarin-forms_visual-basic.html)ですが、共通ロジックの部分だけなら記述可能なようです。

##まとめ

一読いただきありがとうございました。

クロスプラットフォーム開発の手法も色々あったと思いますが、
どれか興味のある手法はありましたでしょうか？

どの手法もまだまだこれから流行っていくものと思いますので、
一番気に入られた手法に挑戦してみるのがベターかと思います。

もし迷われている場合は、
現在、皆さんが持たれているスキルを鑑みて、

・.net(C#,VB)の経験が多い
　→**Xamarinに挑戦しよう！**
・web側(Javascript,css)の経験が多い
　→**ReactNativeに挑戦しよう！**

という選択もいいと思いますし、

・新たな言語を経験したい or Javaの経験が多い
　→**Kotlinに挑戦しよう！**

という選択も有りかと思います！
あくまで自分のための勉強なので、好きな手法を選択しましょう！

##おわり、あとがき

改めて一読ありがとうございました。

年始から勉強頑張ろう！という気持ちになっていただけたのなら、
最高に嬉しいです。

また、投稿が遅れてすみません。。。:sob:

本記事で2記事目となりますが、
内容や構成考えるのって大変ですね。。。

言語やフレームワーク問わず、行き詰まったこと際に何気なくググって、
解決策が記載されている記事を何気なく閲覧してきましたが、、、
実際に投稿してみると、投稿するまでにとても手間がかかっているのだなと感じました。

自分も色々な記事にお世話になった分、
これからアウトプットしていこうという気持ちにもなりました！

来年は１ヶ月毎に2記事投稿できたらいいな・・・なんて思います。。。

最後に投稿のきっかけをくださった[Rossoメンバのみなさん](https://qiita.com/organizations/rosso-tokyo)に
感謝して本記事を終了したいと思います。
ありがとうございました。