2011-06-23 46 views
25

我有這個新的應用程序,我正在創建將使用消費品應用內購買。iPhone - 應用內購買消費品正確的方法

我的問題是:這是如何工作的?我的意思是,想象用戶購買了一種可消耗的東西。因此,在完成銷售後,我在應用程序的數據庫上設置了一個標誌,授權使用該對象。我在某處閱讀時必須向用戶提供一個按鈕,以便在用戶因某種原因丟失設備並恢復一切時恢復舊事務。

想象一下,用戶已經使用了該購買,之後他恢復了舊的應用內購買。然後會發生什麼?用戶是否會再次擁有相同的資源,因此他可以再次使用而不付錢?它是如何工作的,我應該如何處理?

感謝

回答

66

我想分享一個有點非正統的解決方案,我發現這個問題具有不需要服務器的巨大優勢。此方法允許用戶在應用程序被刪除並重新安裝時恢復其消耗品,但不允許他們將這些項目移動到新設備(除非所有應用程序數據都被複制)。

刪除並重新安裝應用程序時,存儲在鑰匙串中的數據仍然存在。鑰匙串用於存儲用戶名和密碼,但您也可以在那裏儲存有關消費品購買的信息。我用KeychainItemWrapper類,可在這裏:https://developer.apple.com/library/content/samplecode/GenericKeychain/Introduction/Intro.html

這裏就是我存儲和檢索用戶已其餘支付暗示的數目一些示例代碼:

//Storing the consumable hint item count 
int hintsLeft = 100; 
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Hints" accessGroup:nil]; 
NSString *hintsString = [NSString stringWithFormat:@"%i",hintsLeft]; 
[wrapper setObject:hintsString forKey:(id)kSecValueData]; 
[wrapper release]; 

//Retrieving it 
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Hints" accessGroup:nil]; 
NSString *numHints = [wrapper objectForKey:(id)kSecValueData]; 
[wrapper release]; 
int retrievedHints = [numHints intValue]; 

注:

  • 鍵(id)kSecValueData不能是任意字符串,有一組常量可用作鍵。

  • 您將需要添加安全框架

+5

這是我希望我可以upvote兩次的職位。優秀的,持久的解決方案,以解決常年性問題。我在15分鐘內完成了這項工作,並高度推薦跟蹤消耗品的方法。 – SG1

+3

但我認爲,如果用戶將其設備恢復爲新的,則IAP易損件將會丟失。這不會是一個問題,並導致惱人的用戶? – Gottfried

+0

這節省了我的一天! –

28

StoreKit僅提供恢復功能的非消耗性物品(以及在一定程度上用於訂閱)。因此,對於易耗品,使用restoreCompletedTransactions進行恢復不會爲您提供任何交易。任何處理恢復有關易損耗產品的信息必須在您的應用程序和/或服務器中完成。

各種產品的性質請參考In App Purchase Programming Guide:Designing Your App’s Products。有必須每次購買耗材產品,非消耗產品只需要購買一次,並提供給,自動再生訂閱和非更新訂閱與用戶的iTunes賬戶相關聯的所有設備

+3

什麼,我懷疑。謝謝。 – SpaceDog

+0

Marcus and Robot,在應用程序內購買的情況下,你指什麼消費品和非消費品? – Krishnan

+4

@Krishnan蘋果文檔epxlains所有這些條款。查看[In App Purchase編程指南:向App Store註冊產品](http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/APIOverview/OverviewoftheStoreKitAPI.html#//apple_ref/doc/UID/TP40008267-CH100-SW11)。 **消費品**產品必須每次購買,**非消費品**產品只購買一次並提供給與該用戶的iTunes帳戶相關的所有設備,**自動更新訂購**和**非消費品 - 更新訂閱** – marcus

4

對於誰前來野兔搜索的本地存儲在iOS的消耗品人民路,看看PDKeychainBindingsController(https://github.com/carlbrown/PDKeychainBindingsController)。

它的工作原理與NSUserDefaults類似,可用於將購買的消耗品數量存儲在iDevice的鑰匙串中(存儲在鑰匙串中的物品在刪除應用程序時不會被刪除)。

使用代碼類似下面從鑰匙鏈存儲和檢索值:

- (NSUInteger)hintCount { 
    PDKeychainBindings *wrapper=[PDKeychainBindings sharedKeychainBindings]; 
    NSString *valueString = [wrapper objectForKey:@"hintCount"]; 
    int value = [valueString intValue]; 
    return value; 
} 

- (void)setHintCount:(NSUInteger)starCount { 
    PDKeychainBindings *wrapper=[PDKeychainBindings sharedKeychainBindings]; 
    NSString *valueString = [NSString stringWithFormat:@"%i",starCount]; 
    [wrapper setObject:valueString forKey:@"hintCount"]; 
} 
相關問題