将推送通知的令牌发送到服务器。 Alamofire 错误

Posted

技术标签:

【中文标题】将推送通知的令牌发送到服务器。 Alamofire 错误【英文标题】:Sending push notifications's token to the server. Alamofire error 【发布时间】:2016-10-11 07:44:37 【问题描述】:

我正在尝试将我在didRegisterForRemoteNotificationsWithDeviceToken 中获得的令牌发送到服务器。但我在发送时出错:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Foundation._SwiftNSData)。对于请求,我使用 Alamofire 框架。我的代码:

func signUp(withToken token: Data, completion: (Error) -> Void) 
    let parameters: Parameters = ["registration_id": token]
    print("token = \(token)")
    Alamofire.request(baseUrl + signUpPath, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON(completionHandler: response in
    )

Print 告诉我:token = 32 bytes。有什么建议么?在将Data 类型发送到服务器之前,也许我需要一些额外的步骤?

更新

我尝试将令牌转换为NSString 类型但得到nil

let tokenNSString: NSString? = NSString(data: token, encoding: String.Encoding.utf8.rawValue)
print("nsstrgin from token = \(tokenNSString)")

【问题讨论】:

您可以将 NSData 转换为 String 并将其发送到服务器(***.com/questions/4994302/…)。如果您想将其作为数据发送到服务器,请尝试多部分上传(***.com/questions/26121827/…)。 @vishnuvarthan 请看我的更新。 用它来转换成字符串。 ***.com/questions/9372815/… 【参考方案1】:

您在项目的 appDelegate 中获得的 deviceToken didRegisterForRemoteNotificationsWithDeviceToken 是一个 NSData 对象。要从 NSData 对象中提取实际的令牌字符串,请使用以下代码。

  let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
   var tokenString: String = ""
   for i in 0..<deviceToken.length 
     tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
   
   print("This is My Device Token for Push notification -", tokenString)

现在,tokenString 是您正在寻找的实际令牌。尝试将此与任何密钥一起发送到您的服务器。

顺便说一句,我正在使用 Xcode 7.3.1 和 Swift 2.2。请随时根据您的要求进行修改。

谢谢, 希望这会有所帮助。

【讨论】:

您想发送令牌字符串,这就是我试图解释该过程的原因。 您也可以将令牌作为 nsdata 发送,应该只是字符串吗?将令牌作为数据发送有什么缺点吗? 是的,您可以作为 NSData 发送,但在这种情况下,您的服务器必须有能力处理它。 你不必担心,现在编辑并给人们正确的答案。 我们在这里互相帮助。不要粗鲁,在否决任何人的答案之前,请深入了解答案将要解释的内容。有几种方法可以使用代码解决问题。每个人都有自己的观点和解决方案。:) 请尝试查看一些这样的链接 - ***.com/questions/22879445/…

以上是关于将推送通知的令牌发送到服务器。 Alamofire 错误的主要内容,如果未能解决你的问题,请参考以下文章

向服务器发送设备令牌或注册令牌?

从服务器向所有设备发送推送通知

是否可以将 Firebase 推送通知发送到特定令牌以及主题

设备令牌和推送通知

如何将推送通知令牌存储到外部数据库 - iOS 10,Swift 3

Apple 反馈服务和推送通知错误