2013年12月28日土曜日

Kobold2D 2.0.4 でのAdMobのバージョンに注意

以前、XCode5.0アップグレードとKobold2d2.0.4のリンクエラー という投稿をしましたが、AdMobのバージョンアップをせずにリンクの修正のみを行いました。
その後、アプリの申請を行ったのですが、AdMobのAPIに対して以下の指摘がリジェクトメールで返されました。レビュー前のバイナリアップロードの直後で返されたものです。

Non-public API usage:
Apps are not permitted to access the UDID and must not use the uniqueIdentifier method of UIDevice. Please update your apps and servers to associate users with the Vendor or Advertising identifiers introduced in iOS 6.

参考ブログのiOS開発ブログさんによれば、AdMobのバージョンを、最新にすればよいということです。GoogleよりAdMob 6.7.0 をダウンロードし、参考ブログのデベロプメンさんの方法で、以下の作業を行いました。

・Valid Architecturesは、armv7のみにした。
・Kobold2Dインストール先のKobold2D-2.0.4/__Kobold2D__/libs/GoogleAdMobAdsSDK
のヘッダファイルとライブラリファイルを最新と入れ換える。←ただし、これはルール違反ですので、プロジェクトの下にディレクトリを作ったほうがよいでしょう。
・デベロプメンさんの方法ではBuild Phases→Link Binary With LibrariesにlibGoogleAdMobAds.aを追加するとありますが、リンクエラーが発生したために削除しました。
・Build Phases→Link Binary With LibrariesにAdSupport.frameworkを追加しOptionalにする。
・Other Linker FlagsのDebugとReleaseの両方に-ObjCというフラグを追加する。

私の場合は、config.luaでは、iAdのみ有効にし、AdMobを無効にしています。
よって、AdMobを有効にして設定を行った場合、もしかすると不具合が出るかもしれません。以上の作業を行い再度バイナリアップロードしました。無事レビューへと行けました。

参考ブログ

2013年12月21日土曜日

CocosBuilderで作成するとReleaseビルドでクラッシュする

何気なくCocosBuilderで検索していたところ、下記のようなブログの投稿を発見しました。

Taiatari さんのブログで、
CocosBuilderにリジェクトの罠!このバグ致命的!

同じような問題が、他に投稿されていないかと検索してみたところ、

cocos2d iphone の公式サイトのフォーラムに、

iPad project using CocosBuilder fails release, runs debug

という投稿がありました。

今年、2013年の5月に投稿されていたようで、今頃になって見つけてしまいました。
私も、CocosBuilderの2.1でアプリを制作していまして申請直前でしたので、助かりました。
これからは、こまめにチェックしておかないといけないですね。
どうも、ありがとうございます。

自分のアプリをReleaseで実機 iPodTouch 4th iOS6.1.5 で実行させたところ。
見事にクラッシュしました。
Organizerのデバイスログで見ると、

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   hoge-iOS                 0x000d74b8 -[CCBReader readFloat] (CCBReader.m:199)

やはり、CCBReader.m のメソッド readFloat で落ちているみたいです。
上記の公式サイトの投稿によると readHeader も修正したほうがよさそうです。

readHeader 修正後
- (BOOL) readHeader
{
    // if no bytes loaded, don't crash about it.
    if( bytes == nil) return NO;
    // Read magic
    int magic;
    unsigned char* pData = ( bytes + currentByte );
    //    int magic = *((int*)(bytes+currentByte));
    memcpy( &magic, pData, sizeof( int ) );
    currentByte+=4;
    if (magic != 'ccbi') return NO;
    
    // Read version
    int version = [self readIntWithSign:NO];
    if (version != kCCBVersion)
    {
        NSLog(@"CCBReader: Incompatible ccbi file version (file: %d reader: %d)",version,kCCBVersion);
        return NO;
    }
    
    return YES;
}
 readFloat 修正後
- (float) readFloat
{
    unsigned char type = [self readByte];
    
    switch (type) {
        case kCCBFloat0:
            return 0;
        case kCCBFloat1:
            return 1;
        case kCCBFloatMinus1:
            return -1;
        case kCCBFloat05:
            return 0.5f;
        case kCCBFloatInteger:
            return [self readIntWithSign:YES];
        default: {
            // using a memcpy since the compiler isn't
            // doing the float ptr math correctly on device.
            float f = 0;
            unsigned char* pData = (bytes + currentByte);
            memcpy(&f, pData, sizeof(float));
            currentByte+=4;
            return f;
        }
    }
}
 このバグの原因は、armv7のメモリアロケートにあるらしいのですが…
…よく理解できませんでした。勉強し直します。