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

PHP代码如何利用APNS设备令牌实现苹果推送?及令牌获取咨询

如何用PHP结合APNS设备令牌实现苹果推送通知

Hi there! 我来帮你理清这个问题——你提到的PHP代码确实需要设备令牌,而且这是APNS推送流程里的核心环节之一,我给你一步步拆解清楚:

一、服务器端的PHP代码为什么需要设备令牌?

设备令牌是Apple给每台安装了你的App的设备分配的唯一标识符,相当于设备的“推送地址”。当你的服务器要发送推送时,必须把这个令牌传递给APNS服务,APNS才能准确地把通知送到对应的设备上。没有令牌,APNS根本不知道该把通知发给谁,所以这个参数是必不可少的。

二、如何获取设备令牌?

设备令牌是在iOS客户端生成并传递给你的服务器的,服务器本身无法直接获取,完整流程是这样的:

  • 第一步:在iOS App里请求用户的推送权限
  • 第二步:用户授权后,系统会向Apple请求设备令牌
  • 第三步:拿到令牌后,客户端把它发送到你的后端服务器,你需要把令牌存在数据库里(建议和用户ID绑定,方便后续精准推送)

给你一个简单的iOS Swift代码示例,展示怎么获取并上传令牌:

import UIKit
import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 请求推送权限(弹窗让用户选择是否允许)
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
            if granted {
                DispatchQueue.main.async {
                    application.registerForRemoteNotifications()
                }
            }
        }
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    // 成功获取设备令牌后的回调
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        // 把二进制的Data转成字符串格式(APNS需要这种格式的令牌)
        let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
        print("当前设备令牌:\(tokenString)")
        
        // 上传令牌到你的PHP服务器,这里用URLSession发送POST请求
        guard let url = URL(string: "https://你的服务器域名/save-token.php") else { return }
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        let parameters = ["token": tokenString, "userId": "当前登录用户的ID"]
        request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        
        URLSession.shared.dataTask(with: request).resume()
    }

    // 获取令牌失败的处理
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("获取设备令牌失败:\(error.localizedDescription)")
    }
}

对应的PHP后端接收代码(比如save-token.php),用来把令牌存入数据库:

<?php
// 接收客户端传递的JSON数据
$input = json_decode(file_get_contents('php://input'), true);
$token = $input['token'] ?? '';
$userId = $input['userId'] ?? '';

if (empty($token) || empty($userId)) {
    echo json_encode(['status' => 'error', 'msg' => '参数缺失']);
    exit;
}

// 用PDO存储令牌(记得替换成你的数据库信息)
try {
    $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名', '数据库用户名', '数据库密码');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 用ON DUPLICATE KEY UPDATE避免重复存储同一用户的令牌
    $stmt = $pdo->prepare("INSERT INTO device_tokens (user_id, token) VALUES (:userId, :token) ON DUPLICATE KEY UPDATE token = :token");
    $stmt->bindParam(':userId', $userId);
    $stmt->bindParam(':token', $token);
    $stmt->execute();
    
    echo json_encode(['status' => 'success']);
} catch(PDOException $e) {
    echo json_encode(['status' => 'error', 'msg' => $e->getMessage()]);
}
?>

三、在你提到的PHP推送代码里使用设备令牌

当你需要发送推送时,从数据库中取出目标用户对应的设备令牌,传入那个PHP函数的$token参数即可。举个简单的例子:

// 从数据库查询目标用户的设备令牌
$deviceToken = "这里替换成从数据库拿到的令牌字符串";
// 调用你找到的推送函数
sendPushNotification($deviceToken, "新消息提醒", "你有一条未读消息");

内容的提问来源于stack exchange,提问作者emma_lynn_rose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:32:51