我的問題,我真的需要幫助,是我無法獲得有條件地呈現「還原購買」按鈕的邏輯工作。在Codenameone中恢復應用內非消費品
我已經使用應用內購買按鈕構建了我的IOS應用程序,允許用戶付費一次以解鎖額外功能 - 類型爲「非消費品」。購買功能在TestFlight中使用我的常規家庭用戶Apple ID和一些其他測試Apple ID(不是沙盒測試儀)正常工作。我沒有Mac,因此無法使用沙盒環境。當試用期結束時,我顯示購買按鈕,這將調用CN1 Purchase API和PurchaseCallback,然後使用Storage來存儲已購買的標誌。
purchaseApp.addActionListener(e -> {
if (Purchase.getInAppPurchase().wasPurchased("full_product")) {
ToastBar.showMessage("You have already previously purchased this product.", FontImage.MATERIAL_INFO);
...
} else {
Purchase p = Purchase.getInAppPurchase();
p.purchase("full_product");
}
});
(我沒有做與收據或任何receipt_stores)
但是要符合蘋果我需要一個「恢復購買」按鈕,這樣用戶就不會在新設備上再支付。難度在於獲得邏輯的正確性,因爲我只希望恢復按鈕顯示他們之前已付款的IF,否則我只想顯示購買按鈕。
因此,我創建了下面的userHasPreviousPurchased()方法來測試按鈕顯示,並根據CN1文檔將RestoreCallback接口添加到我的主類。但是下面的方法永遠不會在我的iPhone上使用TestFlight構建返回true,所以我的Restore按鈕從不顯示。這是p.getReceipts()總是返回一個空List,當我期待1行與我的SKU在裏面。
private boolean userHasPreviousPurchased() {
Purchase p = Purchase.getInAppPurchase();
if (p.isRestoreSupported()) {
p.synchronizeReceipts();
List<Receipt> receipts = p.getReceipts();
for (Receipt receipt : receipts) {
if (receipt.getSku().equalsIgnoreCase("full_product")) {
return true;
}
}
}
return false;
}
請您指點一下正確的方向。使用CN1 API,您如何測試使用此類IAP的以前購買?
我試着創建一個沙箱測試用戶,並在簽出後在我的設備上使用用戶(已被接受)購買IAP。我在我的應用程序中調試代碼,測試上述方法,但仍然沒有返回收據(由於我沒有以沙箱用戶身份登錄,因此未能查看它是如何得到的)。
提前
你放在一起的非常全面的博客。我正在使用非易失性產品,而不是訂閱,但Appstore要求我仍具有恢復功能,因此是原始查詢。他們是否可能誤解我的應用程序,或者只是在Appstore上執行IAP時必須跟蹤收據(並且也有服務器)?如果是這樣,那麼我曾天真地認爲,Appstore是一個持有收據的'服務器',然後我就清醒了。從博客我將不得不創建我自己的服務器來存放收據。我認爲這是對我使用IAP的一個阻礙。謝謝 –
除此之外,閱讀Apples開發者指南,他們聲明:「用戶恢復交易以維護他們已經購買的內容的訪問......在大多數情況下,您的應用程序需要做的就是刷新收據並在收據中交付產品...刷新收據要求應用商店獲取收據的最新副本。「這是讀這個讓我質疑需要當AppStore應該能夠爲我做這件事時,我可以在我自己的數據庫中保存收據嗎?非常感謝 –
您的情況,您可以通過檢查您的存儲變量來檢測購買是否已加載到設備上。不存在,然後給他們恢復功能,你不需要跟蹤這種情況下的收據,因爲更多的光滑是困難的 –