【備忘録】pythonとkivyで開発したアプリをiPhoneに実機転送する方法

#現状(2019/12/17追記)
`toolchain.py`のソースコードがおそらく変更されており、[kivy-ios](https://github.com/kivy/kivy-ios)の手順に従えば、基本的には問題なくできると思う。
何か問題が発生した場合は、`python`や`kivy`をアンインストールしたキレイな状態から開始することをオススメする。
また、`pyenv`の使用はオススメしない。
`kivy-ios`の手順では`brew install python`と記載がある。手順に従わない方法で`python`環境を整えると、うまくいかない可能性が高まる。
ちなみに、`pyenv`でやると必ずNGという訳ではないと思うが、私は`pyenv`を使用することにこだわりはなかったので、素直に`brew`でインストールした。

#やりたいこと
`python`を勉強したい！
なんか適当にアプリを作りたい！
できるならスマホアプリを作りたい！
(外出先でいろいろ遊べるので。)

##ひとまず、`kivy`のtutorialとして提供されているPong GameをiPhone実機で実行することを目標にする。

##実行環境
`python` 3.6.5(Kivy3.appを入れたらこのバージョンのpythonがインストールされた)
`kivy` 1.10.1
`Cython` 0.28.1
`Mac` macOS Mojave 10.14.4
`Xcode` 10.2.1
`iPhone` iOS 12.2

##手順
基本的にはここに書いてあるコマンドを実行していけばよいが、一部補足して記載する。
https://github.com/kivy/kivy-ios

###1　`git clone`
```
git clone https://github.com/kivy/kivy-ios.git
```
ここにある`toolchain.py`をあとで実行するので、`git clone`しておく。
kivy-iosディレクトリが作成されるので、`cd kivy-ios`しておく。

###2　権限(?)の設定
####2-1　`kivy`の`python`バージョンの確認
![スクリーンショット 2019-05-20 23.38.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/31955cc8-11e6-86a0-f7d8-fcefea355461.png)
`kivy`とタイプすると`python`プロンプトが起動する。このとき、上図のように`python`のバージョンを確認できる。
※筆者は`brew`により`python 3.7.3`を元々インストールしていたが、Kivy3.appにより`kivy`をインストールしたところ、`kivy`には`python 3.6.5`が関連付いた。
パスも異なる為共存しても問題ないが、`python`を実行する際はどの場所にあるどのバージョンの`python`を実行しているかを気にする必要がある。

####2-2　`pip`の`python`バージョンの確認

```
head -1 $(which pip)
```
`pip`コマンド(実態は`python`スクリプト)のシバンに書いてある`python`のバージョンを確認する。
シバンだけで確認できない場合は、シンボリックリンクを追ったり`python --version`してみる。
2つのバージョンが一致していれば、2-4へ移動。

2つのバージョンが一致していない場合、一致させる必要がある。
おそらく、`kivy`の`python`バージョンに合わせる方が楽。

####2-3　`pip`を作成し、バージョンを一致させる
適当なディレクトリに`cd`して下記を実行する。
※実行する`python`は2-1で確認した`kivy`の`python`で実行する。
上図で言う`python 3.6.5`がどこかにあるのでその`python`で実行する。

```
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
```

このときに使用する`python`がポイントで、`python`のパス・バージョンに応じた`pip`が生成される。
また、実行した`python`が存在するディレクトリに`pip`が作成される為、`/usr/local/bin/python`などで実行すると`pip`が上書きされる可能性がある為注意。
なお、後続の処理で実行する`toolchain.py`の中で`which pip`を行い`pip`のパスを取得しているようなので、`pip`を作成した場合は`which pip`でどの`pip`が参照されているかを確認した方がよい。

####2-4　`pip`実行
```
pip install -r requirements.txt
```
この権限(?)の設定は`python`毎に実行が必要らしく、`kivy`に関連付いている`python`のバージョンを変更した場合、再度実行が必要になる。
ちなみに`requirements.txt`の内容は下記である。
バージョンの設定か何かをしているようだが、よく分からない。。

```requirements.txt
pbxproj==2.5.1
requests>=2.13
```

###3　Xcodeのコマンドラインツールのインストール
```
xcode-select --install
```
1つ注意点として、電源を繋いでいないとインストールできなかった。

###4　なんかインストール
```
brew install autoconf automake libtool pkg-config
```
英文を読む限り必須作業なのか微妙だが、やれるものはやっておこう。
インストール時に下図のように警告やエラーが出ることがある。
![スクリーンショット 2019-05-20 21.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/9fb720ea-5148-2b67-ddbc-4ba0e7a6d8a6.png)
警告は、「それ最新入ってるよ」なのでOK。
エラーは、「それ入ってるけどちょい古いから更新かけてね」なので、更新をかける。

####4-1　最新バージョンへ更新
```
brew upgrade automake
```

####4-2　リンクの設定
```
brew link libtool
```
![スクリーンショット 2019-05-20 22.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/40f0cbf7-465b-1132-565a-d433c245f9d3.png)

上図のように警告が出ることがある。
これも「既にリンクあるよ」なのでOK。

###5　Cythonのインストール
```
pip install cython==0.28.1
```
2019-05-20現在、[こちら](https://pyky.github.io/kivy-doc-ja/installation/installation-osx.html#installation-osx)のkivyのインストール手順ではCython=0.23を指定している。
上記は有志の方による翻訳のhtml版だが、翻訳時のバージョンが単に0.23だっただけだと推察。
※有志の方、翻訳ありがとうございます！大変助かっています！

###6　一旦確認
```
./toolchain.py recipes
```
ここで上記コマンドが正常に実行できれば、ここまでの手順はOKと判断できる。
出力結果は`recipe`と呼ばれるものの一覧であり、よく分からないがこれらが何なのかは重要なことだと思うので後で調べる。

###7　ビルド
```
./toolchain.py build python3 kivy
```
ビルドが1回以上必要らしいが、時間がかかることがある。
初回は40分ほどかかった。
なお標準出力にログが大量に出力されるが、ほとんどがDEBUGログである為`toolchain.py`のどこかをいじればログの出力を抑制できそうな気がする。
また、作成したアプリに応じてビルド対象を増減する必要がある。

###8　Xcode Projectの作成
```
./toolchain.py create <title> <app_directory>
```

上記の書式で`toolchain.py`を実行する。
第2引数の「`<title>`」は作成するアプリの名前なので慎重に決定する。
※`<app_directory>`には`main.py`が存在していないといけない。

###9　Xcodeでプロジェクトを開く
```
open <title>-ios/<title>.xcodeproj
```

上記コマンドを実行すると、Xcodeで使用するファイルをまとめたディレクトリ(`<title>-ios`)が作成される。
`<title>.xcodeproj`がその名の通りXcodeのプロジェクトファイルなので`open`する。
※作成された`<title>-ios`の中身を勝手にいじってはいけない。

###10　まずはSimulatorで実行
実機で動かす前にSimulatorで実行ができないと話にならないので、Simulatorで実行してみる。
![スクリーンショット 2019-05-21 22.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/811618fb-4fd0-a986-1e92-4b92b612edde.png)

再生ボタンを押下後、下図のようにSimulatorが起動する(一旦iOSのバージョンは適当でよい)。
※初回実行時は少し時間がかかる。
リンゴのマークとプログレスバーが表示される。

![スクリーンショット 2019-05-21 22.30.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/360727d5-cb72-f157-eda6-31f7de0a5405.png)

左にスライドすると下図のようにpongのアプリがあるのでクリックする。

![スクリーンショット 2019-05-21 22.34.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/f2ffad0b-4dca-0ee6-df7f-040d23954095.png)

すると下図のようにpongがSimulator上で実行できていることが確認できる。

![スクリーンショット 2019-05-21 22.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/89ac469c-88b5-93c6-0ae0-84280a8a7851.png)

###11　iPhone実機転送の準備
####11-1　iPhoneをMacに接続する。

####11-2　下図の「Team」を選択する。
※個人開発でも個人アカウントが出てくるのでそれを選択。
※場合によってはapple IDにログインが求められる。
![スクリーンショット 2019-05-21 22.59.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/9acb986a-206f-f4e8-bf8d-4959c881bb78.png)

####11-3　下図のようなエラーが発生した場合は、[こちらのサイト様](https://qiita.com/Ryosuke-Hujisawa/items/4f38c9096205bf7d1648)を参考に解消する。
![スクリーンショット 2019-05-21 23.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/b39b12e5-6654-c882-1e75-45b965298bf7.png)

####11-4　下図のように出力先を実機にする。
![スクリーンショット 2019-05-21 22.52.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/653c1597-ba61-2520-bfa3-f1e863b7eb90.png)
![スクリーンショット 2019-05-21 22.54.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204486/2618ce0c-b224-e268-ecef-b74ea880df53.png)

###12　iPhone実機転送
####12-1　再生ボタンを押下！

####12-2　iPhone側でアプリの実行を許可する。
アプリ単位ではなくdeveloper単位の様子。

以上。