I have a nonConsumable subcription item for skpayment.
I tested with sandbox environment for restoreCompletedTransactions.
It works perpect and I submitted new version to appstore, approved.
So I generated promo code for that and redeem it on appstore. But the real device never called "updatedTransactions"
I put nslog to check it from real device.
But the nslog stopped at (void)restoreCompletedTransactions
- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {
if ((self = [super init])) {
/
_productIdentifiers = productIdentifiers;
/
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
return self;
}
- (void) removeTransactionObserver {
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
/
_completionHandler = [completionHandler copy];
/
_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers];
_productsRequest.delegate = self;
[_productsRequest start];
}
- (void)buyProduct:(SKProduct *)product {
NSLog(@"Buying %@...", product.productIdentifier);
SKPayment * payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
#pragma mark SKPaymentTransactionOBserver
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSLog(@"Entering payment queue");
for (SKPaymentTransaction * transaction in transactions) {
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
default:
break;
}
};
}
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"completeTransaction...");
[self ValidateReceipt:^(NSString *err, NSDate *purchaseDate, NSString *tID) {
NSDictionary *resultDict;
if(err == nil) {
resultDict = @{@"TID" : tID,
@"DATE" : purchaseDate
};
} else {
resultDict = @{@"ERROR" : err
};
}
[[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductPurchasedNotification object:resultDict userInfo:nil];
}];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"restoreTransaction...");
[self ValidateReceipt:^(NSString *err, NSDate *purchaseDate, NSString *tID) {
NSDictionary *resultDict;
if(err == nil) {
resultDict = @{@"TID" : tID,
@"DATE" : purchaseDate
};
} else {
resultDict = @{@"ERROR" : err
};
}
[[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductPurchasedNotification object:resultDict userInfo:nil];
}];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"FaiuledTransaction...");
if (transaction.error.code != SKErrorPaymentCancelled)
{
NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
}
NSDictionary *resultDict = @{@"ERROR" : transaction.error.localizedDescription
};
[[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductPurchasedNotification object:resultDict userInfo:nil];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void)restoreCompletedTransactions {
NSLog(@"RestoreCalled...");
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}