如何获取Mac App Store应用的首次下载日期?解决现有方法的问题
获取Mac App Store应用的首次下载/购买日期
你之前用Documents文件夹创建日期的方法不可靠,因为该文件夹属于应用沙盒内容,用户删除后重新生成时,创建日期会被更新,无法反映真实的首次下载时间。
正确的方案是读取App Store收据中的original_purchase_date字段,这个字段记录的是Apple服务器上的首次购买/下载日期,不受用户删除应用文件、重装操作的影响,完全与账号绑定。
实现代码(Swift 5+)
import Foundation func getOriginalPurchaseDate() -> Date? { // 获取App Store收据的本地路径 guard let receiptURL = Bundle.main.appStoreReceiptURL, FileManager.default.fileExists(atPath: receiptURL.path) else { // 收据不存在:可能应用非App Store下载,或用户禁用了收据功能 return nil } do { // 读取收据数据并解析为plist字典 let receiptData = try Data(contentsOf: receiptURL) guard let receiptDict = try PropertyListSerialization.propertyList(from: receiptData, options: [], format: nil) as? [String: Any] else { return nil } // 提取首次购买日期字符串 guard let originalPurchaseDateStr = receiptDict["original_purchase_date"] as? String else { return nil } // 按照Apple收据的固定日期格式解析 let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") dateFormatter.timeZone = TimeZone(abbreviation: "GMT") dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV" return dateFormatter.date(from: originalPurchaseDateStr) } catch { print("解析收据失败: \(error.localizedDescription)") return nil } } // 使用示例 if let purchaseDate = getOriginalPurchaseDate() { // 格式化显示日期 let displayFormatter = DateFormatter() displayFormatter.dateStyle = .long displayFormatter.timeStyle = .long print("应用首次购买日期: \(displayFormatter.string(from: purchaseDate))") } else { print("无法获取首次购买日期") }
关键说明
- 可靠性:
original_purchase_date是Apple官方记录的首次购买时间,无论用户重装应用、删除沙盒文件,只要使用同一购买账号,该日期不会改变。 - 适用范围:仅对从Mac App Store下载的应用有效,企业分发或其他非App Store渠道的应用没有此收据。
- 异常处理:需处理收据不存在的情况,比如用户未通过App Store安装应用,或系统禁用了收据存储。
内容的提问来源于stack exchange,提问作者spogra
相关产品推荐
相关产品推荐

