Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2012-01-21

AppStoreに並ぶ最終的なバイナリサイズを計測する方法

Xcode でビルド(Archive)した ipa のサイズと、AppStore に並ぶ最終的なアプリのサイズは微妙に違います。しかもちょっとサイズが増える方向にいくので、20MBギリギリで作っている場合に非常に困ります


たとえば以前出したKOF ENCOUNTERという位置ゲーアプリは素材が膨大にあり、開発途中に 60MB までふくれあがったものをかなり苦労して 19.0MB まで落としたのですが、19.9 とかじゃなく 19.0 まで落としたのは、この「最終的にサイズがちょっと増える」を考慮してのことです。

(AppStoreを見ると、最終的に19.6Mになったようです)


で、事前にこの「最終的なバイナリサイズ」が事前にわからないもんかなーと思っていたのですが、こんな記事を教えてもらいました。


20MB Limit: Finding the Real Size of an App Binary


以下に「最終的なバイナリサイズを調べる手順」を抜粋します。


手順


1. オーガナイザ の Archives タブからサイズを調べたいアプリを選択し、右クリックから "Show In Finder" を選択する


f:id:shu223:20120121123328p:image:w350


2. Finderが開くので、右クリックで「パッケージの内容を表示」


3. Products -> Applications とフォルダ階層を辿り、XXX.appを選択し右クリックで「パッケージの内容を表示」


4. バンドル名と同名のファイルがあるので、そのサイズをメモって削除する

【注意!】削除してしまうので、バンドル全体をどっか別の場所にコピーして作業してください。あともちろん自己責任でお願いします)


f:id:shu223:20120121123329p:image:w207


5. 残りのファイルを全部選択して右クリックから圧縮


f:id:shu223:20120121123330p:image:w208


6. 5でできた圧縮ファイルのサイズと、4で削除したファイルのサイズを合計したものが、このアプリのとり得る最大のサイズとなる



「最大サイズ」ってことで、これがそのままAppStoreのサイズと同じってわけではないようです。ただこの方法で20MB以内なら大丈夫、という指標にはなります。


実際にKOF ENCOUNTERで試したところ、上記計算方法での合計サイズは19.8MBとなりました。AppStoreでのサイズは19.6MBなので、まぁまぁ合っているようです。



2012-01-20

iBooks Author で作成した電子書籍を iBookstore に公開する手順のまとめ

ヘルプに書いてあった手順の要約、抜粋になります。


公開のための準備

1. iBookstore 販売者アカウントを作成する


こちらからどうぞ。

http://www.apple.com/jp/itunes/sellcontent/


2. 「iTunes Producer」をダウンロードする

「iTunes Producer」は、ブックを iBookstore に送信するためのアプリケーションです。iBookstore 販売者アカウントを作成したら、iTunes Connect にサインインして「iTunes Producer」をダウンロードできます。


3. 契約

詳しくは、iTunes Connect にサインインして「Contracts, Tax, and Banking」を参照してください。



iBookstore に公開する手順

  1. ブックが開いている状態で、ツールバー で「公開」をクリックするか、「ファイル」>「公開」と選択します。
  2. ブックの名前を入力し、保存したい場所を選択します。
  3. 「公開」をクリックします。
  4. 拡張子 .itmsp のファイル(iTunes Store パッケージ)が作成されます。ブックのおおよそのファイルサイズを表示するには、Finder でファイルを選択します。
  5. 「iTunes Producer」で iTunes Store パッケージファイルを開きます。

ヒント:「公開」をクリックしたときに「iTunes Producer」が自動的に開くようにするには、「iBooks Author」>「環境設定」と選択し、「一般」パネルで「公開時に iTunes Producer を必ず自動的に起動」を選択します。


その他ヘルプに書いてあったこと

  • iBookstoreでのファイルサイズ上限は 2 GB
  • 3G ネットワークを使用する読者は、20 MB を超えるブックをダウンロードできない
  • ダウンロード時間を最適化するには、ブックファイルのサイズを常に 1 GB 未満にするとよい


2012-01-19

iOS 5 から GameCenter に追加された GKNotificationBanner

最近購入した下記のiOS5本、iCloud や ARC や Storyborad はもちろんのこと、「こんなのもあったのか」というような細かいネタもいろいろと載っていて、大変勉強になります。


詳解iOS5プログラミング
沼田 哲史
秀和システム
売り上げランキング: 303,701


で、この本では GameCenter についても40ページぐらい割かれているのですが、気になったのが

iOS 5 からは(中略)友人のもっているゲームなどを元にして、関連ゲームをブラウズして、直接GameCenterアプリから購入することもできるようになりました。また、ギフトとして、友人にアプリを贈ることも可能です。

という記述。


ここについてはこれ以上の情報は載っていなかったので、Appleの Dev Center に上がっている iOS 4.3 to iOS 5.0 API Differences というドキュメントから関係しそうなAPIがないか探してみました。

「友人のもっているゲーム情報をとってくる」とか、「アプリ内からギフトアプリを友人に贈る」とかそんなAPIがあったらいいなーと期待しつつ。


で、ひとつ引っかかったAPIがこれ。

GKNotificationBanner.h

Added GKNotificationBanner

Added +[GKNotificationBanner showBannerWithTitle:message:completionHandler:]


リファレンスを見てみると、

The GKNotificationBanner class allows your application to display a notification banner that displays text to the player. The behavior of this banner is identical to other banners used by Game Kit.

とのこと。


要はバナーを表示するクラスのようです。GameCenterログインしたときに上からピョコンとでてくるアレでしょうか。


そして唯一存在するメソッドの定義はこちら。

+ (void)showBannerWithTitle:(NSString *)title message:(NSString *)message completionHandler:(void (^)(void))completionHandler

なるほど。。



少なくとも、期待していたようなAPIではなさそうですが、ランキングがあがったときに知らせる、といった用途に使えそうではあります。



2012-01-17

iOS Advent Calender 2011 で勉強になったことメモ

昨年末にiOS Advent Calender 2011というイベントがあったらしく、遅ればせながらチェックしてみたところいろいろと知らなかったこと、勉強になったことがあったので、以下にメモしておきます。


CocoaPods に対応していないライブラリを集めた自分用リポジトリを作る方法

http://akisute.com/2011/12/cocoapods.html


CocoaPodsというのは、

このCocoaPodsを使うと今まで大変面倒くさかったライブラリの管理が嘘のように簡単になります。たとえば、新しいプロジェクトを始めるときに、

  • 通信したいからASIHTTPRequestを使おう
  • APIのレスポンスがJSONだからJSONKitも必要だな
  • DBにはCore Dataを採用したいから、MagicalRecordも欲しいな
  • Blocksバリバリ使うからBlocksKitは常識だよね

と思ったら、さくっと以下のような設定ファイル(Podfile, mavenで言うところのpom.xml)を書いてやれば、あとはCocoaPodsが指定されたライブラリを取ってきてビルド設定までやってくれるわけです。

というものらしいです。


でもまだまだ発展途上らしく

  • つい最近できたばかりのツールなので、対応しているライブラリが少ない

とのこと。


ライブラリ対応状況は下記をみればよさそうです。

https://github.com/CocoaPods/Specs

CocoaPods自体は使用しないとしても、Cocoa開発者が使用しているメジャーなライブラリ一覧としてひとつの参考になりそう。


そのUI, まずはCocoa Controlsで探してみよう

http://d.hatena.ne.jp/ntaku/20111209/1323408037


Cocoa ControlsはiOSやMax OS X開発者が開発したUIコンポーネントが大量に登録されているありがたいサイトです。現在、iOS用のコンポーネントが330弱、Mac OS X用が50弱登録されています。


あとで見る。


お客様の中に名探偵はいらっしゃいませんか?

http://watermint.org/2011/12/10/1501.html


DTraceでのデバッグの話。


  • 初期化処理がどうやらうまくいっていないようだが、どこまで実行されたか知りたい。しかし、Xcodeのデバッガでステップ実行・ブレークポイント設定などしながら確認するにはプログラムが大きすぎる。
  • NSLogを埋め込んでどこまで実行されたか確認したいが、そもそもログを埋め込むのが面倒くさい。または、ソースコードをNSLogだらけにして汚したくない。

こういうときに活躍するようです。

その名の通り、プログラムの実行状況をtraceするしくみ。


手順をざくっと書くと

  • シミュレータでアプリを実行
  • ターミナルからシミュレータで実行されているアプリのプロセスIDを指定してdtraceを実行

これだけでObjective-Cで実行された関数がリアルタイムに出力されます。


で、さらにありがたいことに、スクリプトを書いて引数に指定して実行することで、関数呼び出しをダンプしたりもできるようです。


XCodeからappCodeへ乗り換える8つの理由

http://d.hatena.ne.jp/happy_ryo/20111211


appCodeというIDEの話。


個人的にはXcodeのコード補完には満足してたのですが、こういうのもあるのかー、ってことでメモ。


facebookライクなスライドメニュー

http://blog.livedoor.jp/inonb/archives/1543275.html


UINavigationController を使ったカスタムUIの作り方の参考として。


10分でわかるGoogle Analytics SDK for iOS

http://d.hatena.ne.jp/murapong/20111220/1324379177


Webと違いiOSアプリはオフライン時にも利用されます。オフライン時のデータは一旦端末に記録されて、オンラインでデータ送信可能なタイミングでまとめて送信されます。


以下のサイトを参考にし、マクロを定義しておくと便利です。

http://d.hatena.ne.jp/ninjinkun/20110115/1295074900

http://wp.serpere.info/archives/2308


iOS向けのオープンソースをまとめたサイトを作りました

http://yomoapp.tumblr.com/post/14552666148/ios


lambというiOS向けのオープンソースプロジェクトを集めたサイトを作りましたというお話。

http://lamb-inside.appspot.com/


UIのスクリーンショットが入り口になっていて、とても良さげです。



2012-01-14

In-App Purchase で、プロダクトID が invalid になる場合の対処方法

たとえば下記のようなコードでプロダクト情報取得処理を行った場合に、

self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productId]];
self.request.delegate = self;
[self.request start];

プロダクト情報の取得が完了すると productsRequest:didReceiveResponse: メソッドが呼ばるわけですが、そこで下記のように「無効なプロダクトID」をチェックすると

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

if ([response.invalidProductIdentifiers count] > 0) {
  // 無効なプロダクトIDあり 
}

みごとにinvalidになっている場合があります。


そんな場合のチェックリスト

  • Have you enabled In-App Purchases for your App ID?
  • Have you checked Cleared for Sale for your product?
  • Have you submitted (and optionally rejected) your application binary?
  • Does your project’s .plist Bundle ID match your App ID?
  • Have you generated and installed a new provisioning profile for the new App ID?
  • Have you configured your project to code sign using this new provisioning profile?
  • Are you building for iPhone OS 3.0 or above?
  • Are you using the full product ID when when making an SKProductRequest?
  • Have you waited several hours since adding your product to iTunes Connect?
  • Are your bank details active on iTunes Connect? (via Mark)
  • Have you tried deleting the app from your device and reinstalling?
  • Is your device jailbroken? If so, you need to revert the jailbreak for IAP to work. (via oh my god, Roman, and xfze)

で、上記のほとんどはアプリを正しく作っていれば問題なくて、ちゃんとやってるはずなのに invalid になる!という場合は


「アプリを削除して再インストール」


これを試してみてください。

(上記リストで太字にした項目にあたります)


参考ページ



2012-01-08

iOS プログラミング 第2版

iOSプログラミングに関してだいぶ網羅的に書かれていて、600ページ近くもある分厚い本。


iOSプログラミング 第2版
アーロン・ヒレガス ジョー・コンウェイ Aaron Hillegass Joe Conway
ピアソン桐原
売り上げランキング: 222,713


書店で目次をパラパラ見ていて、いくつか読んでみたい章があったので購入しました。

が、早くも積読になりそうな気配がしたので、「あとで読む」章だけでもここにピックアップしておきます。


  • 第17章 Core Data
  • 第20章 タッチイベントとUIResponder
  • 第21章 Instruments
  • 第22章 Core Animation レイヤ
  • 第23章 CAnimation を使ったアニメーションの制御
  • 第24章 ブロックとカテゴリ
  • 第28章 Bonjour と Web サーバ

こう書いてみるとそんなに読みたいところないな。。


2012-01-07

In-App Purchase のステータスが "Ready to Submit" な場合の対処法

課金機能つけたアプリ(※個人制作)で、課金数がずーっと0だったので、

「売れないもんなんだなー」

とのんきに構えてたら、なんと Itunes Connect でプロダクトのステータスが "Ready to Submit" になってることに気づいてしまいました。


次のように対処しました。


1. iTunes Connect でアップデートを新規作成(申請前のが既にあるならそれでOK)


2. "View Details" ボタンから詳細設定画面へ


3. 下の方に "In App Purchase" というセクションがあるので、"Edit" をクリック

f:id:shu223:20120129052451p:image:w550


3. 追加するプロダクトにチェックマークを入れて、Save



参考ページ



2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |