使用App Store收据唯一识别iOS iTunes帐户?

时间:2016-02-09 00:33:30

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

关于SO,有几个问题讨论了通过iTunes帐户唯一识别iOS用户的机制(例如,Uniquely identifying an iOS user)。我一直试图以不同的方式实现这一点,基本上使用App Store收据的opaque value字段。这article似乎表明(至少对于OS X应用程序)opaque value字段基本上包含用户iTunes帐户的唯一ID(当然不是电子邮件地址!),这表明这个对于同一iTunes帐户下的不同设备,ID将相同。

我在没有实施应用内购买的应用上试过这个,但我看到appStoreReceiptURL NSBundle属性包含有效网址时,该文件从未在应用中存在我尝试过(从应用程序商店下载,然后使用Xcode更新测试代码)。

收据是否应该始终存在,即使是没有IAP的免费/付费应用也是如此?有没有人试图使用收据唯一识别iTunes用户?这似乎是一种非常有前景的方法。

2 个答案:

答案 0 :(得分:0)

如果找不到收据,您需要制作SKReceiptRefreshRequest来生成收据。

let receiptRequest = SKReceiptRefreshRequest()
receiptRequest.delegate = self
receiptRequest.start()

以下链接提供了您可能遇到的其他一些问题的提示:

App Store Receipt Validation

答案 1 :(得分:0)

我正试图解决同样的问题。据我了解,Apple文档中没有可以信任的唯一ID,但是可能的解决方法是使用iCloud记录ID。

使用iCloud记录ID(CKRecordID)

Swift3 / 4 +

    let container = CKContainer.default()
    container.fetchUserRecordID() {
        recordID, error in

        if let err = error {
            print(err.localizedDescription)
        }
        else if recID = recordID {
            print("fetched ID \(recID.recordName ?? "NA")")
        }
    }
  

对于自动创建的记录,ID名称字符串基于   UUID,因此保证是唯一的。

购买收据中

就我而言,我想通过服务器端的不同iTunes帐户阻止升级/降级。因此,我为此使用了original_purchase_date(假设在同一时间段内不可能在一个用户帐户中进行多次购买)。最初购买该特定iTunes帐户后,此ID将始终相同。我将此ID与Product_ID一起保存在服务器中,并在用户升级/降级时(在应用发送新收据时)始终在收据中检查此ID。如果相同的产品ID不同,那么我认为是不同的用户尝试升级产品。

  

原始购买日期-在自动续订中   收据,这表示订阅期的开始,即使   如果订阅已续签