Pythonを使ってiPhoneアプリ開発してみる


# はじめに

私は会社の同僚によく飲みに連行されます。
田舎ですので飲み屋が毎回同じで、頼むメニューも飽きてしまいます。
そこでメニューをランダムに選択してくれるようなアプリがあれば良いのにねという話しがあり、作ってみようかなと思いました。
せっかくですので、メニューの属性値などをもとに、おすすめのメニューをAI使って判定できるようにしたら面白そうです。
そこでpythonでiphoneのアプリが作れないかと探してみました。
今回の記事ではkivyというフレームワークを使って、iphone用のアプリをpythonで作成する記事です。


# 目次
1. [導入編](#Chapter1)
1. [開発編](#Chapter2)


<a id="#Chapter1"></a>
# 導入編

## Kivyのインストール

kivyのホームページにインストールのやり方が書いてありましたので、そちらを参考にさせていただきました。

https://kivy.org/doc/stable/gettingstarted/installation.html#install-pip

インストールコマンドが丁寧に一つずつ書いてあるので、それを実行していくだけでインストールすることができました。
まずはpythonとpipコマンドを以下のコマンドで最新版に致します。

``` shell
python -m pip install --upgrade pip setuptools virtualenv
```

次にpythonのバーチャル環境を作成します。これは他のpythonバージョンによる影響を防ぐためで、公式様から**強く推奨**されているそうです。

``` shell
# kivy_venvという仮想環境を作成します
python -m venv kivy_venv
# 作成した仮想環境を起動します。こちらのコマンドはターミナルを起動するたびに実行が必要となります。
source kivy_venv/bin/activate
```

以上の前準備が完了しましたら、kivyをインストールします。

``` shell
python -m pip install "kivy[base]" kivy_examples
```

これでインストール完了です。
サンプルプログラムも提供されておりますので、試しにそちらを起動いたします。

``` shell
python kivy_venv/share/kivy-examples/demo/showcase/main.py
```

無事にアプリが表示されればインストール完了です。


## Kivy-iosのインストール

kivyがインストールできましたら、今度はiphoneでkivyを使ったアプリを利用できるようにkivy-iosをインストールいたします。
導入は公式サイト様に記載がありましたので、こちらを参考にさせていただきました。

https://github.com/kivy/kivy-ios

公式サイト様曰く、kivy-iosはpipコマンドで取得することが可能です。

``` shell
pip3 install kivy-ios
```

続いてシステムの依存性を解決するために、以下のコマンドを実行する必要がございます。

``` shell
xcode-select --install
```

pythonの拡張ライブラリはコンパイルする必要があります。
必要な依存性は、レシピとして確認することができます。
そしてそのレシピを元に、以下のコマンドでコンパイルすることができます。

``` shell
toolchain build python3 kivy
```

# xcodeとの接続

最後にxcodeと接続し、kivyで作成したプロジェクトをiphoneでリリースできるように致します。
toolchainを使ってxcodeのプロジェクトを作成します。
この時、app_directoryの中には、main.pyというファイルが必要です。
titleはアプリの名前になります。

``` shell
toolchain create <title> <app_directory>
```

ですが一行目を実行しましたところ、以下のエラーが出てしまいました。

```
[ERROR   ] No python recipe compiled!
[ERROR   ] You must have compiled at least python3
[ERROR   ] recipe to be able to create a project.
```

コンパイルが完了していなかったようです。
Stackoverflowに対策が書いてありましたので、こちらを実行致しました。

https://stackoverflow.com/questions/65238343/python3-kivy-compile-ios-error-no-python-recipe

``` shell
toolchain build python3 kivy
```

再度実行しますと成功しました。
あとは以下のコマンドでxcodeのプロジェクトを開けば完了です。

open <title>-ios/<title>.xcodeproj

だったのですけれども、xcodeでシミュレータを起動しますと、以下のエラーが発生いたしました。

```
Showing Recent Issues
rsync warning: some files vanished before they could be transferred (code 24) at /AppleInternal/Library/BuildRoots/ce725a5f-c761-11ee-a4ec-b6ef2fd8d87b/Library/Caches/com.apple.xbs/Sources/rsync/rsync/main.c(996) [sender=2.6.9]
```

こちらはgithubにあったissueがとても役に立ちました。

https://github.com/kivy/kivy-ios/issues/513

ビルドした場所がソースコードーどのあるディレクトリと同じ、またはそのサブディレクトリの中にある場合、この事象が発生するようです。
toolchainのビルドで作成したディレクトリ情報が、プロジェクトの中で作成される情報と混在し、rsyncが混乱するとのことでした。
ですのでビルドコマンドを実行する場所と、<app_directory>で設定したディレクトリを別の場所にいたしました。
これで晴れてシミュレータを無事に起動することができました。



<a id="#Chapter2"></a>
# 開発編

続いて開発に入って参ります。




<!-- 以下は誤っていたので削除
https://qiita.com/sobassy/items/b06e76cf23046a78ba05

記載の通り、githubのリポジトリからcloneします。
その後に以下のコマンドを実行して参ります。

``` shell
xcode-select --install
brew install autoconf automake libtool pkg-config
brew link libtool
pip3 install cython==0.28.1
```

ですが、以下のコマンドを実行するとエラーが発生しました。

``` shell
pip3 install cython==0.28.1
```

```
      #define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__))
                                                           ^
      16 warnings and 1 error generated.
      error: command '/usr/bin/clang' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for cython
  Running setup.py clean for cython
Failed to build cython
ERROR: Could not build wheels for cython, which is required to install pyproject.toml-based projects
```

対策としまして、stack overflowで、python-devをインストールするのが良いとアドバイスがございましたので、こちらを採用させていただきました。

https://stackoverflow.com/questions/73171473/how-to-resolve-error-could-not-build-wheels-for-hdbscan-which-is-required-to-i

``` shell
python3 -m pip install python-dev-tools --user --upgrade
```

こちらを実行した後に再度cythonのインストールを実施しましたところ、無事にインストールが完了いたしました。
次にkivy-iosのビルドを行います。kivy-iosフォルダ内で以下コマンドを実行いたしました。

pip3 install -r requirements.txt

失敗してしまいました・・・；；
エラーの内容から、cythonのインストールがうまくいっていなかったようです。
先ほどのコマンドでエラは出ていなかったのですが、実は失敗していたのですね。

``` shell
python3 toolchain.py build python3 kivy
[ERROR   ] Missing requirement: cython is not installed
```

前述のコマンドはpipコマンドを直接実行しておりましたけれど、私の環境ではpipだけでは実行できないので、以下のように実行してみました。

``` shell
python3 -m pip install cython
```

でもまだcythonがインストールされていないとエラーが出ました。
もしかしたらpipコマンドが私の環境では実行できないので、これが原因ではないかと考えました。
pythonには2系と3系があり、バージョンの違いとなるようです。調べた限り、pipコマンドやpythonコマンドは通常2系を指し、python3はpip3コマンドやpython3コマンドで呼び出すようです。なんでこのように変えてしまったのかは不明ですけれども、



<a id="#Chapter2"></a>
# 導入編

-->