Android
iOS
Terminal

apk、ipaをアップロード前にチェック

More than 1 year has passed since last update.

はじめに

動作確認をする前後に、簡単に、機械的に処理できるチェックを行うと
がっかりすることが少なくなります。

バイナリをアップロード時の失敗要因

内部バージョン

一度提出したipaやapkファイルを取り下げるのは条件によりますが
難しいことが多く、次のバージョンにビルドしなおしての更新となります。

AndroidでのVersionCodeとiOSでのBuild(CFBundleShortVersionString)はバイナリ提出時、どちらも数値を増やさないとアップロードができません。

apkは提出前に"アップロードしますか?"ダイアログが表示され
VersionCodeとVersionNameが表示されます。
iOSは内部で設定したBuild(CFBundleShortVersionString)は申請時に表示されなかったかと思います。

keystore、manifest.xml、provisioing Fileの設定

提出できないこともありますが
必要な権限が付いていないと機能が使えない
permissionの記述に誤りがあることに気づかずダウンロードできる端末が0機種と管理コンソール上に表示されて困惑する
iOSの場合はバイナリアップロード時にアラートが飛んできても見逃すとPush通知ができないなど、危ないところは多数あります。

チェック環境

Mac OS X Yosemite
Xcode 設定済み
AndroidStudio 設定済み

Android

署名

所定のkeystoreで署名されているかを確認します。
debug用のkeystoreで署名されたapkはStoreに上がらない。

$ jarsigner -verify -verbose -certs hoge.apk

次のような署名が見つかるとガッカリ

X.509, CN=Android Debug, O=Android, C=US

設定

aaptコマンドを使うため、androidSDKが必要です。
pathが通ってない場合は下記を参考に直接指定しても使えます。

[androidSDKのパス]/build-tools/[version]/aapt

[androidSDKのパス]はEl Capitanだと

$ ~/Library/Android/sdk/build-tools/[version]/aapt dump badging app-release.apk

$ aapt dump badging app-debug.apk | grep Version

AndroidStudioで署名したapkだと次のように表示されました。

package: name='jp.hoge.sample' versionCode='1' versionName='1.0' platformBuildVersionName='5.1-1756733'
sdkVersion:'15'
targetSdkVersion:'22'

パイプ後のgrepを除けば全部表示されます。

iOS

provisioing File

Push通知などの有効化などはprovisioning Fileの設定を確認します。

$ unzip hogehoge.ipa

下記のhogehoge.appは実際のものと置き換えてください

$ security cms -D -i "Payload/hogehoge.app/embedded.mobileprovision"

provisioing Fileの内容そのままが表示されます。

設定

アプリのBundleIdentifierやバージョンなどはInfo.plistに記載されています。
ipaに含まれているplistはバイナリになっているため通常のエディタでは閲覧が難しくなっています。

Xcodeが入っている

Xcodeのエディタが使えます。openコマンドでplistをダブルクリックしたのと同じ状態で表示されます。

ざっくりipaからInfo.plistだけを取り出す方法は下記の通り

$ unzip -c hogehoge.ipa Payload/hogehoge.app/Info.plist >  Info.plist
$ open Info.plist 

Xcodeなし

plutilコマンドで変換してエディタで確認します。
変換した後のファイルであればWindowsなど他のOSでも確認が可能になります。

下記はxmlへの変換例です。

$ plutil -convert xml1 Payload/pchSample.app/Info.plist -o xml.text

-convert json にすることでjson形式でも出力ができます。

参考

http://docs.oracle.com/javase/jp/7/technotes/tools/windows/jarsigner.html
http://nosource.blog35.fc2.com/blog-entry-95.html

http://peroon.hatenablog.com/entry/2012/12/04/130026
http://stackoverflow.com/questions/3014369/php-how-to-get-version-from-android-apk-file

http://l-w-i.net/t/macosx/plist_002.txt

さいごに

チェック方法を知ることで個別に自動化が可能になります。
自動化のシステムのメンテが困難であったり、サービスのAPIが未対応の部分は手動で確認するところがまだまだ必要です。