远程推送可以解决 当用户关闭程序的时候 不能收到推送消息。当客户端使用了远程推送的功能,不管用户有没有关闭程序,都能收到 服务器推送的消息。
苹果实现远程推送 是基于长连接的, 默认情况下 苹果的所有设备都是和 苹果的apns服务器建立长连接的, 只要设备已经联网。
长连接的好处: 苹果服务器可以主动向 客户端发送消息, 也可以找回我的设备(当设备丢失时)。
远程推送的步骤: 客户端向苹果服务器获取deviceToken步骤:客户端将 BundleId 和 设备UDID 发送给苹果Apns服务器,苹果返回deviceToken给客户端作为唯一标识。 然后客户端将 deviceToken传送给我们公司的服务器。 当公司服务器需要向客户端推送消息时,公司服务器先将消息内容和deviceToken发送给苹果服务器,苹果服务器拿到消息 根据deviceToken找到设备手机,然后实现推送。
调试远程推送的条件: 必须是真机
推送证书的配置:1,如果是开发调试推送, 配置开发的cer证书aps_development.cer 和描述文件
2, 如果是发布程序调试推送,配置aps_production.cer 和描述文件 。
配置明确的appID,然后配置开发的推送证书和发布的推送证书。 最好都配置一下,然后需要生成描述文件。
客户端代码:
注册推送服务:
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
// 将DeviceToken传给服务器
NSLog(@"%@", deviceToken.description);
}
当用户点击弹出的推送消息,调用下面方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"%@", userInfo);
// 比如 可以添加一个红色的View
}
如果想要实现 不需用户点击弹出的推送框 就直接修改UI, 可以调用下面方法:(这个方法不常用,需要服务器发送固定的格式 来推送消息)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"11111111");
UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
redView.frame = CGRectMake(100, 100, 100, 100);
[self.window.rootViewController.view addSubview:redView];
但是 必须这样做,才能实现
// 1.打开后台模式 2.告诉系统是否有新内容的更新 3.发送的通知有固定的格式("content-available":"1")
completionHandler(UIBackgroundFetchResultNewData);
}