【问题标题】:Is there any way to know purchase made by which iTunes account? - iOS有什么方法可以知道哪个 iTunes 帐户进行的购买? - iOS
【发布时间】:2015-03-25 12:23:26
【问题描述】:

我的应用提供了应用内购买的非消耗型。该应用程序具有登录功能。是否可以根据登录用户对我的应用进行购买?

我知道这听起来很尴尬。让我具体说明问题。

设备在 iTunes 商店有一个已经登录的用户。那时,当我的应用程序第一次安装到设备上时,任何用户都可以使用凭据登录我的应用程序。考虑一下,他进行了一些购买并从应用程序中注销。现在,另一个用户登录了应用程序,并且在应用程序内购买后无法使用以前用户可用的设施。但如您所知,基于 iTunes 商店帐户购买非消耗品(每个帐户只能购买一种非消耗品)。我已经尝试过以下方式..

  1. 将用户 ID 存储到 iCloud,但我不知道购买是通过哪个 iTunes 帐户进行的。因此,我无法显示正确的消息“您应该使用不同的 iTunes 帐户登录以进行购买”。

  2. 在 android 中,使用 In-app Billing v3,developer payload 字符串可以与购买请求一起发送。当对该购买进行查询时,也会返回此字符串。因此,这可用于识别进行购买的用户。 iOS 中是否有类似的功能?

【问题讨论】:

    标签: ios objective-c in-app-purchase


    【解决方案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 享受便利。这是不可能的。
    • 是的,你是对的。但是,这是要求。让我们看看其他人怎么说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2013-05-07
    相关资源
    最近更新 更多