サルでもできるPython(kivy)でiOSアプリ開発 

#はじめに
機械学習とかデータサイエンスの分野で活躍しているPythonですが、GUIも地味に優秀で、今回用いるkivyはビルドによってデスクトップでもAndroidでもiOSでも動くアプリケーションが作れます。

今回は、アプリなんて作ったことないけどPythonはある程度知ってる方向けに簡単な解説をさせていただきます。
自分への備忘録もかねて。。

#kivyとはなにか
Pythonのライブラリの一つで、GUI(グラフィカルユーザーインターフェース: 黒いコンソール画面ポチポチじゃない)を簡単に作ることのできるものです。

[日本語リファレンス](https://pyky.github.io/kivy-doc-ja/)も存在していて、今現在も開発が行われているライブラリです。

使い方に関しては他の多くの方が分かりやすくて丁寧な記事を書いていらっしゃるのでここでは省略します。今回はアプリにすることを前提に話を進めます。

#必要なもの

- kivy-ios
- Python 3系
- Mac OS搭載PC(残念ながらXcodeが必要なのでWindows, Linux系ではできません...)
- XCode

#kivy-ios
[こちらのGitHub](https://github.com/kivy/kivy-ios)のページからクローンしてきます。

__iOS 13 への対応について__
iOS 13 から、Objective-C言語の大幅な変更があったようで、一時期この kivy-ios が動かない事態になりました。2019年12月28日現在、修正箇所のプルリクがマージされ、使える状態になっています。

[Objective-C iOS 13.0 breaking changes #53](https://github.com/kivy/pyobjus/issues/53)

#ビルドの開始
早速アプリのビルドを始めます。
##kivy-ios
まずはkivy-iosを動かすための依存パッケージをインストールしてきます。

```bash
xcode-select --install
brew install autoconf automake libtool pkg-config
brew link libtool
pip3 install cython==0.28.1
```
クローンしてきたディレクトリ内で、

```bash
pip3 install -r requirements.txt
```
を実行します。これでkivy-iosを使う準備ができました。

この後は、アプリにpythonのプログラムを組み込むのですから、python自体をアプリ用にビルドする必要があります。そのコマンドが以下です。

```bash
python3 toolchain.py build python3 kivy
```

この処理が、私の環境(Mac book Pro 2016)で1時間ほどかかりました。汗

##アプリケーションの作成
今回はチュートリアルということで、ストップウォッチを作ってみましょう。内容としては、ボタンを一つ作り、ボタンを1回目押したときの時刻 `datetime.datetime.now()` と2回目押したときの時刻の差を出力してみます。

```python:main.py
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import StringProperty
from datetime import datetime


class MainWindow(Widget):
    button_text = StringProperty("Push Button!!")
    timer_text = StringProperty("START")

    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)
        self.timer_check = False
        self.timer_before = 0
    
    def push_button(self):
        if not self.timer_check:
            self.timer_before = datetime.now()
            self.timer_check = True
            self.button_text = "STOP"
            self.timer_text = "Running..."
        else:
            self.timer_check = False
            self.button_text = "START"
            self.timer_text = str(datetime.now() - self.timer_before)


class StopWatchApp(App):
    def __init__(self, **kwargs):
        super(StopWatchApp, self).__init__(**kwargs)

    def build(self):
        return MainWindow()


if __name__ == '__main__':
    StopWatchApp().run()
```

```python:stopwatch.kv
MainWindow:

<MainWindow>:
    BoxLayout:
        orientation: "vertical"
        size: root.size
        Label:
            text: root.timer_text
        Button:
            text: root.button_text
            on_press: root.push_button()
```
<img width="40%" alt="スクリーンショット 2019-12-28 14.03.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/c92e9452-5297-d850-7ee7-2db5d10ca3c0.png"><img width="40%" alt="スクリーンショット 2019-12-28 14.03.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/bad6daab-5b3e-d6e9-fb7e-29c146199c01.png">


めちゃめちゃ安そうですが一応できました。この際、Pythonスクリプトは`main.py`という名前で保存してください。できたpyファイルとkvファイルを適当なディレクトリに入れてください。(今回は`stopwatch`というディレクトリに保存しました。)

##Appleのプロファイル作成
Apple Developer Programに加入されている方は問題ありませんが、実際アプリをストアに公開しようとなると年会費を払う必要があります。しかし、無料でも実機ビルドだけはできますので以下の記事を参考に設定してください。

[【Xcode】無料の実機ビルドでどこまでできるのか](https://qiita.com/koogawa/items/15b231e2728ff64e08f3)

__無料実機ビルド__
プロファイルの有効期限は__7日間__です。これを過ぎるとiPhone上から起動できなくなりますので、再度実機転送する必要があります。

##XCodeプロジェクト作成
以下のコマンド構文に従ってコマンドを打ちます。

```bash
python3 toolchain.py create <title> <app_directory>
```

今回は`kivy-ios-master`があるディレクトリに`stopwatch`というディレクトリを置きましたので、

```bash
python3 kivy-ios-master/toolchain.py create StopWatch ./stopwatch
```

となります。すると、同じディレクトリに`stopwatch-ios`というディレクトリができるので、中にあるXCodeプロジェクト`stopwatch.xcodeproj`を開きます。

<img width="70%" alt="スクリーンショット 2019-12-28 14.13.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/d0debd34-2f50-5f8a-13c6-8468abdb5a99.png">

プロジェクトの設定から先ほど設定したプロビジョニングプロファイルを選択し、左上の端末選択画面から接続したiPhoneを選択し、三角ボタンを押してビルドします。この時、iPhoneにパスコードをかけている方は解除して、ホーム画面にしておく必要があります。

また、最初のビルドでは、自動的に起動するようになりますが、プロファイルが正式なものではないため、起動されません。iPhoneの`設定>一般>デバイス管理者`から認証する必要があります。

無事にビルドができたようです。めでたしめでたし。

<img width="40%" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/38531e14-e085-d77f-2722-046357da675f.jpeg">    <img width="40%" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/b95cd989-83c2-3564-4ce3-0d495be11b87.jpeg">


Webカメラで撮ったので死ぬほど画質が悪くてすみません。

#最後に
こんなにも簡単にアプリが作れるとは思ってもみなかったです。こんなライブラリを考えつく人はどんな頭の構造をしてるのでしょうね。笑

またいろいろ作ってみたいですね。