Drowsy Dog's Diary

any note, any thought

2014年8月21日
by kazoo
0 comments

[ios][appstore] In-App Purchase プロダクトとアプリバージョンの紐付け

これもやるたびにミスって Developer Reject するので今さらだけどメモっておく。。

iTunesConnect に新規のアプリ内購入(IAP)アイテムを追加するときの順序について。

基本的にここでは Non-consumable プロダクトについて書いてます(これしかやったことない)。
間違い等ありましたらご指摘いただけると重畳。

現バージョンのアプリでそのまま購入できるアイテムを追加する場合

これは単純に、アプリ管理画面の “Manage In-App Purchase” から “Create New” ボタンで追加して submit すればよい。

ProductID や値段など、基本的な情報を登録して Save すれば、 Submit する前にテストアカウントで購入テストができるようになる。この時点でサムネイルはまだ無くてもOK。

テストアカウントは、iTunesConnect トップの “Manage Users” から登録できる。Android と違って「購入キャンセル」というものが(事実上)存在しないので、同じアカウントで同じアイテムの購入テストは一度しかできない。なのでメールアドレスがいくつも必要になったりするが、そんなときは「10分間だけ有効な」アドレスを生成してくれる 10 Minute mail がべんり。

http://10minutemail.com/

テスト用購入確認ダイアログには、[Environment: Sandbox] という表記が付いている。レビュー用のサムネイルにどのような画像を使うのが適切か定かではないが、kazoo はいつもこの購入ダイアログのキャプチャをサムネイルにしている。

アプリのバージョンアップと同時に課金アイテムを追加する場合

問題はこのケース。未確認だがたぶん新規アプリの場合も同じ。

アプリのバージョンアップで買えるようになる課金アイテムは、まず上と同様に “Manage In-App Purchase”から新規アイテムを追加し、サムネイルを登録して “Ready to submit” の状態までもっていく。Submit はしない

次に、”Add Version” ボタンからアプリの新規バージョンを用意して、更新情報を追加する。ここで注意するのは、“Ready to Upload” ボタンを押す前に、このバージョンに課金アイテムを紐づける必要があること。状態が “Waiting for Upload” になってしまうと、もうそのバージョンは一度リジェクトしない限り紐付けはできない。

状態としては “Prepare for Upload”(または Developer Rejected)のときに、アプリの Deteil を見ると、このときのみ In-App Purchase の編集ができるようになっているので、これをエディットして、先ほどのアイテムを紐づければよい。Submit はまとめて行われるので、”Manage In-App Purchase” での Submit は必要ない。

IAP

アイテムを “Ready to submit” にする → アプリが “Prepare for Upload” のときにそれを紐づける。

書き記すと大したことではないのだが、うっかり失敗すると、一度 XCode から Submit して Developer Reject して(しかも次に再アップロードする際にまったく同じバイナリでは受け付けてくれない)というのが大変めんどくさい。アップロードとキャンセルが同時に走るのを避けたいのだろうが、Waiting for Upload を一回押してしまうと絶対にキャンセルできないのどうなん??と毎回思う。。

ちなみに、アプリバージョンと課金アイテムバージョンに依存関係がないからといって、In-App Purchase が Waiting for Review のときに次のアプリバージョンを Submit したりすると、まだレビュー通ってないアイテムに対して「このバージョンでこれ買えないぞ」みたいな Reject をされることがある(ぽい)。
基本的に、アイテムとバージョンを完全に紐づけるか、アイテムがレビュー中のときにはアプリ本体は触らない方が良さそう。

参考:
In-App Purhcaseプログラミングガイド

2013年9月1日
by kazoo
0 comments

【危険】jpoz/APNSの現バージョンにpush通知大量爆撃のバグ

たとえば iOS アプリのサーバサイドを Rails で実装している場合などに PUSH 通知を使いたいとき、
APNs(Apple Push Notification service) 通信用の ruby 実装として便利な gem、jpoz/APNS なのですが、現行バージョン(1.0.0)にかなり危険なバグがあるようで。

https://github.com/jpoz/APNS/issues/19
https://github.com/jpoz/APNS/pull/22

このコミット以来、

と、ループが二重になっていて、たとえば send_notifications に100件のデバイストークンを渡したら、
100人に 1件ずつ PUSH 通知を送っているつもりが、100 人に 100 件ずつ絨毯爆撃されてしまうという状態。。

8/27 に修正もコミットされているのですが、まだ本線にはマージされておらず、
すでに master は2ヶ月ほどこの状態でいるようです。危ない。

修正内容は単純に

Fork 数からすると Rails 向け APN としてはこちらの方がメジャーなのかも(知らんかった)ですが、ruby で PUSH 通知を組んでいる方は一応ご注意ください。

何が怖いって、PUSH 通知はユーザからフィードバックが無いとどうなっているかわからないところですよね。。
Sandbox で1台や2台のデバイスにテストしたところで気付きにくいし。

外部の gem やプラグインもちゃんと中身を把握して使いましょう、という当然の教訓を再度噛み締めつつ。

2013年4月9日
by kazoo
0 comments

UIButton上の画像のcontentMode

UIView の表示をどのようにスケーリングするかを決めるプロパティの contentMode を、UIButton 上の画像に適用させようとして、

などとしてもアスペクトが変えられてしまう。

いろいろやってみた結果、

で、OKだった。
UIButton の imageView プロパティは readonly だが、その UIImageView 自身のプロパティは読み書き可能。
特に setImage: との順番も縛りはないらしい。

button.adjustsImageWhenHighlighted = NO; でないとダメという記事もいくつか見かけたが、どちらでも大丈夫なようだった。。どこかのバージョンで直った?

2013年4月3日
by kazoo
0 comments

NSString*とchar*の相互変換

NSString* → char*

char* → NSString*

2013年3月6日
by kazoo
1 Comment

iOSシミュレータ上アプリの実ファイルパスとバンドルリソースの上書き

ちょっとやらかしたのでメモ。。

iOSシミュレータで扱うアプリケーションの実際のファイルパスは、

/Users/xxx/Library/Application Support/iPhone Simulator/6.1/Applications/XXXXXX-XXXX-XXXX-XXXX-XXXXXXX/hogehoge.app/

のようになり、バンドルリソースもこの下にあります。(OS X Lion, XCode 4.6, Simulator 6.1)
iOSバージョンが変われば当該のディレクトリも変わるけど、iPhone/iPad それぞれのシミュレータでは共用らしい。

で、このディレクトリ、シミュレータ上でアプリをアンインストールしたり、メニューから「コンテンツと設定をリセット」したときは消えるのだけど、アプリを上書きでシミュレータをスタートさせるときには同じディレクトリに上書きとなるので、たとえばバンドルリソースファイルが削除されていても、シミュレータ上には古いリソースが残っていたりします。フォルダリファレンスとして登録されたバンドルリソースのディレクトリ内容を手動で変更したときにありがち。

また、たとえば XCode プロジェクトのフォルダをまるっとコピーして、別の開発リソースとして作業をしていても、プロジェクト名(BundleID)が同じものは、シミュレータ上のバンドルリソースも同じディレクトリになります(シミュレータ上同じアプリなんだから当たり前ですが)。

以上は実機でも同じです。上書きのときに古いバンドルリソースは OR を取る形で残っている。

なので、XCode プロジェクトを成果物としてリリースする場合、固めたリリース物を再度解凍して別ディレクトリで最終テスト。。なんてやってるつもりが、XCode 上には存在しないリソースが実は手元のデバイスやシミュレータには残っていて、「おい動かねーぞ」「あほかこっちでは動くわ」なんてやり取りをするハメになったりします。というかなった。反省した。

最終テストはクリーンな環境でやりましょう。。という、ごく当たり前のお話でした。

 

あと、シミュレータアプリのディレクトリをうっかり手動で削除したりすると、

error: failed to attach to process ID 0

というエラーで上書きできなくなったりします。このときにも、素直にシミュレータ上のアプリを長押ししてアンインストールしましょう。