我的应用提供应用内购买非耗材类型。该应用程序已登录设施。是否可以根据登录用户购买我的应用程序?
我知道这听起来很尴尬。我来说明问题。
该设备已在iTunes商店登录用户。那时,当我的应用程序第一次安装到设备时,任何用户都可以使用凭据登录我的应用程序。考虑一下,他做了一些购买并从应用程序注销。现在,另一个用户登录到应用程序,并且在应用程序购买后无法使用以前用户可用的工具。但是,如您所知,基于iTunes商店帐户购买非消费品(每个帐户只能购买一个非消费品)。我试过以下的方式..
将用户ID存储到iCloud,但我不知道购买的是哪个iTunes帐户。因此,我无法显示正确的消息“您应该使用其他iTunes帐户登录才能购买”。
在Android中,通过应用内结算v3,可以将developer payload
字符串与购买请求一起发送。在对该购买进行查询时,也会返回此字符串。因此,这可用于识别进行购买的用户。 iOS中有类似的东西吗?
答案 0 :(得分:6)
自iOS 7起,SKMutablePayment
具有applicationUsername
属性,可在付款时设置。而SKPaymentQueue
使用restoreCompletedTransactionsWithApplicationUsername:
方法(link)。
Apple的指导是散列您的服务器端用户ID,并在购买和恢复时将其传递出去。因此,在您的情况下,如果iTunes用户A购买该产品,它将被绑定到该购买者的服务器端用户ID。然后,如果iTunes用户B尝试还原,则还原将失败,因为它们仍将传递相同的服务器端用户ID。
您还必须(在服务器上)跟踪您的服务器端用户ID已购买产品。否则,如果iTunes用户B尝试恢复,则需要知道他们使用不同的iTunes帐户登录设备之间的区别,并且他们从未购买过。当然,您还希望阻止同一服务器端用户在不同的iTunes帐户下购买产品两次。
注意事项:
答案 1 :(得分:0)
如果恢复购买成功而非此帐户购买。
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];
// Then this is called
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
NSLog(@"%@",queue );
NSLog(@"Restored Transactions are once again in Queue for purchasing %@",[queue transactions]);
NSMutableArray *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 (@"product id is %@" , productID);
// here put an if/then statement to write files based on previously purchased items
// example if ([productID isEqualToString: @"youruniqueproductidentifier]){write files} else { nslog sorry}
}
}