EDIT:
Ban đầu tôi đã đăng một phương pháp rất dài, không cần thiết để có được những gì tôi cần làm, nhưng như bạn sẽ thấy bên dưới, Matt đã giúp tôi tìm ra vari có thể tôi đang tìm kiếm.
Ví dụ: giả sử người dùng đã mua ứng dụng của tôi trước đây, mua tất cả IAP không tiêu hao, sau đó xóa ứng dụng. Khi người dùng cài đặt lại ứng dụng, tôi muốn có thể xác định thời điểm họ chuyển sang "mua" các sản phẩm một lần nữa, đây có phải là lần mua hàng ban đầu (lần đầu tiên) hoặc mua lại không?
Tôi đã triển khai nút "Khôi phục tất cả mua hàng", nhưng giả sử người dùng bỏ qua/không nhìn thấy và cố gắng chọn sản phẩm họ đã mua trước đó.
Như với mua hàng bình thường, tôi làm như sau:
if ([SKPaymentQueue canMakePayments])
{
self.productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productID]];
self.productRequest.delegate = self;
[self.productRequest start];
}
else
{
//error message here
}
Sau khi người dùng đã đăng nhập vào tài khoản iTunes của họ, App sẽ cho họ biết họ đã mua này và nó bây giờ sẽ được phục hồi.Phương pháp đại biểu sau đây sẽ được gọi là:
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
{
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
if(transaction.originalTransaction)
{
NSLog(@"Just restoring the transaction");
}
else
{
NSLog(@"First time transaction");
}
break;
}
default:
break;
}
}
}
Không có vấn đề nếu giao dịch là một sự phục hồi hoặc mua hàng lần đầu tiên, transaction.transactionState
sẽ là bằng SKPaymentTransactionStatePurchased
.
Bây giờ, từ thời điểm này, làm cách nào để xác định xem giao dịch mua đó là mua hàng ban đầu hay khôi phục?
Đơn giản: Như đã thấy ở trên, chỉ cần xem nếu transaction.originalTransaction
được khởi tạo. Mỗi ghi chú của Apple: // Chỉ hợp lệ nếu trạng thái là SKPaymentTransactionStateRestored.
Nếu 's originalTransaction
được khởi tạo, điều đó có nghĩa là đã có giao dịch trước đó. Nếu không, giao dịch này là giao dịch gốc!
Một lần nữa, nhờ Matt đã chỉ cho tôi đúng hướng, và để làm cho logic sạch hơn rất nhiều!
Bạn nên xem http://stackoverflow.com/questions/1757467/when-to-use-restorecompletedtransactions-for-in-app-purchases. Trong trường hợp của tôi, tôi đã sử dụng nó bằng nút "Khôi phục các giao dịch trước đó" –
Cảm ơn Micazeve, nhưng từ góc độ phân tích, có vẻ như người dùng chỉ có thể bỏ qua việc nhấn nút "khôi phục" và khôi phục lại bằng cách cố gắng mua lại. nơi tôi phân tích liệu người dùng đã mua hàng hay chưa.Có lẽ khi họ chọn một sản phẩm, thay vì ngay lập tức bắt đầu giao dịch, tôi có thể thực hiện quy trình gọi lại RestoreCompletedTransactions lâu nhất và phức tạp, xem liệu sản phẩm đã chọn có nằm trong danh sách đó hay không, và cho phép người dùng mua sản phẩm đó . Một nỗi đau như vậy ... – Will
Bạn vừa phải, nút này là không cần thiết vì cố gắng mua lại các mặt hàng đã mua cảnh báo người dùng rằng anh ta đã mua mặt hàng này. Vấn đề chính trong tình huống này là người dùng được cảnh báo SAU KHI anh ta chấp nhận trả tiền một lần nữa: "Nút Restore" là hữu ích theo cách tâm lý, bởi vì người dùng không phải thực hiện thủ tục paiement lần thứ hai. - Bạn có thể thử để thực hiện phương pháp của bạn (mà nên hoạt động), nhưng như bạn đã nói, như một nỗi đau;) –