OC学习69:远程推送APNs

张建 lol

什么是远程推送通知

  • 从远程服务器推送给客户端的通知,需要连接网络
  • 远程推送服务,又称 APNs(Apple Push Notification Server,即苹果推送通知服务)

APNs

  • 只要手机联网了,不管App打开还是关闭都能接收到苹果服务器推送的通知
  • 锁屏苹果设备在联网状态下都会与苹果服务器建立长连接,连接是双向的,苹果设备可以向苹果服务器发送请求,苹果服务器也可以向苹果设备发送请求

远程通知的过程

举个例子,微信App:

  • 首先每个联网并打开微信的App都与微信服务器有一个 长连接,当微信 A用户B用户 发送一个消息时,微信 A用户 先将 消息 发送到 微信服务器

  • 然后微信服务器 判断微信B用户 是否与微信服务器建立了长连接,如果有直接通过 微信B用户 与 微信服务器建立的连接管道直接发送即可,这样微信 B用户 就能收到消息;

  • 如果微信 B用户 此时 没有打开微信App,那么微信服务器就 将消息发送给苹果服务器,苹果服务器再将消息发送到某台苹果设备上。苹果是如何知道该发送给哪台设备呢?

    • 用户A发送消息时需要将 用户B的 UDID 和微信App的 Bundle ID 附带在消息上 一块发送给 B用户,这些消息微信服务器又发送给苹果服务器,苹果服务器通过 UDID 就知道发送给哪台设备了,然后通过 Bundle ID 知道发送给哪个App发送了

    • 苹果根据 UDID+Bundle ID 生成一个 deviceToken,这样每天微信消息中都加上了 deviceToken 苹果服务器就能 识别设备和App了

获取 DeviceToken,并发送给 苹果服务器

  1. 注册远程通知
1
2
3
4
5
6
7
8
9
10
11
- (void)remoteNotification{
// 系统版本小于iOS 8.0
if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:type];
}else { // 系统版本大于等于 8.0
UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
UIUserNotificationSettings * settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
}
  1. 联网:注册通知之后,苹果服务器会将 DeviceToken 通过代理方法的形式返回

这个代理方法会将 手机UDID + App的Bundle ID 发送给苹果服务器,苹果服务器进行某种编码之后再通过代理方法返回

1
DeviceToken = (手机的UDID + App的Bundle ID) + 编码

返回的 DeviceToken 是一个 NSData 类型,大概格式如下:<7040f7d5 5a974598 c5cf31b5 3e340b39 68affd25 122f0ce1 3f315226 396c2e5b>

1
2
3
4
5
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSString * deviceToken_str = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"deviceToken_str:%@",deviceToken_str);
}

  • Post title:OC学习69:远程推送APNs
  • Post author:张建
  • Create time:2023-08-12 14:09:31
  • Post link:https://redefine.ohevan.com/2023/08/12/OC/OC学习69:远程推送APNs/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.