17

ユーザーがキャンセルボタンをタップしたかどうかを確認するにはどうすればよいですか(smthを購入するかどうかを尋ねられたとき、またはこのSKProductをダウンロードするかどうかをすでに購入しているかどうか)。

今のところ、ユーザーがキャンセルボタンをタップした後と、たとえばインターネットがない場合の両方で、paymentQueue:updatedTransactions:メソッドでSKPaymentTransactionStateFailedを受け取ります。これら2つのケースを区別する方法はありますか?

4

7 に答える 7

23

このコードは私のために働きます:

if (transaction.error.code != SKErrorPaymentCancelled) {
    NSLog(@"Other error");
} else {
    NSLog(@"User canceled");
}
于 2013-03-08T15:14:17.383 に答える
15

エレンの答えは完璧です。誰かが他のケースについて疑問に思っている場合に備えて

switch (transaction.error.code) {
   case SKErrorUnknown:
       //Unknown error
       break;
   case SKErrorClientInvalid:
       // client is not allowed to issue the request, etc.
       break;
   case SKErrorPaymentCancelled:
       // user cancelled the request, etc.
       break;
   case SKErrorPaymentInvalid:
       // purchase identifier was invalid, etc.
       break;
   case SKErrorPaymentNotAllowed:
       // this device is not allowed to make the payment
       break;
   default:
       break;
}
于 2015-01-08T15:09:49.070 に答える
1

アプリ内購入にRayWunderlichのチュートリアルコードを使用している可能性があります。そこにコードは言います:

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {

if ((self = [super init])) {

    // Store product identifiers
    _productIdentifiers = productIdentifiers;

    // Check for previously purchased products
    _purchasedProductIdentifiers = [NSMutableSet set];
    for (NSString * productIdentifier in _productIdentifiers) {
        BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
        if (productPurchased) {
            [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; // CHECK THIS
            [_purchasedProductIdentifiers addObject:productIdentifier];
            NSLog(@"Previously purchased: %@", productIdentifier);
        } else {
            NSLog(@"Not purchased: %@", productIdentifier);
        }
    }

ここで、addTransactionObserverが呼び出されるのは、製品がすでに購入されている場合のみであることがわかります。このコード行をifクエリの前に移動すると、目的の結果が得られます。

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; // MOVE HERE
if (productPurchased) {
    [_purchasedProductIdentifiers addObject:productIdentifier];
    NSLog(@"Previously purchased: %@", productIdentifier);
} else {
    NSLog(@"Not purchased: %@", productIdentifier);
}                

failedTransactionメソッドで、を呼び出すことができます

 [[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductPurchasedNotification object:nil userInfo:nil];

これで、現在のビューで通知によって送信されたnil値を確認できます。

于 2013-01-21T13:41:23.867 に答える
1

設定されている SKPaymentTransactionerrorプロパティを確認してください。

@property(nonatomic, readonly) NSError *エラー

トランザクションの処理中に発生したエラーを説明するオブジェクト。(読み取り専用)

error プロパティは、transactionState が SKPaymentTransactionStateFailed に設定されている場合を除き、未定義です。アプリケーションは error プロパティを読み取って、トランザクションが失敗した理由を判断できます。

さらに、Apple の Reachability クラスを使用して、トランザクションを開始する前にインターネットが利用可能かどうかを判断することもできます。

于 2012-11-26T18:49:32.010 に答える