关于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用户?这似乎是一种非常有前景的方法。
答案 0 :(得分:0)
如果找不到收据,您需要制作SKReceiptRefreshRequest
来生成收据。
let receiptRequest = SKReceiptRefreshRequest()
receiptRequest.delegate = self
receiptRequest.start()
以下链接提供了您可能遇到的其他一些问题的提示:
答案 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不同,那么我认为是不同的用户尝试升级产品。
原始购买日期-在自动续订中 收据,这表示订阅期的开始,即使 如果订阅已续签