有啥方法可以知道哪个 iTunes 帐户进行的购买? - iOS
Posted
技术标签:
【中文标题】有啥方法可以知道哪个 iTunes 帐户进行的购买? - iOS【英文标题】:Is there any way to know purchase made by which iTunes account? - iOS有什么方法可以知道哪个 iTunes 帐户进行的购买? - iOS 【发布时间】:2015-03-25 12:23:26 【问题描述】:我的应用提供了应用内购买的非消耗型。该应用程序具有登录功能。是否可以根据登录用户对我的应用进行购买?
我知道这听起来很尴尬。让我具体说明问题。
设备在 iTunes 商店有一个已经登录的用户。那时,当我的应用程序第一次安装到设备上时,任何用户都可以使用凭据登录我的应用程序。考虑一下,他进行了一些购买并从应用程序中注销。现在,另一个用户登录了应用程序,并且在应用程序内购买后无法使用以前用户可用的设施。但如您所知,基于 iTunes 商店帐户购买非消耗品(每个帐户只能购买一种非消耗品)。我已经尝试过以下方式..
将用户 ID 存储到 iCloud,但我不知道购买是通过哪个 iTunes 帐户进行的。因此,我无法显示正确的消息“您应该使用不同的 iTunes 帐户登录以进行购买”。
在 android 中,使用 In-app Billing v3,developer payload
字符串可以与购买请求一起发送。当对该购买进行查询时,也会返回此字符串。因此,这可用于识别进行购买的用户。 ios 中是否有类似的功能?
【问题讨论】:
【参考方案1】:从 iOS 7 开始,SKMutablePayment
有一个 applicationUsername
属性,可以在付款时设置。而且,SKPaymentQueue
有 restoreCompletedTransactionsWithApplicationUsername:
方法 (link)。
Apple 的指导是对您的服务器端用户 ID 进行哈希处理,并将其传递给购买和恢复。因此,在您的情况下,如果 iTunes 用户 A 购买该产品,它将绑定到该购买者的服务器端用户 ID。然后,如果 iTunes 用户 B 尝试恢复,恢复将失败,因为他们仍将传递相同的服务器端用户 ID。
您还必须(在服务器上)跟踪您的服务器端用户 ID 购买了该产品。否则,如果 iTunes 用户 B 尝试恢复,您需要了解他们使用不同的 iTunes 帐户登录设备与从未购买过的设备之间的区别。当然,您还需要防止同一服务器端用户在不同的 iTunes 帐户下购买产品两次。
注意事项:
如果您已经在生产中进行购买,这很可能不会起作用。 iOS 7+ 我上面提到的“已购买”场景。【讨论】:
太棒了!为什么我以前不知道这件事???后续评论和问题。评论:您必须使用 SKMutablePayment 访问 applicationUsername (否则,该属性是只读的)。问题:考虑以下场景。假设 Apple ID X 和 Apple ID Y 都用于在您的应用程序中进行购买。然后为 Apple ID X 和 Y 创建具有相同 applicationUsername 的 SKMutablePayments(称为 applicationUsername,U),然后使用 U 调用 restoreCompletedTransactionsWithApplicationUsername。这将检索使用 Apple ID X 和 Y 进行的购买? @ChrisPrince 这是关于 SKMutablePayment 的一个好点。我已经更新了我的答案。至于您的问题,我想调用restoreCompletedTransactionsWithApplicationUsername:
只会返回当前 iTunes 用户的购买。但是,您应该防止第二个 iTunes 用户在第一种情况下使用相同的应用程序用户名进行购买。因此,这也是您需要在自己的服务器上跟踪购买的原因。
这将如何工作?如何防止第二个 iTunes 用户使用相同的应用程序用户名进行购买?
只是不提供任何购买界面。
嗯?我无法检测到用户正在使用哪个 Apple ID。如果我没有这些信息,我该如何提供或不提供?【参考方案2】:
如果恢复购买比该帐户购买的成功。
[[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
【讨论】:
恢复不是这里的解决方案,因为如果特定 iTunes 帐户恢复成功。假设 A,一个应用程序用户,购买并退出。现在,B来恢复。恢复将成功,因为 iTunes 帐户尚未更改。但是 B 还没有购买该产品,但他很喜欢该设施。 iTunes 帐户正在使用应用内购买功能,因此我们无法阻止 B 享受便利。这是不可能的。 是的,你是对的。但是,这是要求。让我们看看其他人怎么说。以上是关于有啥方法可以知道哪个 iTunes 帐户进行的购买? - iOS的主要内容,如果未能解决你的问题,请参考以下文章
应用内购买 - 可以获取产品信息但无法连接到 iTunes 进行购买
使用沙盒购买 Apple In App 时出现错误,因为“您的帐户已在 App Store 和 iTunes 中被禁用”