長い事Macの環境を新しく作っていなかったので知らなかったのですが、XcodeのCommand Line ToolsはPreferences画面のDownloadsタブから手動でインストールしなければいけなくなっていたようです。これをインストールしないとccなどのコマンドが使えないためrvmなど各種ソフトウェアのビルドに失敗してしまうので、注意が必要です。
Mac App Storeで配信するアプリがアクセス可能なディレクトリ
App StoreにサブミットしたMacアプリがリジェクトされてしまいました。リジェクト理由をみてみると、~/Library/Application Support/AppNameにアクセスしようとしているのが原因の様子。
参考資料として案内されていたFile System Usage Requirements for the App Storeによれば、アプリケーションがアクセスを許可されているディレクトリは下記の場所に限られています。
- Temporaryディレクトリ
- Libraryディレクトリの下記の場所
- ~/Library/Application Support/<app-identifier>
- ~/Library/<app-identifier>
- ~/Library/Caches/<app-identifier>
- ~/Musicや~/Picturesなど (音楽や画像などを扱うアプリケーションの場合)
- OpenPanel, SavePanelなどでユーザが指定したファイル
アプリケーション固有の設定で、NSUserDefaultsに入らないバイナリデータなど(ゲームデータや編集中のファイルの情報など)はこのうち2.のLibraryディレクトリにおく形になります。2のLibraryディレクトリの<app-identifer>については下記のような記述があり、アプリのBundle Identifierかアプリ名、会社名のいずれかに厳格にマッチしなければいけないようです。
<app-identifier> is your application’s bundle identifier, its name, or your company’s name. This must exactly match what is in iTunes Connect for the application.
今回のアプリケーションの場合、今まで配信していた有料アプリケーションの無料版を新たに追加リリースした形だったのですが、ここでapp-identifierが有料版と無料版で変更しなかったためにリジェクトされてしまった模様。というわけで、ここでは固定文字列でデータ保存先を決めるよりBundle Identifierを使う形でコーディングしておいたほうが良いですね。
ちょうどアップルのFile System Programming Guideにもこんなサンプルコードが乗っているので、これを使うのがよさそうですね。
- (NSURL*)applicationDataDirectory { NSFileManager* sharedFM = [NSFileManager defaultManager]; NSArray* possibleURLs = [sharedFM URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask]; NSURL* appSupportDir = nil; NSURL* appDirectory = nil; if ([possibleURLs count] >= 1) { // Use the first directory (if multiple are returned) appSupportDir = [possibleURLs objectAtIndex:0]; } // If a valid app support directory exists, add the // app's bundle ID to it to specify the final directory. if (appSupportDir) { NSString* appBundleID = [[NSBundle mainBundle] bundleIdentifier]; appDirectory = [appSupportDir URLByAppendingPathComponent:appBundleID]; } return appDirectory; }
参考
cocos2d 2.0のRC版がリリース
coco2d 2.0の最初のRC(リリース候補)版がリリースされました。beta2からの大きな変更点としてはiPad Retinaに対応したこと以外は、Menu関連のAPIの変更等細かい変更が主で、大きな機能面での変更はないようです。
cocos2d v2.0-rc0 released | cocos2d for iPhone
SKPaymentQueueのaddPaymentとTransaction
StoreKit APIを使う上で不便な点の一つに、生成したTransactionを追跡するのが難しい、という問題があります。PaymentをQueueに積むとTransactionが生成されますが、その生成されたTransactionの情報を取得する方法について調べていきましょう。
“SKPaymentQueueのaddPaymentとTransaction” の続きを読む
SKPaymentTransactionについてkwsk
StoreKitのトランザクションには、トラブルが発生した際に重要になる情報が多く含まれています。SKPaymentTransactionオブジェクトに含まれる情報と、それらの挙動について確認していきましょう。なお、複雑になるのでNon-Consumableプロダクトのリストア関連の項目については、基本的に省略しています。 “SKPaymentTransactionについてkwsk” の続きを読む
Sinkオブジェクトの生成
Sinkオブジェクトの生成について、詳しく見ていきましょう。
“Sinkオブジェクトの生成” の続きを読む
sink.jsが面白い HTML5で音響合成
5年程前にブラウザ上で音響合成をする方法を模索していて、当時はレイテンシや負荷の問題を解決できず断念してしまったのですが、最近Web Audio APIがアツいという話を耳にして、早速試してみました。その中でもsink.jsを使うと、かなり簡単にブラウザ上での音響合成を楽しめます。まさに夢がひろがりんぐ。 “sink.jsが面白い HTML5で音響合成” の続きを読む
Mac上にWordPressを設置する
WordPressの使い勝手が年々良くなってきて、ここ1-2年は仕事でも個人でもCMSが必要な時にはほぼWordPressを使うようになりました。それに伴い、自分自身でテーマをいじったりプラグインを書いたりすることも増え、ローカル(Mac)にWordPressを設置する機会も増えました(同時に、周りの人に「ローカルに設置して作業してね」と頼む事も多くなった)。備忘録的にMac上にWordPressを設置する方法を書いておきます。 “Mac上にWordPressを設置する” の続きを読む
GCDAsyncUdpSocket
11月末にAsyncUdpSocketのGCD対応版であるGCDAsyncUdpSocketが公開されていました。 “GCDAsyncUdpSocket” の続きを読む
cocos2d v2.0
少し前ですが、cocos2dのv2.0のbeta版がリリースされていました。 “cocos2d v2.0” の続きを読む