尝试PKPushRegistryDelegate
时,我得到了很多结果,但没有解决任何问题。所有人都建议检查info.plist的背景模式,这在我的应用中很好。我启用了voip,后台抓取,远程通知。还可以在Apple开发人员帐户中创建VoIP证书。我在didFinishLanunchingWithOptions
let pushRegistry = PKPushRegistry(queue: DispatchQueue.main)
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
并按如下所示委托方法
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
if let token = String(bytes: pushCredentials.token, encoding: String.Encoding.utf8) {
print("Push token: \(token)")
}
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
print("notification received")
print(payload)
}
func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
print("Token invalid")
}
但是永远不会调用那些委托方法。由于VoIP证书仅在生产中,因此我尝试使用生产证书并检查了日志中是否包含推送令牌,但未找到。有没有一种方法可以使用开发证书进行调试?我在这里想念什么吗?请指教。
答案 0 :(得分:0)
我在版本11.4的iPhone 6中也遇到了同样的问题。尝试使用其他设备iPhone 6+正常运行。这在某些设备中可能是个问题,但Apple文档中并未提及。
请在didUpdate
委托方法中使用以下代码:
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
let pushToken = pushCredentials.token.map { String(format: "%02.2hhx", $0) }.joined()
print("voip token: \(pushToken)")
}