先日、iPadで電子書籍を読んでいたら一通のメールが届きました。 “PayPalで不正引き落としにあった話” の続きを読む
TestFlightのすすめ
デバイスへのアプリのデプロイは、iOSアプリを開発する上でストレスの溜まる作業の一つです。ノンプログラマーの人に説明するには手順が複雑だし、かといって動作確認の度に自分の作業を中断し、彼らのデバイスを預かってアプリをデプロイして渡すのは集中力を低下させます。このストレスを低減してくれるサービスの一つとして、TestFlightを紹介します。 “TestFlightのすすめ” の続きを読む
Android SDKの設定が楽になっていた
iMacの修理からの再セットアップでAndroid SDKについてもゼロからインストールしたのですが、先日のR18リリースに伴うADT PluginのアップデートによってSDKの設定が簡単になっていました。 “Android SDKの設定が楽になっていた” の続きを読む
iOS/Macアプリ開発のためのMacのセットアップ(2012年4月版)
ハードディスクのガリガリ音が妙に大きくなってきたため修理に出していたiMacが戻ってきたので、再びセットアップをしています。せっかくなので(待っている間暇なので)、どういう設定をしているかここに書いておこうと思います。 “iOS/Macアプリ開発のためのMacのセットアップ(2012年4月版)” の続きを読む
githubの新規レポジトリ作成が便利に
githubがアップデートされ、新規レポジトリの作成機能が便利になっていました! “githubの新規レポジトリ作成が便利に” の続きを読む
iOS/OSXのテスト結果をTestLinkに報告するライブラリ
手動テストの結果をTestLinkで管理するようになってから、自動テストの結果もTestLinkで管理したくなったのでXML-RPCを使ってテストの結果をTestLinkに送信するクラスを作成しました。
ダウンロード
ソースコード/サンプルプロジェクト一式をgithubで公開しています。
使い方
SYTestLink* testlink = [[SYTestLink alloc] initWithEndpointURL:PNTestLinkEndPointURL devKey:PNTestLinkDevKey testPlanID:PNTestLinkTestPlanID buildID:PNTestLinkBuildID]; // Do some test if (testFailed) { [testLink sendReportAsPassedForTestCaseID:testCaseID]; } else { [testLink sendReportAsFailedForTestCaseID:testCaseID]; } [testlink release];
- 非ARCです。
- 投稿するにはTestLink側でXML-RPCの設定を有効にしておく必要があります。
cocos2dでキーボードを使う
cocos2dというとiOSのゲームエンジンというイメージが強いですが、Mac用のゲーム開発にも使う事ができます。iOSアプリではインプットにタップイベントや加速度センサーを使うのに対し、Macアプリではキーボードやマウスを使うのが一般的です。 “cocos2dでキーボードを使う” の続きを読む
自分自身のURL Schemeを叩いた場合の挙動
URL Schemeの仕様を確認していて、ふと「アプリケーション内から自分自身のURL Schemeを叩くとどうなるのか」という実験をしてみました。 “自分自身のURL Schemeを叩いた場合の挙動” の続きを読む
XcodeのCommand Line Tools
長い事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; }