WordPress推送通知:设备令牌无法存入数据库的技术求助
解决设备令牌无法存入WordPress数据库的问题
看起来你在WordPress推送通知的最后一步卡壳了——设备令牌存不进数据库。结合你给出的代码片段,我整理了几个最可能的问题点和对应的解决办法:
1. URL中的HTML实体错误
你代码里的URL用了&作为参数分隔符,这是HTML转义后的字符,但在Swift的URL请求里,应该直接用普通的&。&会被后端当成参数名的一部分,导致device_token等参数无法被正确解析。
修正示例:
let stringUrl = "http://example.com/wp/wp-json/apnwp/register?os_type=ios&user_email_id=pushx@40test.com&device_token=\(encodedToken)"
2. 未对设备令牌做URL编码
设备令牌可能包含特殊字符(比如+、/、=),直接拼到URL里会导致参数解析错误。必须对token进行URL编码:
编码代码:
guard let encodedToken = token.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { print("Token编码失败") return }
3. 请求方式可能不匹配
如果你的WordPress REST接口apnwp/register是设计为POST请求(更安全的做法),而你用GET方式传参,后端可能不会处理这些参数,自然无法存入数据库。建议改用POST请求,将参数放在请求体中:
POST请求示例:
func SendToken(_ token: String) { guard let url = URL(string: "http://example.com/wp/wp-json/apnwp/register") else { print("URL无效") return } var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") let parameters: [String: Any] = [ "os_type": "ios", "user_email_id": "pushx@40test.com", "device_token": token ] do { request.httpBody = try JSONSerialization.data(withJSONObject: parameters) } catch { print("参数序列化失败: \(error)") return } let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("请求错误: \(error)") return } // 检查响应状态码 if let httpResponse = response as? HTTPURLResponse { print("响应状态码: \(httpResponse.statusCode)") // 可以打印返回的内容,看后端是否给出错误提示 if let data = data, let responseString = String(data: data, encoding: .utf8) { print("后端返回: \(responseString)") } } } task.resume() }
4. 检查WordPress后端的接口实现
- 确认
apnwp/register接口是否正确获取了device_token参数,比如在PHP代码里用$_POST['device_token'](如果是POST)或者$_GET['device_token'](如果是GET)。 - 查看WordPress的
wp-content/debug.log文件(需要开启WP_DEBUG),看有没有数据库插入失败的错误信息,比如权限问题、字段不存在等。 - 确认接口是否有正确的权限验证,比如是否需要登录态,或者是否允许匿名请求写入数据库。
5. 验证网络请求是否成功
在你的原代码里,只构造了URL,但没看到发起请求的代码(比如URLSession的dataTask)。一定要确保请求已经发送出去,并且处理了响应,这样才能知道后端返回了什么错误。
按照上面的步骤排查,应该能解决令牌存不进数据库的问题。如果还是不行,可以把后端返回的错误信息贴出来,我再帮你分析。
内容的提问来源于stack exchange,提问作者AlbertB
相关产品推荐
相关产品推荐

