2012-07-13 66 views
15

Như được thảo luận in this question và ở mọi nơi khác, giờ đây Apple yêu cầu ứng dụng phải bao gồm phương tiện để người dùng khôi phục giao dịch đã hoàn tất cho Mua hàng trong ứng dụng.Hành vi nút "Khôi phục giao dịch" khi không có gì để khôi phục

Tôi là tất cả vì điều này. Phiên bản đầu tiên của ứng dụng của tôi bằng cách nào đó đã đánh giá quá khứ mà không có nó (tôi không biết quy tắc này vào lúc đó và/hoặc nó chưa được thực thi), nhưng sau đó tôi bắt đầu nhận được nhiều email từ người dùng hỏi về nội dung bị thiếu (cũng có Nguyên tắc lưu trữ dữ liệu và nội dung tải xuống nặng không được sao lưu).

Vì vậy, chúng ta hãy nói rằng tôi bao gồm một nút 'phục hồi' ở đâu đó trong giao diện người dùng của tôi, rằng khi khai thác cuộc gọi:

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 

Cho đến nay, như vậy tốt. Người dùng được nhắc AppleID và/hoặc mật khẩu của mình và quá trình khôi phục bắt đầu.

Vấn đề tôi gặp phải là: Nếu không có giao dịch để khôi phục, sau khi lời nhắc AppleID về cơ bản không có gì xảy ra trong ứng dụng của tôi và có thể gây nhầm lẫn cho người dùng hoặc làm cho ứng dụng trông không phản hồi hoặc bị hỏng.

Tôi muốn có thể hiển thị chế độ xem cảnh báo dọc theo dòng "Tất cả giao dịch mua được cập nhật" hoặc nội dung nào đó.

Tôi có thể làm gì trong mã Quan sát giao dịch của mình để phát hiện trường hợp này không?

Có ai cho rằng đó sẽ là thiết kế tồi, UX khôn ngoan không?

+0

Câu trả lời của Benjamin cung cấp giải pháp thanh lịch hơn mà bạn đã yêu cầu. Bạn có thể đánh dấu câu trả lời của mình là câu trả lời được chấp nhận để mọi người tìm thấy câu trả lời hay nhất? – Timo

+0

Xin chào @NicolasMiari, bạn đã giải quyết vấn đề của mình như thế nào – Ranjit

Trả lời

9

Bạn cũng có thể thực hiện các chức năng đại biểu sau đây:

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

Sau đó, bạn sẽ biết khi quá trình khôi phục đã được hoàn tất hoặc nếu nó thất bại. Bạn có thể kết hợp trong việc sử dụng queue.transactions.count trong paymentQueueRestoreCompletedTransactionsFinished để xem có bất kỳ giao dịch nào được khôi phục hay không.

Hãy nhớ để xử lý SKPaymentTransactionStateRestored trong

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

Bạn cũng có thể muốn để xử lý các giao dịch phục hồi (s) theo cùng một cách như bạn đã làm với SKPaymentTransactionStatePurchased giao dịch (s).

+0

sẽ không queue.transactions.count chỉ trả lại các giao dịch đang chờ xử lý ([link] (http://developer.apple.com/library/ios/documentation/StoreKit/Reference /SKPaymentQueue_Class/Reference/Reference.html#//apple_ref/occ/instp/SKPaymentQueue/transactions))? Trong trường hợp này, luôn luôn trả về 0 (đã hoàn thành bất kỳ giao dịch nào)? –

+1

tôi giữ một cờ _didRestore rằng tôi đặt thành true khi tôi nhận được paymentQueue: updatedTransactions: gọi với transactionState == SKPaymentTransactionStateRestored. sau đó trong paymentQueueRestoreCompletedTransactionsFinished: tôi kiểm tra cờ đó –

0

Tôi đã gặp phải sự cố tương tự trong ứng dụng tôi hiện đang làm việc. Cách giải quyết của tôi là sử dụng bộ hẹn giờ thứ hai X. Nó bắt đầu khi bạn chạm vào nút 'Khôi phục mua hàng' và khởi động lại nếu sự kiện giao dịch được khôi phục xuất hiện. Sau khi đạt đến dấu X thứ hai, tôi có cửa sổ bật lên có nội dung "Đã mua lại được khôi phục". Vì vậy, nếu bạn không có giao dịch, bạn chỉ phải đợi X giây. Hy vọng rằng sẽ giúp.

+0

Tôi cũng vậy. Đã hy vọng sẽ có một giải pháp thanh lịch hơn ... –

8

Tôi đã quan tâm đến đúng/tốt nhất từ ngữ để khôi phục giao dịch mua.

Tôi đã thấy đủ cảnh báo "Lỗi không xác định", chỉ cần sử dụng [error localizedDescription] bên trong -(void)paymentQueue:restoreCompletedTransactionsFailedWithError:. (todo: fill radar)

Vì vậy, tôi đã xem Apple hoạt động như thế nào. Ứng dụng duy nhất từ ​​Apple với Mua hàng trong ứng dụng không tiêu thụ ngay bây giờ là GarageBand (tháng 12 năm 2014).

Thay vì "Khôi phục mua hàng", "Khôi phục mua hàng trước đó" hoặc ... chúng đi với "Already Purchased?".

Purchase Screen 1

Nhưng ở đây là màn hình Tôi quan tâm nhiều hơn trong, kết quả của cách nhấn "Already Purchased?" khi không có gì để khôi phục lại là:

Purchase Screen 2

"There are no items available to restore at this time." Không mang tính cách mạng, nhưng nhịp đập địa ngục trong "Lỗi không xác định"

Vì vậy, hãy xem -(void)paymentQueue:restoreCompletedTransactionsFailedWithError:.

iOS:

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
{ 
    if ([error.domain isEqual:SKErrorDomain] && error.code == SKErrorPaymentCancelled) 
    { 
     return; 
    } 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"There are no items available to restore at this time.", @"") 
                message:nil 
                delegate:nil 
              cancelButtonTitle:NSLocalizedString(@"OK", @"") 
              otherButtonTitles:nil]; 
    [alert show]; 
} 

OS X:

Tôi không hài lòng với chỉ cùng một văn bản trên OS X. Một NSAlert chỉ với messagetext và không informativeText chỉ trông trống và sai.

Một tùy chọn cho tôi là cho người dùng biết rằng anh ấy cần mua nó, với một cái gì đó như "To use it, you need to buy “%@”.".

Một tùy chọn khác mà tôi đưa ra là cho phép trình duyệt đó ở đó Purchase History. Tôi thấy rằng bạn có thể liên kết trực tiếp với nó với itms://phobos.apple.com/purchaseHistory. Trong tất cả sự trung thực Lịch sử mua hàng trong iTunes Store là một phần của shit, nó sẽ đưa bạn cho bao giờ tìm thấy một cái gì đó.

Nhưng có lẽ nó giúp tái bảo hiểm những người mà chúng tôi không cố gắng khiến họ mua lại thứ gì đó. Luôn luôn giả định rằng khách hàng của bạn không biết hoặc không thể nói sự khác biệt giữa Không tiêu thụ và tiêu hao. Và không biết rằng họ không thể bị tính phí hai lần cho một Không tiêu hao.

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
    { 
    if ([error.domain isEqual:SKErrorDomain] && error.code == SKErrorPaymentCancelled) 
    { 
     return; 
    } 

    NSAlert *alert = nil; 
    alert = [NSAlert alertWithMessageText:NSLocalizedString(@"There are no items available to restore at this time.", @"") 
          defaultButton:NSLocalizedString(@"OK", @"") 
          alternateButton:NSLocalizedString(@"Purchase History", @"") 
           otherButton:nil 
       informativeTextWithFormat:@"You can see your purchase history in the iTunes Store."]; 
    NSModalResponse returnCode = [alert runModal]; 
    if (returnCode == NSAlertAlternateReturn) 
    { 
     NSURL *purchaseHistory = [NSURL URLWithString:@"itms://phobos.apple.com/purchaseHistory"]; 
     [[NSWorkspace sharedWorkspace] openURL:purchaseHistory]; 
    } 
} 

Ví dụ trên OS X

Example on OS X

Testing Notes (OS X, itunesconnect dùng sandbox):

Khi người dùng nhấp hủy:

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
Error Domain=SKErrorDomain Code=2 "The payment was canceled by the user" UserInfo=0x600000470a40 {NSLocalizedDescription=The payment was canceled by the user} 

Khi có không có gì để khôi phục:

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
Error Domain=SKErrorDomain Code=0 "Unknown Error." UserInfo=0x60800007fb80 {NSLocalizedDescription=Unknown Error.} 
+0

Cảm ơn bạn đã trả lời chi tiết. Nó thực sự tăng lên. –

+1

@catlan, bạn có thực sự thấy restoreCompletedTransactionsFailedWithError được gọi khi người dùng truy cập khôi phục nhưng chưa bao giờ mua hàng trước đó? Bởi vì trong trình mô phỏng tôi thấy paymentQueueRestoreCompletedTransactionsFinished nhận được gọi là không có giao dịch trong hàng đợi (nghĩa là không có gì để khôi phục). – jeffjv

9

Đây vẫn là sự cố trong SDK/xCode 8 mới nhất.0, Swift 3 - nếu một người dùng đã không được thực hiện bất kỳ mua hàng cố gắng để 'phục hồi', các phương pháp sau đây:

SKPaymentQueue.default().restoreCompletedTransactions() 

không kích hoạt các phương pháp đại biểu thông thường để xử lý mua hàng/khôi phục:

paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {...} 

Điều thú vị là, phương pháp mà có lẽ nên bắt lỗi cũng không được gọi:

func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error){...} 

Và thay vào đó, các phương pháp tùy chọn được kích hoạt, như thể khôi phục lại hoạt động tốt:

func paymentQueueRestoreCompletedTransactionsFinished() 

Điều này có thể khiến ứng dụng trông như đang treo/không làm gì cả.

Như đã thảo luận trong các câu trả lời khác, nguyên nhân của việc này là SKPaymentQueue không chứa bất kỳ giao dịch nào.

trong Swift, vấn đề này có thể được khắc phục bằng cách sử dụng như sau:

//Optional Method. 
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) 
{ 

    let transactionCount = queue.transactions.count 

    if transactionCount == 0 
    { 
     print("No previous transactions found") 

     //You can add some method to update your UI, indicating this is the problem e.g. use notification centre: 
     NotificationCenter.default.post(name: "restoreFailedNoPrevIAP", object: nil) 

    } 

} 

Quan trọng hơn, nếu người dùng đã mua trước đó, hàng đợi giao dịch sẽ không được sản phẩm nào, do đó phương pháp đại biểu updateTransaction sẽ được gọi, và sẽ xử lý yêu cầu khôi phục bình thường.

+0

hành vi ủy thác áp dụng cho objc sử dụng Xcode 8/SDK mới nhất. cùng kiểm tra cách giải quyết số lượng giao dịch. – drshock

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