使用 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 帐户下的不同设备相同。

我已在未实现应用内购买的应用上尝试过此操作,但我发现虽然 NSBundleappStoreReceiptURL 属性包含有效的 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

验证 Mac App Store 收据服务器端

Mac App Store 测试收据验证(来自receigen)“应用程序已损坏,无法打开。”

iOS App Store 唯一的应用名称? [关闭]

StoreKit 返回无效的产品标识符 - 仅在真正的 App Store 上,仅在 iOS7 上