使用 App Store 收据唯一标识 iOS iTunes 帐户?
Posted
技术标签:
【中文标题】使用 App Store 收据唯一标识 iOS iTunes 帐户?【英文标题】:Uniquely identify iOS iTunes accounts using App Store receipts? 【发布时间】:2016-02-09 00:33:30 【问题描述】:关于 SO 的几个问题讨论了通过 iTunes 帐户唯一识别 ios 用户的机制(例如,Uniquely identifying an iOS user)。我一直在尝试以不同的方式实现这一点,基本上是使用 App Store 收据的opaque value
字段。这个article 似乎表明(至少对于 OS X 应用程序)opaque value
字段基本上包含用户 iTunes 帐户的唯一 ID(当然不是电子邮件地址!),这表明这个 ID 将是同一 iTunes 帐户下的不同设备相同。
我已在未实现应用内购买的应用上尝试过此操作,但我发现虽然 NSBundle
的 appStoreReceiptURL
属性包含有效的 URL,但该文件从未存在于我拥有的应用中尝试过(从应用商店下载,然后使用 Xcode 用测试代码更新)。
收据是否应该始终存在,即使对于没有 IAP 的免费/付费应用程序也是如此?有没有人尝试使用收据来唯一识别 iTunes 用户?这似乎是一个非常有前途的方法。
【问题讨论】:
【参考方案1】:我试图解决同样的问题。我的理解是在 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 不同,我认为是不同的用户尝试升级产品。
original_purchase_date - 在自动续订订阅中 收据,这表明订阅期的开始,甚至 如果订阅已续订
【讨论】:
【参考方案2】:如果您找不到收据,您需要创建一个SKReceiptRefreshRequest
以生成收据。
let receiptRequest = SKReceiptRefreshRequest()
receiptRequest.delegate = self
receiptRequest.start()
以下链接提供了一些您可能会遇到的其他问题的提示:
App Store Receipt Validation
【讨论】:
以上是关于使用 App Store 收据唯一标识 iOS iTunes 帐户?的主要内容,如果未能解决你的问题,请参考以下文章
在哪里可以找到 iOS App Store 收据验证的共享密钥?
Mac App Store App 和 identifierForVendor