有没有办法知道哪个iTunes帐户购买? - iOS

时间:2015-03-25 12:23:27

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

我的应用提供应用内购买非耗材类型。该应用程序已登录设施。是否可以根据登录用户购买我的应用程序?

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

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

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

  2. 在Android中,通过应用内结算v3,可以将developer payload字符串与购买请求一起发送。在对该购买进行查询时,也会返回此字符串。因此,这可用于识别进行购买的用户。 iOS中有类似的东西吗?

2 个答案:

答案 0 :(得分:6)

自iOS 7起,SKMutablePayment具有applicationUsername属性,可在付款时设置。而SKPaymentQueue使用restoreCompletedTransactionsWithApplicationUsername:方法(link)

Apple的指导是散列您的服务器端用户ID,并在购买和恢复时将其传递出去。因此,在您的情况下,如果iTunes用户A购买该产品,它将被绑定到该购买者的服务器端用户ID。然后,如果iTunes用户B尝试还原,则还原将失败,因为它们仍将传递相同的服务器端用户ID。

您还必须(在服务器上)跟踪您的服务器端用户ID已购买产品。否则,如果iTunes用户B尝试恢复,则需要知道他们使用不同的iTunes帐户登录设备之间的区别,并且他们从未购买过。当然,您还希望阻止同一服务器端用户在不同的iTunes帐户下购买产品两次。

注意事项:

  • 如果您已经在生产中进行了购买,则很可能无法使用。
  • iOS 7 +
  • 我上面提到的“已购买”场景。

答案 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}
    }  
}