2012-05-14 24 views
6

Tôi đang gặp một số rắc rối với restoreCompletedTransactions khi phát triển một ứng dụng iPhone. Tất cả các vấn đề được liệt kê dưới đây xảy ra khi làm việc trong môi trường sandbox. Ứng dụng chưa được bán. Nó đang được phát triển với Xcode 4.3.2 chạy trong mô phỏng 5.0 và 5.1. Các vấn đề tôi nhận được là:restoreCompletedTransactions trả về thông tin không đầy đủ trong môi trường sandbox

  1. Mỗi lần ứng dụng bắt đầu và cuộc gọi đến AddTransactionObserver được đặt, cập nhậtGiao dịch được gọi với giao dịch được mua. Trên mỗi cuộc gọi lại mã của tôi gọi finishTransaction: để hoàn thành việc mua, và vấn đề này vẫn tiếp tục xảy ra mỗi khi tôi khởi động ứng dụng. Xác nhận cho chính xác giao dịch mua hàng tương tự.
  2. Gọi [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] sẽ không liệt kê tất cả các mặt hàng không tiêu thụ được mua bằng tài khoản. Tôi có 2 lần mua vật phẩm không tiêu hao và chỉ 1 vật phẩm được trả lại mỗi lần. Nếu tôi cố gắng mua mặt hàng bị thiếu trong danh sách, tôi sẽ nhận được một thông báo cho biết rằng mặt hàng đó đã được mua. Mục bị thiếu trong danh sách KHÔNG phải là mục mà tôi gặp vấn đề 1 (được liệt kê ở trên).

Tại thời điểm này, tôi hoàn toàn bị kẹt. Ứng dụng của tôi dựa trên AppStore để trả lại thông tin về các vật tư không tiêu hao, vì chúng tôi không lưu dữ liệu này trong các máy chủ của riêng mình. Nhưng chúng ta cần phải chắc chắn rằng AppStoreKit trả về danh sách với tất cả các mục đã mua. Không chỉ một số.

Đây là mã có liên quan Tôi đang sử dụng để kiểm tra restoreCompletedTransactions:

- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    NSLog(@"updatedTransactions started. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ "); 
    NSLog(@"Number of transactions received: %d.", [transactions count]); 
    int count = 0; 
    for (SKPaymentTransaction *trans in transactions) 
{ 
    NSLog(@"Data for transaction %d: ", ++count); 
    NSString *transId = [trans transactionIdentifier]; 
    switch ([trans transactionState]) 
    { 
     case SKPaymentTransactionStatePurchasing: 
      NSLog(@"Purchasing transaction: %@", transId); 
      if (transId == nil) 
      { 
       NSLog(@" Original transaction Id: %@", [[trans originalTransaction] transactionIdentifier]); 
      } 

      NSLog(@"  No action taken in update"); 
      break; 
     case SKPaymentTransactionStateFailed: 
      NSLog(@"Purchase transaction failed for transaction %@", transId); 
      NSLog(@"  Error %d (%@)", [[trans error] code], [[trans error] localizedDescription]); 
      NSLog(@"  Action Taken: finish transaction."); 
      [queue finishTransaction: trans]; 
      break; 
     case SKPaymentTransactionStatePurchased: 
      NSLog(@"Purchased transaction %@", transId); 
      NSLog(@"  Purchased qty %d of product %@", [[trans payment] quantity], [[trans payment] productIdentifier]); 
      NSLog(@"  Action: called [queue finishTransaction:] to complete purchase"); 
      [queue finishTransaction: trans]; 
      break; 
     case SKPaymentTransactionStateRestored: 
     { 
      SKPayment *paym = [trans payment]; 
      SKPaymentTransaction *origTrans = [trans originalTransaction]; 
      SKPayment *origPayment = [[trans originalTransaction] payment]; 
      NSLog(@"Transaction restored: %@ with original transaction %@", transId, [[trans originalTransaction] transactionIdentifier]); 
      NSLog(@"  TRANSACTION DATA:"); 
      NSLog(@"   purchased %d of product %@ on %@.", 
        [paym quantity], 
        [paym productIdentifier], 
        [[trans transactionDate] description]); 

      NSLog(@"  ORIGINAL TRANSACTION DATA:"); 
      NSLog(@"   purchased %d of product %@ on %@.", 
        [origPayment quantity], 
        [origPayment productIdentifier], 
        [[origTrans transactionDate] description]); 

      NSLog(@"  No action taken."); 
      break; 
     } 

     default: 
      NSLog(@"Unexpected transaction state: %d", [trans transactionState]); 
      NSLog(@"  No action taken."); 
      break; 
    } 
} 

NSLog(@""); 
NSLog(@"updatedTransactions ended. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ "); 
} 

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
NSLog(@"Restore completed transactions finished."); 
NSLog(@"  Number of transactions in queue: %d", [[queue transactions] count]); 
for (SKPaymentTransaction *trans in [queue transactions]) 
{ 
    NSLog(@"   transaction id %@ for product %@.", [trans transactionIdentifier], [[trans payment] productIdentifier]); 
    NSLog(@"   original transaction id: %@ for product %@.", [[trans originalTransaction] transactionIdentifier], 
      [[[trans originalTransaction] payment]productIdentifier]); 
    } 
NSLog(@""); 
} 

// Method to restore transactions when user clicks button in application 
- (void) onRestoreCompletedTransactions:(id)sender 
{ 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 
+0

bạn đã thử nghiệm cùng một tình huống trên thiết bị chưa? – 8Ours

+0

Có. Vấn đề xảy ra cả trên thiết bị và trên trình mô phỏng. – DDRider62

Trả lời

0

Bạn đang cố gắng để gọi restoreCompletedTransactions mọi ứng dụng đang bắt đầu? Nếu bạn muốn có một danh sách tất cả các giao dịch bạn sẽ làm cho một SKProductsRequest

SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productsSet]; 
    productsRequest.delegate = self; 
    [productsRequest start]; 

Nếu bạn muốn nhận được completedTransactions và không nhận lại tất cả mọi thứ, xin vui lòng hiển thị các bản ghi.

0

SKProductsRequest sẽ đưa bạn trở lại danh sách các phiên bản SKProduct. Lớp SKProduct không đọc được thông tin đã mua của tôi. Tôi nghĩ bạn thực sự muốn sử dụng restoreCompletedTransactions và lấy lại danh sách các phiên bản SKPaymentTransaction. Điều đó nói rằng, tôi có cùng một vấn đề với một tài khoản sandboxed. Tôi lấy lại danh sách giao dịch không đầy đủ (23 trong tổng số 48). Nhưng nếu tôi chọn mua một vật phẩm không tiêu thụ được mua nhưng không được phục hồi, cửa hàng đó là một mặt hàng đã mua và sẽ gửi lại bản khôi phục cho mục đó.

Bất kỳ may mắn nào giải quyết vấn đề này?

+0

Đã lâu rồi, nhưng tôi tin rằng tôi không thể giải quyết vấn đề. Đó là (hoặc vào thời điểm đó) là một vấn đề với môi trường sandbox. – DDRider62

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