Apple Wallet Pass无法自动更新:iOS开发者技术咨询
我可将服务器下发的Pass添加至Apple Wallet,但无法确定Pass无法自动更新的原因。作为iOS开发者,我的疑问及解答如下:
无需iOS App交互,由后端自动更新Pass时,谁来创建更新后的Pass?
更新后的Pass由后端服务器负责创建。Apple Wallet的自动更新机制要求后端生成包含更新内容的新版本.pkpass包,之后通过APNs向设备推送更新通知,设备收到通知后会主动从后端配置的地址拉取更新后的Pass文件。我的iOS App在处理Apple Wallet中Pass的添加与更新时扮演什么角色?
在Pass添加流程中,App负责下载Pass文件、解析Pass数据,并调用PKPassLibrary接口将Pass添加至系统Wallet;而在自动更新流程中,App完全不需要参与——自动更新由Apple Wallet系统服务与后端直接交互完成,仅当用户通过App手动触发更新操作时,App才需要介入处理。Pass添加至Wallet后,谁负责注册推送通知并获取推送令牌?
由Apple Wallet系统服务负责注册推送通知并获取推送令牌(device token)。Pass被添加到Wallet后,系统会自动将令牌、设备标识(deviceLibraryIdentifier)、Pass类型标识(passTypeIdentifier)和序列号(serialNumber)发送至Pass文件中指定的后端注册接口,完成更新订阅。以下API应由后端还是App端调用?
https://yourpasshost.example.com/v1/devices/{deviceLibraryIdentifier}/registrations/{passTypeIdentifier}/{serialNumber}
该API既不由后端调用,也不由App端调用,而是由Apple Wallet系统服务自动调用:当Pass被添加时,系统发送POST请求完成注册;当Pass被移除时,系统发送DELETE请求取消订阅。后端需要实现这个接口来存储设备的订阅信息,后续有更新时通过APNs向对应设备推送通知。
添加Pass至Wallet的代码
let passURL = URL(string: "https://firebasestorage.googleapis.com/v0/b/iospasswallet.appspot.com/o/pass1.pkpass?alt=media&token=397cb8-d939-4241-b8f8-a1f7e4f8d937")! // Use URLSession to download pass data asynchronously let session = URLSession.shared let task = session.dataTask(with: passURL) { (data, response, error) in if let error = error { print("Error downloading pass data: \(error)") return } guard let passData = data else { print("Failed to get pass data") return } do { let pass = try PKPass(data: passData) let passLibrary = PKPassLibrary() passLibrary.addPasses([pass]) { (status) in DispatchQueue.main.async { if status.rawValue == 0 { print("Pass added successfully") } else if status.rawValue == 1 { print("Pass review successfully") } else { print("Cancelled Status: \(status.rawValue)") } } } } catch { print("Error creating pass: \(error)") } } task.resume()
内容的提问来源于stack exchange,提问作者iPhone Programmatically

