PythonアプリをiOSで実機テスト:kivy-iosの使い方

  • このエントリーをはてなブックマークに追加

Pythonで開発したアプリをiOSデバイスで実機テストしたい場合、kivy-iosを使用できます。本記事では、kivy-iosの使い方や実機でのテスト方法などを詳しく解説します。必要なものや設定方法も紹介するので、初心者でも簡単に実践できます。

こんにちは。wat(@watlablog)です。ついに開発したアプリのリリース第一歩です!ここではiOSアプリをiPhoneで実機テストする方法を紹介します!

この記事の目標

PythonプログラミングだけでiOSアプリをつくる

モチベーション

WATLABブログでは主に(というかほとんど全部?)Pythonを使ってプログラミングをしてきました。
いつもは自分で使うためにPyCharmというIDEの画面でプログラミングし、実行して結果を得ていました。

しかし最近はIDE上でなく、デスクトップ環境モバイル環境で使える実行ファイル形式のソフトウェアを作ってみたいと思い始めました。

kivyで作ったアプリをNuitkaでexe化する時のエラー対処例」の記事では録音して周波数分析するソフトをNuitkaを使って実行ファイル化することに成功しました。これでPythonの入っていないPCでもPythonで開発されたソフトを使えるようになったのですが、さらに欲が出てきて、今度はモバイルアプリの開発もしてみたくなりました。

筆者のモバイル端末はiPhoneなので、この記事は自分のiPhoneでPythonで開発したソフトをテストするまでを扱います!

Pythonだけでつくる理由

通常iPhoneアプリはSwiftを使ってアプリを開発します。SwiftとはAppleが開発したプログラミング言語であり、iOSやmacOS、watchOS、tvOSといったApple製品向けのアプリケーション開発に使用されます。

Swift自体はPython同様習得が容易な言語と言われていますが、Pythonユーザーからすると新たな言語を覚えなければいけません。

本職のIT技術者なら複数の言語を習得して様々な現場に対応できるようにすべきと思いますが…一介の機械系エンジニアである筆者は腰が重いのでなんとか楽をしようと思ったのがPythonだけでつくる理由です。

先人達のライブラリを多用して作ったPythonアプリをSwiftで再現できる自信なし!

kivy-iosの使い方を習得する

kivyで書いたGUIアプリを使う

この記事ではPythonのGUIアプリ開発ライブラリの中でモバイルアプリに対応しているkivyを使います。
kivyの概要や簡単な使い方は「Python/kivyでGUIアプリ開発!基本の書き方を学ぶ」の記事を参考にしてください。

kivy-iosでPythonアプリをiOS向けに変換する

Pythonで開発したkivyアプリをiOS向けに変換するためにkivy-iosというツールキットを使います。
kivy-iosを使うと、XcodeiOS SDKなどのApple開発ツールで使えるファイルをPythonスクリプトから自動生成してくれます。依存関係の問題を自動的に解決してくれるのでまさに神ツールです。
公式は以下のGitHubページです。

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

実は公式ページに簡単なインストラクションが書かれているのですが、慣れない作業に筆者はエラーに悩まされました。ここでは筆者が直面したエラーを紹介しつつ、さらに勘所をメモしつつ使い方を説明します!

XcodeでアプリをビルドしてiPhoneで実機テストする

kivy-iosを使うとXcodeというApple製品用ソフト開発で使われるIDE(統合開発環境)用のプロジェクトファイルが作成されます。

ここまでは上記公式GitHubの説明にあるのですが、そこから先の実機テストまでは解説がありません。さらに筆者はビルドエラーBuild Failed)にかなり悩まされました(何日も…)。Pythonしか触ったことのない人はまさに川から大海に流れ着いた稚魚の如く路頭に迷うと思いますので、この記事ではXcodeで直面したエラーとその解決方法も記録しておきます。

簡単にできることと簡単にはできないこと

Recipesにないライブラリはkivy-iosで変換できない

kivy-iosというツールキットを使えばPythonだけで作ったプログラムを簡単にiOSアプリにできますが、そうそう万能なツールではありません。

以下は2023年3月時点のkivy-iosのtoolchain recipesツールチェーン レシピ)です。

ここに記載のライブラリ(バージョンも)を使ったプログラムであれば、kivy-iosでXcodeプロジェクトを作成してiOS端末で起動ができます。しかしリストにないライブラリは実行時にKeyErrorを出してアプリが落ちます。

残念ながら当ブログで頻出しているScipyやmatplotlib、OpenCVといったライブラリはリストにありません…。

ここに気付くまでにかなり時間を使いました…。公式をよく読めばわかったのですが、筆者は色々調べていた時に以下のページを見つけてようやく確信に至ったというレベルです。

I have made an app that uses NumPy, SciPy and Pandas which I want to put onto my iOS device. I compile and build using Kivy-iOS but there are errors with the Pandas and SciPy packages and they can't simply be installed via pip install or python toolchain.py pip install.

How do you make a recipe for kivy-ios?

PyAudioやScipy、matplotlibを多用した録音FFTアプリをiOSアプリにしようと思いましたが、そんなに簡単にはいかないようですね。。

Recipesを自分でつくることもできる?

英語で検索している限りでは、Python for Androidのページにあるように、レシピをつくる方法があるそうです。iOSでも似たような手法でつくることができるかもしれません。しかし筆者はまだその方法の具体例を探せていないのでなんとも言えません。おそらくできそう…というレベルですが、これは結構ハードルが高そうですね。

https://python-for-android.readthedocs.io/en/latest/recipes/

そのため今回は簡単なプログラムを使ってiOSアプリをつくるところまでを紹介します。先は長そうであるため、複雑なアプリ制作は別記事にしていきたいと思います。

kivy-iosでXcode用のプロジェクトを作成する手順

動作環境

iOSアプリ開発なのでmacOSを搭載したPCやiPhone、macOSでしか使えないXcodeといったApple信者のような環境が必要になります。Xcodeは後ほどインストール方法から解説しますが、Xcodeを使うためにmacOSのバージョンを上げたりしています。以下に筆者がビルド成功まで確認した時の動作環境一覧を示します。

                                                      
Mac OSmacOS Ventura 13.2.1
CPU1.4[GHz]
メモリ8[GB]
Xcode Version14.2(14C18)
iPhone SE2 OSiOS 16.3.1

gitコマンドを使えるようにしておく

kivy-iosはGitHubのファイルをcloneして作業します。そのためgitコマンドをCUIで使えるようにしておきましょう。以下の記事にgitをインストールする方法を書いていますので、動作確認まで済ませておく必要があります。

はじめてのGit/GitHub!インストールからリポジトリの作成まで

ソースコードを準備する

サンプルアプリ

今回は「Python/kivyでGUIアプリ開発!基本の書き方を学ぶ」で紹介したシンプルなカウンターアプリをiOSアプリに変換します。

以下のmy.kvファイルとmain.pyを用意すれば動作確認をすることが可能です。kivy-iosを使う場合、main.pyという名前をメインコードに使う必要があります

my.kvはこちら。こちらも名前はそのままにします。main.pyでMyApp()というclassを使っているので、kivyの仕様から特にPythonファイルでkvファイルを呼び出さなくても読み込まれます。

main.pyはこちら。

フォルダ構成も躓きポイントだと思うので、以下に今回のフォルダ構成を示します。筆者はSimpleAppというフォルダの中にmy.kvとmain.pyを入れました。

フォルダ構成1

Xcodeをインストールする

あとで使うXcodeもインストールしておきましょう。macOSにPythonをインストールした時にコマンドラインツールをインストールしていたのでこれで良いと思っていましたが、Xcode本体はまだ入っていなかったのでApple Storeから入手しました。

バージョンは13以上であれば良いそうです。

Xcode

kivy-iosを準備する

kivi-iosをgit cloneする

Terminalを開き、以下のコマンドでソースコードフォルダのあるディレクトリへ移動します。

以下のコードでkivy-iosgit cloneします。

こういうフォルダ構成になります。ただし、必ずしもこのフォルダにkivy-iosがないといけないわけではありません(今回は後ほどのコマンド文をわかりやすくするためにここに置きました)。

フォルダ構成2

フォルダができたらディレクトリを移動します。

公式が推奨しているように、仮想環境下で作業を行います。以下のコードを実行するとTerminalの左端に(venv)と付き仮想環境による実行が可能です。

kivy-iosをpip installする

次のコマンドでkivy-iosをpip installします。

Cythonをpip installする

Cythonを入れていない人は以下のコマンドでpip installします(バージョンは古いのだとだめらしいので指定)。

以下の質疑応答が参考になります。

Any kivy people developing on macOS?? What are the first steps you take to set up your developing environment?

>>OK here is what I've done on my new macbook pro.
pip3 install Cython==0.29.28 (kivy doc pre-req)

https://www.reddit.com/r/kivy/comments/wecn3u/any_kivy_people_developing_on_macos_what_are_the/

kivy-iosの中のrequirements.txtをpip installする

git cloneしたkivy-iosフォルダの中にはrequirements.txtが入っています。requirements.txtとは通常pip freezeした時にリストされるライブラリ一覧を書いておき、異なる環境で一括pip installする時に使います。kivy-iosの中のrequirements.txtにはpbxprojをはじめとしたライブラリが登録されていましたので、忘れずに以下のコマンドでインストールします。

依存関係のライブラリをbrew installしてlinkする

次のコマンドでkivy-iosを使う上で依存関係にあるライブラリをインストールし、リンクさせます。

toolchainを実行する

以前にビルドしたtoolchainが悪影響を及ぼす可能性があるという情報もあり(ChatGPT-4に聞きました…)、buildする前に以下のコマンドでクリーンしておきます。

これで準備が整ったので次のコマンドでtoolchainを実行します。

15分ほどかかりました…!

Errorが出る場合:raise CommandNotFound(k)

raise CommandNotFound(k) sh.CommandNotFound: python」 のエラーが出る場合は失敗しています。このエラーは筆者の環境だと、以下の質疑応答が役に立ちました(結構探した!)。

error when I run toolchain build kivy python3 #629

You can install kivy-ios from master by typing the following:

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

どうやらマスターなるアーカイブにエラーを解決する秘密があるらしい(正直意味はわかっていない)ので、以下のコマンドでpip installします。これでこちらの環境ではエラーがなくなりました。

以下のYouTubeはM1チップを搭載したMacにおけるビルドを解説していますが、上記masterにも言及しています。どうやらkivy-iosの次のリリースからはこのmasterをインストールしなくてもよいのでは、との見解ですね。

Xcodeプロジェクトファイルを作成する

最後に以下のコマンドでXcodeのプロジェクトファイルを作成します。

すると「TITLE-ios」フォルダが生成され、中にXcodeのプロジェクトファイルが作成されています。

Xcode

XcodeでアプリをビルドしてiPhone実機テストを行う手順

Xcodeの設定

それではいよいよアプリのビルドをします。
先ほど作成された「〜.xcodeproj」を開くと、以下の画面になります。アプリをビルドするためにはいくつか下準備を必要とします。

Xcodeのホーム画面

Development teamの設定

まずはじめにDevelopment teamの設定を行います。この設定を行わないと、「Signing for "simpleapp" requires a development team. Select a development team in the Signing & Capabilities editor.」というメッセージでBuild Failedとなります。

iOSアプリをApple storeに公開する場合は有料の登録が必要になりますが、自分のiPhoneで実機テストするだけなら無料の範囲で使うことが可能です。ただしその場合でもXcodeで自分のAppleアカウントを登録しておく必要があります。

XcodeSettings…をクリックします。

Development teamの設定1

Acounts+マークをクリックします。

Development teamの設定2

Apple IDContinueをクリックします。

Development teamの設定3

Apple IDを入力してNextをクリックします。

Development teamの設定4

Apple IDが登録されたことを確認し、Manage Certificates...をクリックします。

Development teamの設定5

+マークをクリックします。

Development teamの設定6

Doneをクリックします。

Development teamの設定7

プロジェクト画面のSigning & Capabilities欄にあるTeamをプルダウンから選択します。

Xcode2

アプリをBuildして実機テストする

iPhoneのデベロッパーモードをONにする

これからプロジェクト画面でビルドを行いますが、iPhoneのデベロッパーモードをONにする必要があります。これはiOS 16から追加された内容とのことですが、ONにしないとアプリ起動時に「デベロッパーモードが必要です」と怒られます。

iPhone画面で、
設定プライバシーとセキュリティデベロッパーモード
と設定します。

iPhoneのデベロッパーモードをONにする画面

iPhoneをMacに有線接続してホーム画面にしておく

次にiPhoneを有線でMacに接続し、画面のロックを解除した状態でホーム画面にします。

ビルドする

Xcodeのプロジェクト画面左上にあるRunボタン▶︎)をクリックしてビルドスタートします。

Xcode3

ビルド途中でパスワード(PCのパスワード)を聞かれる場合は入力して許可をします。

キーチェーンのログインパスワード入力画面

何も問題がなければ、iPhoneへアプリが転送されます!
デフォルトではiPhone上でkivyのアイコンが追加されていると思います。

Build Failedとなる場合は原因を見つけて解決する必要があります。

信頼されていないデベロッパを解決する

無事アプリがiPhoneに転送された場合でも、アプリをクリックすると「信頼されていないデベロッパ」と表示され起動できない場合があります。

iPhone画面

iPhone画面の設定一般VPNとデバイスの管理と進み、
デベロッパAPP」をクリック、自分のApple IDが表示されているので、信頼をクリックします。

信頼されていないデベロッパの画面2

アプリを起動する

あとはアプリを起動するだけです。

counter app

まとめ

ボリュームが多くなってきましたのでここまでとします。Pythonkivyだけで開発したアプリを無事iPhoneで動かすことができました!

toolchainの使い方やXcodeからビルドする方法はPythonしかやったことがないと初めてのことばかりです。エラーに直面してもどこかに答えはあると思うので、地道に頑張りましょう。

一つハードルが高いと思ったのはRecipesを自分で作らないと自由に外部ライブラリを使えないということ。できるだけ既存のRecipesに存在するライブラリだけで開発するか、Recipes開発者になるか…Pythonだけで実際にアプリストアで公開できるようなアプリをビルドするにはこの2択でしょう。
筆者もまだ録音FFTアプリをつくることは諦めていないので、継続して方法を探ってみます!

まだまだ先は長そうですが、ソフト開発って楽しいと思いました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*