2011-10-13 29 views
8

Tôi đang triển khai tính năng Mua hàng trong ứng dụng với nút Khôi phục.StoreKit: Catch không khôi phục được?

Tôi có người dùng thử nghiệm hoàn toàn mới được thiết lập mà không cần thanh toán.

Khi tôi nhấn nút khôi phục và đăng nhập bằng người dùng thử mới, tôi không thể nhận bất kỳ phương thức được ủy quyền nào cho tôi biết rằng giao dịch khôi phục không thành công (vì không có gì để khôi phục).

Phương thức duy nhất được gọi là -(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue*)queue, nhưng phương thức này được gọi trong trường hợp khi khôi phục thành công.

Tôi có thể làm gì bây giờ? Làm thế nào tôi có thể nắm bắt một trường hợp như vậy?


Bổ sung: Tôi có chỉ báo tiến trình cho biết "Liên hệ với cửa hàng ứng dụng" và tôi cần lời gọi nơi tôi cũng có thể ẩn trong trường hợp không thành công.

+0

Kể từ vấn đề đã không được mua bởi người dùng thử nghiệm, bạn sẽ không nhận được 'SKPaymentTransactionStateRestored' trả lời từ iTunesConnect, mà cuối cùng kết thúc quá trình chuyển mã của bạn. – Hisenberg

+0

Thats rõ ràng. Nhưng tôi đã hiển thị chỉ báo tiến trình "Liên hệ với Cửa hàng ứng dụng" và tôi vẫn cần một sự kiện để ẩn sự kiện đó khi không thành công. – Geri

+1

không có lỗi, khi không có giao dịch nào để khôi phục. Trên thực tế trường hợp này được xử lý thành công. – Felix

Trả lời

1

Khi bạn khôi phục lại một giao dịch, đang có hai phương pháp phân quyền:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 

Người đầu tiên (paymentQueueRestoreCompletedTransactionsFinished) được gọi là khi tất cả các giao dịch được khôi phục. Nếu bạn không có bất kỳ mua trước đó nó cũng gọi phương pháp này bởi vì phục hồi làm việc tốt nhưng không có gì để khôi phục lại.

Phương thức khác (restoreCompletedTransactionsFailedWithError) được gọi khi có lỗi khi khôi phục giao dịch.

Nếu bạn cần để hiển thị một thông điệp tới người dùng nói rằng anh không có bất kỳ giao dịch để khôi phục, bạn có thể sử dụng:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 

Ở đây bạn có một đoạn nhỏ cho delegate này:

// 
// called when the transaction status is updated 
// 
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    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]; 
       restoredTransaction++; 
       break; 
      default: 
       break; 
     } 
    } 
} 

Sau đó, bạn có thể sử dụng restoredTransaction biến để biết nếu bất kỳ giao dịch đã được khôi phục trên paymentQueueRestoreCompletedTransactionsFinished

+0

Nhưng Geri đã giải quyết vấn đề này như thế nào? Ông nói rằng ông đã giải quyết nó với trả về 0 được trả lại từ NSLog nếu không có mua hàng được thực hiện trước đây. – MasterRazer

0

Bạn có thể sử dụng phương pháp ủy nhiệm sau đây để Khôi phục giao dịch.

-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error{ 
NSLog(@"Error when purchasing: %@",error); 

} 
+0

đại biểu đó chỉ được gọi nếu khôi phục đã bị hủy hoặc có lỗi kết nối internet. Tôi muốn nếu người dùng không thực hiện bất kỳ giao dịch mua nào trước đó và đó là vấn đề. Hãy xem các ý kiến ​​của câu hỏi. Có một solutin với trả về một giá trị nhưng tôi không biết làm thế nào. – MasterRazer

6

Noah: đây là một đoạn mã cho bạn:

-(void)restore { 

    [self.delegate showLoadingScreen]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 


} 

Và phương pháp sau:

-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { 

    if (!queue.transactions || [queue.transactions count] == 0) { 

     [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."]; 

    } else { 

     BOOL didRestore = NO; 

     for (SKPaymentTransaction *t in queue.transactions) { 

      if (t.transactionState == SKPaymentTransactionStateRestored || t.transactionState == SKPaymentTransactionStatePurchased) { 

       NSTimeInterval now = [[NSDate date] timeIntervalSince1970] - _timeOffset; 
       NSTimeInterval expire = [t.transactionDate timeIntervalSince1970] + kExplorerSubscriptionSecondLength; 
       NSTimeInterval purchase = [t.transactionDate timeIntervalSince1970]; 

       if (purchase <= now && now <= expire) { 

        didRestore = YES; 
       } 

      } 


     } 

     if (!didRestore) 
      [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."]; 

    }  

    [self.delegate dismissLoadingScreen]; 

} 

Hãy cho tôi biết nếu điều đó giúp bạn ....

+0

cảm ơn vì sự chờ đợi của bạn. Bây giờ kiểm tra xem bây giờ – MasterRazer

+0

thx, giải quyết ... với dòng này: D (! Queue.transactions || [queue.transactions count] == ​​0) – MasterRazer

+0

tôi vẫn thấy tôi cần câu lệnh khác. nhưng tôi nhớ bây giờ trong tình huống nào ... nếu người dùng có đăng ký đã hết hạn và bạn cố gắng khôi phục, nó sẽ vẫn trả lại các giao dịch mua trước đó cho mỗi tháng người dùng đã đăng ký. đó là lý do tại sao tôi kiểm tra khoảng thời gian. nếu "now" không nằm trong bất kỳ khoảng thời gian nào, thì không có gì được khôi phục. điều này có thể không áp dụng cho trường hợp của bạn –

Các vấn đề liên quan