2012年7月25日

AT-METRONOME Version 2.52

楽器練習に最適! AT-METRONOME 久々にバージョンアップしました。
前回のVerUpからなんと4ヶ月も経ってしまいました。
でも内容はなんてことありません。
In-App Purchaseにおいて、既に購入された方はリストアがわかりやすくなりました。
あとAdMobのライブラリを最新版にしています。


バージョン 2.52 の新機能

In-App purchaseにリストアボタン追加
AdMob lib アップデート

In-App Purchaseにハマる (リストア編)

久々にリジェクトされましたああ。 顛末はいちおう書いておこうと思います。

AT-METRONOMEのコードもしばーらく触ってなかったので、たまにはバージョンアップとかしないとなあ、って思ってバージョンアップしました。
最近ちょっと忙しいので、AdMobのライブラリを最新版にするだけの、正直どーでもいいバージョンアップw

ところが! リジェクトされました!

その1・アプリはいいんだけどさあ、In-App Purchaseのコンテンツがアップロードされてないじゃん? マニュアル読めよ
みたいなリジェクトでした。 えええ!? これはかなり???でした。 AT-METRONOMEのアプリ内課金の機能拡張は、制限解除する方式なので、実際はダウンロードするコンテンツなんて無いからです。
全くIn-App Purchaseの欄なんて触ってないのに…

いろいろ悩んで、AppLoader使ってIn-App Purchaseのプロジェクトをアップロードしろってこと? と思ってIn-App Purchaseを無理矢理更新してアップロードしてもIn-App PurchaseはWaiting for Uploadのまんま。
Hosting Content with Appleの項目もOFFにする方法わかんないし…
In-App Purchaseの更新を取り消す方法もわからずもう無理ですって感じでした。
アプリのほうのアップロードタイミングが関係するのかな? と思ってアプリのほうを再アップロードしたりしましたが、それでもわからずしばらくお手上げ。
ちょっとレビュアーへの質問考えるかなって思って、ちょっと放置しました。
(でもアプリのほうはWaiting for Reviewのまんまでほっといた)

そしたらまたリジェクトされたー

その2・リストアなのかなんなのかユーザーはわかんねーぞゴルァ マニュアル読め!
ああ、そ、そうですねって感じで今度はリストアボタン追加してアップロード。
今までそんなことなんにも言われなかったのになー
あとIn-App Purchase更新途中だったのでサンドボックスが使えなくなってたんだけど、なんかあっさり更新分消せました。

でまあ、めでたくReady for Saleになりました。

しかし・・・最初のリジェクトその1とはいったいなんだったのか???
関係ないやーーーん!

あんまり記憶が定かで無いんだけど、2回目のリジェクト後、In-App Purchaseの更新を削除するボタンが出現してた。 最初は無かったと思うんだよなあ〜。
丁度、AppStoreサーバーのトラブルにもぶつかっちゃったしorz
例のStore偽装の件でなんかいろいろ仕組みをちまちま変更してない?Apple?ブツブツ

In-App Purchaseに厳しくなってたり、シミュレータでアプリ内購入できなくなってたり、なんか前よりややこしくなってて焦ったw
やっぱりちょっと活動してないと置いてかれるなあw

そういえば関係ないけど、iTunes Storeで、音楽のプラスアップデートでも問題があって問い合わせたんだけど、質問自体をわかってもらえずじまいで;;、ちょっと最近アップルの対応に不満が増してます。


おまけ:リストアボタンのための主な追加部分はこんな感じ

- (IBAction)pushRestoreButton:(id)sender {
    
    [[SKPaymentQueue defaultQueue] addTransactionObserver:(id)self];

    NSSet *productIds = [NSSet setWithObject:@"プロダクトID"];
    skProductRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIds];
    skProductRequest.delegate = (id)self;
    // 購入履歴チェック
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
    BOOL restore = NO;
    UIAlertView *alert;
    
    for (SKPaymentTransaction *transaction in queue.transactions) {
        // プロダクトIDが一致した場合
        if ([transaction.payment.productIdentifier isEqualToString:@"プロダクトID"]) {
            restore = YES;
            //NSLog(@"Restore OK!");
            [self completeUpgradePlus];
            [queue finishTransaction:transaction];
            
            alert = [[UIAlertView alloc] initWithTitle:@"Thank you." message:NSLocalizedString(@"restoresuccess", nil) delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            
            break;
        }
    }
    
    // 一致するものがなかった場合
    if (restore == NO) {
        for (SKPaymentTransaction *transaction in queue.transactions) {
            [queue finishTransaction:transaction];
        }
        alert = [[UIAlertView alloc] initWithTitle:@"Cancel" message:NSLocalizedString(@"restorefail", nil) delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];

    }
}

// リストアに失敗した場合
- (void) paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {

    UIAlertView *alert;
    
    alert = [[UIAlertView alloc] initWithTitle:@"Cancel" message:NSLocalizedString(@"restorefail", nil) delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}