iPhone - 应用内购买耗材正确的方法

Spa*_*Dog 26 iphone in-app-purchase

我有这个我正在创建的新应用程序,它将使用消费类应用内购买.

我的问题是:这是如何工作的?我的意思是,想象用户购买消费品.因此,在完成销售后,我在应用程序的数据库上设置了一个标志,授权使用该对象.我读到某个地方,我必须为用户提供一个按钮来恢复旧的交易,以防用户出于某种原因丢失他的设备并且必须恢复所有内容.

想象一下,用户已经使用了该购买,之后他恢复了旧的应用内购买.那么会发生什么?用户是否会再次使用相同的资源,这样他可以第二次使用而无需付费?它是如何工作的,我应该如何处理?

谢谢

小智 67

我想分享一个有点非正统的解决方案,我发现这个问题具有不需要服务器的巨大优势.如果删除并重新安装应用程序,此方法允许用户恢复其消耗品,但不允许他们将项目移动到新设备(除非他们的所有应用程序数据都被复制).

删除并重新安装应用程序时,存储在钥匙串中的数据仍然存在.钥匙串用于存储用户名和密码,但您也可以在那里存储有关消耗品购买的信息.我使用了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];
Run Code Online (Sandbox Code Playgroud)

笔记:

  • key(id)kSecValueData不能是任意字符串,有一组可用作键的常量列表.

  • 您需要添加安全框架

  • 这是我希望我能两次投票的帖子.解决常年问题的优秀,创造性持久解决方案.我在15分钟内完成了这项工作,并强烈推荐跟踪耗材的方法. (6认同)
  • 但我认为,如果用户将其设备恢复为新设备,则IAP耗材将丢失.这不是一个问题,导致用户烦恼吗? (3认同)
  • 这是很好的解决方案!! 但现在你可以让他们为iOS 7移动一个新设备 - 使用iCloud + Keychain sync(kSecAttrSyncronizable) (3认同)

mar*_*cus 28

StoreKit仅为非消耗品提供恢复功能(在某种程度上为订阅提供).因此,对于消耗品,使用恢复restoreCompletedTransactions不会在您的情况下进行任何交易.任何有关消耗品的恢复信息的处理都必须在您的应用程序和/或服务器中完成.

有关各种产品性质的参考,请查看In App Purchase编程指南:设计应用程序的产品.有耗材必须每次购买的产品,非消耗只需要购买一次,并提供与用户的iTunes账户相关联的所有设备产品自动再生订阅和非更新订阅

  • @Krishnan Apple文档记录了所有这些术语.查看[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帐户相关的所有设备,**自动续订订阅**和**非 - 续订订阅** (4认同)
  • 那是我怀疑的.谢谢. (3认同)

Abd*_*ius 5

对于那些在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"];
}
Run Code Online (Sandbox Code Playgroud)