2013-05-06 91 views
8

我有一個恢復按鈕。問題是如果他們沒有進行恢復,並且他們試圖購買一件物品,並且他們已經購買了該物品,我需要告訴他們他們已經購買了它並且不進行購買。所以我需要一種方式來知道,不做恢復,他們已經購買了哪些物品。我試着先做一次恢復,每當用戶試圖購買,但蘋果拒絕我的應用程序。他們表示,在顯示確認應用內購買對話框之前,不會發生還原。蘋果拒絕我的應用程序,由於恢復IAP

請幫我找到正確的方法。

在此先感謝。

+0

是NSUserDefaults的你最好的選擇。但只要您負責獲取信息,任何形式的存儲都將起作用。看起來像一個設計缺陷,你不覺得嗎?我知道他們希望保證用戶數據安全,但是jeez。 – achi 2013-12-13 20:05:20

+0

如果用戶再次嘗試購買非消耗品,則不會再次收取費用。相反,他們會收到一條消息,說他們已經付款並可以免費獲得。 – 2014-01-14 11:35:23

回答

6

您可以將這些數據保存在NSUserDefaults。並且您不需要顯示警報說這些項目已經購買。如果其非消費品蘋果正在顯示提醒說他們已經購買了該商品!

編輯:

1)需要3個按鈕添加到您的視圖

  • 購買按鈕
  • 恢復按鈕
  • 演示版本

您需要如果您支持應用內購買,請爲用戶提供還原選項你的應用。否則,Apple會拒絕你的應用程序。

2)如果用戶按購買按鈕,不要檢查用戶是否已經購買了您的應用程序。由於Apple不會爲相同的非消耗性產品向用戶收取兩次費用。因此,只要通過你的購買代碼,如果用戶已經購買但蘋果的StoreKit框架將與

調用它的委託方法

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

SKPaymentTransactionStatePurchased

交易狀態。所以你可以給他登錄屏幕。

3)如果用戶按下恢復按鈕只是去通過與您的還原碼

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 

,並像在第2步,它會調用與同一交易狀態的委託方法。所以你可以將登錄頁面呈現給用戶。

4)如果用戶按下演示版本按鈕,給他演示版本。

5)如果用戶購買了你的應用程序,刪除它,如果他重新安裝它,請把他當作新用戶。向他展示這3個按鈕,用戶可以恢復購買,然後您可以向他展示登錄頁面。

6)如果您確實需要跟蹤應用程序是否在確切的設備上購買,那麼您可以使用鑰匙串存儲您的數據,因爲即使應用程序已卸載或刪除,鑰匙串項目也不會被刪除。這個API將有很大的幫助link,看看

你可以參考蘋果的documentation在鑰匙扣數據

+0

這將無法可靠地工作:用戶可能已經購買了另一個設備上的應用程序(或通過iTunes);用戶可能已手動刪除應用程序或擦除設備... – 2013-05-06 13:06:45

+0

如果用戶使用相同的Apple ID,則Apple不會再向用戶收費,您將獲得稱爲說明應用程序已購買的委託方法。所以你可以解鎖你的應用程序的隱藏功能 – Ushan87 2013-05-06 13:09:22

+0

確切地說。這意味着使用'NSUserDefaults'不能解決OP的問題。 – 2013-05-06 13:10:47

1

據我所知,沒有其他方法可以做到這一點。

您應該提供還原按鈕以恢復應用程序內購買,否則Apple將拒絕您的應用程序。

如果不顯示應用內購買確認提醒,您將無法連接到應用內服務器或還原分流。

+0

:是的你是對的,我已經有一個恢復按鈕,但在進入該屏幕之前,我需要檢查產品是否購買天氣。 – MadhuP 2013-05-06 13:09:28

+1

@ pm444:那是不可能的。當用戶再次點擊購買時,它會給出如下響應:'SKPaymentTransactionStateRestored'。 – 2013-05-06 13:16:38

+0

我有兩個應用程序商店,支持應用程序內購買。我有一個單獨的恢復按鈕,並分別顯示產品列表。如果用戶購買一件物品,我將這些數據保存在我的NSUserDefaults中,當用戶進入應用內購買頁面時,我不會向他顯示他已購買的產品。就那麼簡單!! – Ushan87 2013-05-06 13:29:11

2

據蘋果「還原應用程序內購買對話框無法確認之前發生顯示「。使用- (空)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)隊列 功能,檢查代碼

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error { 
    NSLog(@"%@",error); 
} 

// Call This Function 
- (void) checkPurchasedItems 
{ 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

//Then this delegate Function Will be fired 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    purchasedItemIDs = [[NSMutableArray alloc] init]; 
    NSLog(@"received restored transactions: %i", queue.transactions.count); 

    for (SKPaymentTransaction *transaction in queue.transactions) 
    { 
     NSString *productID = transaction.payment.productIdentifier; 

     [purchasedItemIDs addObject:productID]; 

     NSLog(@"%@",purchasedItemIDs); 
    } 
} 
+0

:謝謝你給我答覆。這也只不過是在調用inAppPurchase之前調用Restore方法知道 ! – MadhuP 2013-05-06 13:05:46

相關問題