Khi chúng tôi cần làm mới biên nhận iOS7, cách thích hợp để làm điều đó là sử dụng SKReceiptRefreshRequest. Thao tác này sẽ trả về hộp thoại Apple để người dùng đăng nhập bằng Apple ID của họ. Nó cũng cho phép họ Hủy. Làm cách nào chúng tôi có thể phát hiện xem người dùng có nhấn Hủy không? (Tất nhiên, trong iOS6, điều này có thể được thực hiện bằng cách sử dụng catching the cancel event for [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]).Phát hiện người dùng hủy SKReceiptRefreshRequest để đăng nhập
Đối tượng SKReceiptRefreshRequest có một đại biểu với hai phương pháp:
- (void)requestDidFinish:(SKRequest *)request;
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;
Trong mã của tôi requestDidFinish phương pháp đại biểu được gọi là nếu người dùng không hoặc không nhấn hủy.
Lý do quan trọng đối với tôi là tôi muốn hủy quá trình khôi phục nếu người dùng nhấn Hủy. Nếu chỉ đơn giản là không có hóa đơn sau khi yêu cầu làm mới, điều này có thể tương đối dễ dàng. Tuy nhiên, đôi khi có một biên nhận (với một số giao dịch mua) có trong ứng dụng trước SKReceiptRefreshRequest và do đó nó vẫn nằm trong ứng dụng nếu người dùng hủy khỏi hộp thoại đăng nhập.
Tôi có hai ý tưởng về cách thực hiện việc này:
1) Xóa biên lai khỏi gói trước yêu cầu làm mới. Vấn đề rõ ràng với điều này là ứng dụng không thể xóa tệp khỏi gói (ví dụ: xem Delete file from bundle after install). Tôi đã thử. Không.
2) Kiểm tra byte của biên nhận trước yêu cầu làm mới và sau đó; nếu chúng khác nhau, thì điều này sẽ cho biết người dùng không nhấn Hủy. Nếu chúng không khác nhau, tôi không chắc chắn rằng có cho biết chúng đã nhấn Hủy. Nếu biên nhận chứa các giao dịch mua, tôi nghĩ rằng các byte sẽ khác nhau bởi vì biên lai được làm mới phải có các id giao dịch khác nhau (nhưng cùng một id giao dịch "gốc"). Nếu biên nhận không có giao dịch mua, tôi không chắc chắn về điều đó.
Cập nhật, 11/9/15; Tôi vừa nhận thấy rằng phản hồi của đại biểu cho người dùng nhấn Cancel dường như đã thay đổi. Bây giờ, didFailWithError được gọi. Tuy nhiên, vấn đề phát hiện hủy người dùng vẫn còn. Làm thế nào chúng ta có thể phân biệt giữa người dùng nhấn Cancel và một lỗi chính hãng? Tôi đã thử nghiệm trên iOS8.4 và iOS9.2 (beta). Bây giờ tôi đã báo cáo sự thiếu phân biệt này là một lỗi đối với Apple (bug # 23476210).
Cập nhật, 11/10/15; Vấn đề này không không xuất hiện với iOS 9.0.2! Tôi đã thử điều này ngay bây giờ với cả ba hệ thống, với cùng một ứng dụng nhị phân, trong cùng khoảng thời gian (trong vòng 20 phút cho cả ba hệ thống): (A) iOS9.2 (13C5050d): Sự cố xảy ra (didFailWithError được gọi là và không thể phân biệt giữa một lỗi thực sự và người dùng nhấn hủy), (B) iOS9.0.2, sự cố không xảy ra (requestDidFinish được gọi) và (C) iOS8.4.1, sự cố không xảy ra. Với tất cả ba phiên bản hệ thống, điều này đang chạy trên phần cứng thực, không phải là trình mô phỏng.
Tôi vừa thử nghiệm số 2) ở trên. Và nếu có biên lai không trống trước khi làm mới, không có giao dịch mua, nó sẽ là một biên nhận không có ** khác ** sau khi làm mới. Hoặc ít nhất là trong hai lần tôi làm như vậy. Tất nhiên, một giải pháp trực tiếp hơn cho điều này sẽ là tốt. Ví dụ: phương pháp xóa được gọi để cho biết người dùng đã nhấn Hủy. Bytewise, 5515 byte và 5522 byte khác nhau giữa các biên nhận trong các bài kiểm tra tôi đã thực hiện. –