JavaScriptで簡単にiPhoneアプリを作成できるNativeScriptでiPhoneのカメラを起動してみた

#JavaScriptでスマホアプリが作れる！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/106459/94d1a1c2-b960-d871-42fd-46cc93d11947.png)

最近、スマホのネイティブアプリを作ることになり、[NativeScript](https://docs.nativescript.org/)を触る機会が増えたので自分の備忘録を兼ねて書いていきます。簡単とタイトルには書いたものの、日本語でのドキュメントが少なかったりするのでかなりハマる部分は多いです。

##NativeScriptとはWebの技術で作れるフレームワーク
JavaScriptやHTML/CSSといった技術要素でiOSやAndroidアプリを作ることができます。もちろん、Webアプリも作れます。
vanilla.js、Angular.js、Vue.jsで書くことができるというのが特徴だと思います。

##ネイティブアプリのフレームワーク
同じようにネイティブアプリをつくることができるフレームワークは以下のようなものがあります。

###[ReactNative](https://facebook.github.io/react-native/)
<img src="https://qiita-image-store.s3.amazonaws.com/0/106459/b8126ab8-0e39-177d-9c97-2e3cdc96da93.png" width=20%>
もっとも有名な気がします。Reactで書けるというのが大きいのかもしれません。
最近、転職で多くのベンチャー企業に面接に行きましたが、多くの企業が採用していました。

###[Apache Cordva](https://cordova.apache.org/)
<img src="https://qiita-image-store.s3.amazonaws.com/0/106459/7fc42ecd-dbbc-2655-0fc2-edd7ec940d65.png" width=20%>

webViewとネィティブの両方が使える。

###[Weex](https://weex.incubator.apache.org/)
<img src="https://qiita-image-store.s3.amazonaws.com/0/106459/e713de75-7ca5-e8fb-e768-5d890b2c22b5.png" width=30%>

Vue.jsで書けるのが特徴だと思います。

#カメラを起動させてみる（MacOS前提）
## 1. Node.jsのインストール
- [homebrew](https://brew.sh/index_ja)と[cask](https://caskroom.github.io/)をインストール

- nodebrewのインストール 
 
```
$ brew install nodebrew
```

- node.jsのインストール

```
$ nodebrew install-binary [latest/stable]
```

- node.jsのバージョン指定

```
$ nodebrew use [latest/stable]
```

## 2. NativeScriptCLIのインストール
- NativeScriptをグルーバルインストール

```
$ npm install -g nativescript
```

※失敗した場合、下記のcmdを試して見てください。

```
$ sudo npm install -g nativescript --unsafe-perm
```

- インストールできたか確認

```
$ tns
```

## 3. その他必要なもの
- [xcode](https://developer.apple.com/jp/xcode/)のダウンロード
- xcodeproj ruby gemをインストール

```
$ sudo gem install xcodeproj
```

- CocoaPodsをインストール

```
$ sudo gem install cocoapods
```

- xcproj をインストール

```
$ brew install xcproj
```

## 4. サンプルアプリを作る
- テンプレートを利用する

```
$ tns create CameraSample --template nativescript-template-tutorial
```

- テンプレートで作ったディレクトリに移動

```
cd CameraSample
```

- iOSのシュミレータ起動

```
$ tns run ios
```

## 5. カメラを実装

- [nativescript-camera](https://github.com/NativeScript/nativescript-camera)をインストール

```
$ tns plugin add nativescript-camera
```

- 実装

``` typescript:app.component.ts
import { Component } from "@angular/core";
import { ImageAsset } from "image-asset";
import { takePicture, requestPermissions, isAvailable } from "nativescript-camera";

@Component({
  selector: "module.id",
  templateUrl: "./components/camera.html"
})
export class AppComponent {
  // Your TypeScript logic goes here
	onRequestPermissions() {
    	requestPermissions();
	}
	public imageTaken: ImageAsset;
	public saveToGallery: boolean = true;
	public keepAspectRatio: boolean = true;
	public width: number = 300;
	public height: number = 300;

	onTakePhoto() {
	    let options = {
	        width: this.width,
	        height: this.height,
	        keepAspectRatio: this.keepAspectRatio,
	        saveToGallery: this.saveToGallery
	    };

	    takePicture(options)
	        .then(imageAsset => {
	            this.imageTaken = imageAsset;
	            console.log("Size: " + imageAsset.options.width + "x" + imageAsset.options.height);
	        }).catch(err => {
	            console.log(err.message);
	        });
	}
	onCheckForCamera() {
 	   let isCameraAvailable = isAvailable();
 	   console.log("Is camera hardware available: " + isCameraAvailable);
	}
}
```

```html:components/camera.html
<ScrollView sdkExampleTitle sdkToggleNavButton>
    <FlexboxLayout flexDirection="column-reverse">
        <Image [src]="imageTaken" flexGrow="3" class="p-15 img-rounded"></Image>
        <Button text="Take Photo" class="btn btn-primary btn-active" (tap)="onTakePhoto()" flexGrow="1"></Button>
        <Button text="Request permissions" class="btn btn-primary btn-active" (tap)="onRequestPermissions()" flexGrow="1"></Button>
    </FlexboxLayout>
</ScrollView>
```

<div>
<img src="https://qiita-image-store.s3.amazonaws.com/0/106459/090fbb96-6e39-0fb1-1f3e-3f85b64b264d.png" width=40%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/106459/9de0223a-f93b-8b1f-43f4-be1e0011586b.png" width=40%>
</div>

**※シミュレータの場合、カメラは起動しないので注意してください。**

## 番外編：実機で確認
自分のiPhoneで動くのを体験できるのはとても楽しいです。
ということで、自分のiPhoneで試したい方は、下記を実行してビルド。

```
tns build ios
```

- ビルドされたファイルを開く
`/CameraSample/platforms/iOS/CameraSample.xcodeproj`をxcodeで開く

- MacとiPhoneを繋ぐ
- xcodeでデプロイ

#SwiftやObjective-cを覚えなくてもいい
なんとなく、iPhoneアプリを作るのってSwiftやObjective-cを覚えないといけないから敷居が高い感じがしたのですが、ほぼJavaScriptで書けるのは楽チンですね。例えば、名刺管理アプリみたいな特別なカメラを作るとかなど複雑な処理が必要な場合は、Objective-cなども書けないといけないです。

これまで、Webアプリを作って人がスマホのネイティブアプリを作ることができます。
どんどん、いろんな技術の垣根がなくなっていきますね。