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];
  1. 非ARCです。
  2. 投稿するにはTestLink側でXML-RPCの設定を有効にしておく必要があります。

cocos2dでキーボードを使う

cocos2dというとiOSのゲームエンジンというイメージが強いですが、Mac用のゲーム開発にも使う事ができます。iOSアプリではインプットにタップイベントや加速度センサーを使うのに対し、Macアプリではキーボードやマウスを使うのが一般的です。 “cocos2dでキーボードを使う” の続きを読む

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によれば、アプリケーションがアクセスを許可されているディレクトリは下記の場所に限られています。

  1. Temporaryディレクトリ
  2. Libraryディレクトリの下記の場所
    1. ~/Library/Application Support/<app-identifier>
    2. ~/Library/<app-identifier>
    3. ~/Library/Caches/<app-identifier>
  3. ~/Musicや~/Picturesなど (音楽や画像などを扱うアプリケーションの場合)
  4. 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;
}

参考

  1. File System Usage Requirements for the App Store
  2. File System Programming Guide

SKPaymentQueueのaddPaymentとTransaction

StoreKit APIを使う上で不便な点の一つに、生成したTransactionを追跡するのが難しい、という問題があります。PaymentをQueueに積むとTransactionが生成されますが、その生成されたTransactionの情報を取得する方法について調べていきましょう。
“SKPaymentQueueのaddPaymentとTransaction” の続きを読む

SKPaymentTransactionについてkwsk

StoreKitのトランザクションには、トラブルが発生した際に重要になる情報が多く含まれています。SKPaymentTransactionオブジェクトに含まれる情報と、それらの挙動について確認していきましょう。なお、複雑になるのでNon-Consumableプロダクトのリストア関連の項目については、基本的に省略しています。 “SKPaymentTransactionについてkwsk” の続きを読む

sink.jsが面白い HTML5で音響合成

5年程前にブラウザ上で音響合成をする方法を模索していて、当時はレイテンシや負荷の問題を解決できず断念してしまったのですが、最近Web Audio APIがアツいという話を耳にして、早速試してみました。その中でもsink.jsを使うと、かなり簡単にブラウザ上での音響合成を楽しめます。まさに夢がひろがりんぐ。 “sink.jsが面白い HTML5で音響合成” の続きを読む