I have the following problem and I'm stuck.
For most users, buying and restoring works without problems.
Still, I have a problem with about one in a hundred users that the purchase was not recognized, but was billed. For these users, the purchase was not unlocked. Users can not restore the purchase to the device where the purchase was made. However, these users can use the "restore purchases" feature on a second device without any problem.
The restoration works for me currently as follows:
1. The user call's:
- (void)restore{
wantBuy = YES;
[self productRequestStop];
SKReceiptRefreshRequest *produkt = [[SKReceiptRefreshRequest alloc] init];
[produkt setDelegate:self];
[produkt start];
}Note:
- (void)productRequestStop{
[productsRequest setDelegate:nil];
[productsRequest cancel];
productsRequest = nil;
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
// SKProductsRequest *productsRequest; ** at the interface **2.
- (void)requestDidFinish:(SKRequest *)request{
if([request isKindOfClass:[SKReceiptRefreshRequest class]]){
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}else if([request isKindOfClass:[SKProductsRequest class]]){
}else{
NSLog(@"unkown requestDidFinish %@ ", request.class);
}
}3.
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
for(SKPaymentTransaction *transaction in transactions){
switch([transaction transactionState]){
case SKPaymentTransactionStatePurchasing:
NSLog(@"Transaction state -> Purchasing");
break;
case SKPaymentTransactionStatePurchased:
NSLog(@"Transaction state -> Purchased: %@",[[transaction payment] productIdentifier]);
if ([[[transaction payment] productIdentifier] isEqual: inAppID_ProVersion]) {
[self unlook_ProVersion];
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
NSLog(@"Transaction state -> Restored");
[self unlookRestore:[[transaction payment] productIdentifier]];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:{
if(transaction.error.code == SKErrorPaymentCancelled){
NSLog(@"Transaction state -> Cancelled");
}else{
NSLog(@"SKErrorPaymentCancelled %@", transaction.error.description);
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
case SKPaymentTransactionStateDeferred:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
}
}4.
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue{
for(SKPaymentTransaction *transaction in queue.transactions){
if(transaction.transactionState == SKPaymentTransactionStateRestored && wantBuy){
[self unlookRestore:[[transaction payment] productIdentifier]];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
}
}I have now developed an ONLINE log extension via JSON Script and found out what happens if one of these problem users wants to restore purchases.
1. The User calls [self restore];
2. The User reenter his login data.
3. The requestDidFinish was called with SKReceiptRefreshRequest
4. Now it calls: [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
5. At normal user it calls paymentQueue:updatedTransactions: but at problem users this function is not called.
6. At problem user it calls after restoreCompletedTransactions the function paymentQueueRestoreCompletedTransactionsFinished with a empty queue.transactions array (Zero SKPaymentTransaction).
Why does this work for users only on the 2nd device? The code is the same! A re-instalation and a log-out in the AppStore were also unsuccessful.