企业账号开发的员工iOS App无法接收推送通知技术求助
哎,这种明明拿到了设备Token却收不到推送的问题真的很磨人,结合你的描述和代码,我整理了几个核心排查点,你可以逐一验证:
先确认推送证书与环境匹配
企业账号的推送证书分「开发(Development)」和「发布(Production)」两种,你设置了Sandbox=1走开发环境,那上传到服务器的.pem必须是开发推送证书转换而来的,不能用生产环境的证书。
可以用openssl命令验证证书有效性:openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert 你的开发推送证书.pem -key 你的推送密钥.pem如果命令能成功建立连接,说明证书没问题;如果报错,大概率是生成pem时出错了(比如导出p12时没包含私钥,或者转换命令有误)。
检查设备Token的格式是否正确
在didRegisterForRemoteNotificationsWithDeviceToken里获取的NSData类型Token,必须转换成正确的字符串格式才能发给服务器——要去掉<>和空格。正确的转换代码应该是这样的:NSString *tokenString = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; tokenString = [tokenString stringByReplacingOccurrencesOfString:@" " withString:@""];如果Token格式不对,服务器发的推送会被APNS直接拒收。
验证推送Payload的合法性
服务器发送的Payload必须严格符合APNS规范,最基础的测试Payload应该是这样的:{ "aps": { "alert": "测试推送内容", "sound": "default", "badge": 1 } }另外要注意Payload大小不能超过4KB,超过的话APNS会拒绝推送请求。
确认UNUserNotificationCenter代理已正确设置
你虽然声明了遵守UNUserNotificationCenterDelegate,但如果没有在App启动时绑定代理,iOS 10+系统下的推送回调不会触发。记得在application:didFinishLaunchingWithOptions:里添加:UNUserNotificationCenter *notificationCenter = [UNUserNotificationCenter currentNotificationCenter]; notificationCenter.delegate = self;同时,iOS 10+需要实现这两个代理方法才能处理推送:
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { // 前台收到推送时的处理 completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionBadge); } - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler { // 点击推送后的处理 completionHandler(); }原来的
didReceiveRemoteNotification在iOS 10+下已经不是推荐的回调方式了。检查企业账号的设备列表
开发环境下,不管是个人还是企业账号,设备必须添加到开发者账号的「设备」列表中,APNS才会向该设备推送通知。你可以登录苹果开发者后台,确认测试设备的UDID已经被添加进去。查看服务器的APNS响应日志
很多时候服务器会收到APNS的错误反馈(比如InvalidToken、DeviceNotRegistered),这些日志能直接帮你定位问题——比如Token无效、设备未注册到开发环境等。
内容的提问来源于stack exchange,提问作者user7477041




