iOSアプリを作成していて、アプリ内購入(非消耗品)を実装しようとしています。
すべてのバンドルIDなどが設定され、機能しており、AppleStoreサーバーを取得すると製品が有効であることがわかります。ただし、テスト中に、paymentQueueコールバックで失敗したトランザクションが発生します。
iOSシミュレーターでステップバイステップで何が起こるかを次に示します。
- 「0.99ドルで購入しますか?」というメッセージボックスが表示されます。どちらが正しい
- [はい]をクリックします。
- 約1秒後、すでに購入したと表示されます(正解です。デバッグ中に最初にテスト購入しました)。[OK]をクリックします。
- ログイン要件について文句を言います(MZFinance_LoginRequiredのようなものが表示されます。文字列識別子が欠落していると思います)。[OK]をクリックします。
- App Storeのログインボックスが表示され、テストアカウントのクレデンシャルを入力します。
- Xcodeのブレークポイントがヒットし、トランザクション状態がSKPaymentTransactionStateFailedになりました。
これが私のコードの関連部分です:
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSArray* arr = response.products;
for (int i = 0; i < arr.count; i++) {
SKProduct* product = [arr objectAtIndex:i];
if([product.productIdentifier isEqualToString:@"<<my in app purchase id which is correct and working>>"]){
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
for (SKPaymentTransaction* ta in transactions) {
switch (ta.transactionState) {
case SKPaymentTransactionStatePurchased:
case SKPaymentTransactionStateRestored:
receipt = [ta transactionReceipt];
[self performSelectorInBackground:@selector(validateFromServer) withObject:nil];
break;
case SKPaymentTransactionStateFailed:
[self purchaseFailed];
break;
}
if(!ta.transactionState == SKPaymentTransactionStatePurchasing){
[[SKPaymentQueue defaultQueue] finishTransaction:ta];
}
}
}}
[self purchaseFailed]
常にヒットし、ユーザーに通知するだけです。ここで何が間違っている可能性がありますか?(私はiOSと-明らかに-アプリの購入においてiOSに不慣れです)。ありがとう。
更新:入力を間違えると別の(無効なログイン)メッセージが表示されるため、テストアカウントの資格情報は正しいです。