You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:12:40