※ソースを読んで咀嚼した内容で書いてます
PythonでiOS/Androidアプリを開発できるフレームワークに、Kivy があります。
個人的に気に入ってちょくちょく触っているのですが、せっかくなのでクラッシュレポート解析サービスのCrashlyticsを組み込んで、クラッシュ時の情報を収集できるように取っ掛かりを進めてみました。
前提
- buildozerを使って、kivyの最小構成Pythonを用意する。
- そのままbuildozerでipaファイルを作成できることを確認するまで進める。
- 途中の準備構築はスキップ(あとで書くかも)
ここまでを簡単に書く
$ (いろいろインストールなどをする)
$ pip install buildozer
$ mkdir kivyapp
$ cd kivyapp
$ buildozer init
$ buildozer iOS debug
IPA kivyapp-0.0.1.ipa available in the bin directory
何が面倒か
CrashlyticsKitの組み込みかたおさらい
CrashlyticsKitの組み込み自体は至極簡単で、main内で呼ばれるApplicationDelegateクラスがあれば、メソッドdidFinishLaunchingWithOptionsの中に [Fabric with:@[CrashlyticsKit]];
を突っ込むだけでOKです。
※Fabricから始めればチュートリアルが出て非常に親切なので、こっちだけなら非常に簡単です。
Kivy-iosのmain()
kivy-ios上にあるmain()関数を定義しているソースのテンプレートがこちら。
通常のiOSアプリと違って、UIApplicationMainが呼ばれていません。
処理をトレースしてみると、こっちで呼ばれているようでした。
Delegateクラスは同じソース内のSDLUIKitDelegateで定義されていたので、処理を差し込むのが面倒そう。
どうしたか
これらのソースを差し込みました。すごいゴリ押し。
// .h file
@interface SDLUIKitDelegate (KivyAppDelegate)
@end
// .m file
@implementation SDLUIKitDelegate (KivyAppDelegate)
+ (NSString *)getAppDelegateClassName
{
return @"KivyAppDelegate";
}
@end
こっちの実装でSDLUIKitDelegateのカテゴリ機能で呼ばれるべきDelegateクラスを無理やり書き換え、
// .h file
@interface KivyAppDelegate: SDLUIKitDelegate
@end
// .m file
@implementation KivyAppDelegate
-(void)postFinishLaunch
{
[Fabric with:@[CrashlyticsKit]];
// call superclass method.(continue to run as kivy)
[super postFinishLaunch];
}
@end
こっちで、SDLUIKitDelegateを継承したKivyAppDelegateでpostFinishLaunch()をオーバーライドしてCrashlyticsKit呼び出しを差し込む。(なお、SDLUIKitDelegate自体のpostFinishLaunchにKivyのメイン動作があるので、必ずオーバーライドメソッドで呼ぶ)
これで、どうにかCrashlytics側にアプリを登録できた。