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
相关产品推荐
相关产品推荐

