有啥方法可以知道哪个 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 属性,可以在付款时设置。而且,SKPaymentQueuerestoreCompletedTransactionsWithApplicationUsername: 方法 (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 进行购买

iTunes 测试帐户无法删除

使用沙盒购买 Apple In App 时出现错误,因为“您的帐户已在 App Store 和 iTunes 中被禁用”

尽管没有iTunes帐户登录,iOS仍会恢复应用内购买

尽管没有登录 iTunes 帐户,iOS 仍会恢复应用内购买

iTunes拒绝支付宝申请?