即时通讯中需要对离线消息进行接收,此时就需要离线推送即当应用没有退出登录的情况下,被系统或者用户杀掉进程仍然能收到IMSDK消息提醒。云通讯iOS客户端采用的是APNs推送服务,以下提供整个处理流程及参考代码。
1.申请APNs证书可参考文档:Apple 推送证书申请
2.上传证书到腾讯云控制台
注意:上传证书名最好使用全英文(尤其不能使用括号等特殊字符)。 上传证书生效时间为 10 分钟左右。 上传证书需要设置密码,无密码收不到推送。 注意生产环境的选择,发布 AppStore 的证书需要设置为生产环境,否则无法收到推送。 上传的 p12 证书必须是自己申请的真实有效的证书。
3.客户端实现APNs推送
//在IM登录之后注册通知
- (void)registNotification
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
}
//在通知的回调中上传的token
-(void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
DebugLog(@"didRegisterForRemoteNotificationsWithDeviceToken:%ld", (unsigned long)deviceToken.length);
NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
[[TIMManager sharedInstance] log:TIM_LOG_INFO tag:@"SetToken" msg:[NSString svtringWithFormat:@"My Token is :%@", token]];
TIMTokenParam *param = [[TIMTokenParam alloc] init];
//注意区分证书环境
#if kAppStoreVersion
// AppStore版本
#if DEBUG
param.busiId = 2383;
#else
param.busiId = 2382;
#endif
#else
//企业证书id
param.busiId = 4496;
#endif
[param setToken:deviceToken];
//调用IM API 上传Token到腾讯云
[[TIMManager sharedInstance] setToken:param succ:^{
NSLog(@"-----> 上传token成功 ");
} fail:^(int code, NSString *msg) {
NSLog(@"-----> 上传token失败 ");
}];
}
//App进入后台 上报事件
- (void)applicationDidEnterBackground:(UIApplication *)application {
__block UIBackgroundTaskIdentifier bgTaskID;
bgTaskID = [application beginBackgroundTaskWithExpirationHandler:^ {
//不管有没有完成,结束 background_task 任务
[application endBackgroundTask: bgTaskID];
bgTaskID = UIBackgroundTaskInvalid;
}];
//获取未读计数
int unReadCount = 0;
NSArray *convs = [[TIMManager sharedInstance] getConversationList];
for (TIMConversation *conv in convs) {
if([conv getType] == TIM_SYSTEM){
continue;
}
unReadCount += [conv getUnReadMessageNum];
}
[UIApplication sharedApplication].applicationIconBadgeNumber = unReadCount;
//doBackground
TIMBackgroundParam *param = [[TIMBackgroundParam alloc] init];
[param setC2cUnread:unReadCount];
[[TIMManager sharedInstance] doBackground:param succ:^() {
NSLog(@"doBackgroud Succ");
} fail:^(int code, NSString * err) {
NSLog(@"Fail: %d->%@", code, err);
}];
}
//App进入前台
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[TIMManager sharedInstance] doForeground:^() {
NSLog(@"doForegroud Succ");
} fail:^(int code, NSString * err) {
NSLog(@"Fail: %d->%@", code, err);
}];
}
// 处理推送消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
DebugLog(@"userinfo:%@",userInfo);
DebugLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
//当APP在前台运行时,不做处理
if( [UIApplication sharedApplication].applicationState == UIApplicationStateActive){
}else if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive) {
//当APP在后台运行时,当有通知栏消息时,点击它,就会执行下面的方法跳转到相应的页面
if ([[TIMManager sharedInstance] getLoginStatus])
{
for (NSString *tfStr in userInfo)
{
if ([tfStr isEqualToString:@"careline"])
{
//跳转到对应的页面
}
}
}
}
}
上图可以分为三个阶段:
//设置群接收选项
[[TIMGroupManager sharedInstance] ModifyReciveMessageOpt:@"TGID1JYSZEAEQ" opt:TIM_GROUP_RECEIVE_MESSAGE succ:^() {
NSLog(@"modify receive group message option succ");
}fail:^(int code, NSString* err) {
NSLog(@"failed code: %d %@", code, err);
}];
7.对于更换证书的情况下新证书得在上传一个小时后生效
8.以上排查不出问题可提供sdkappid、证书id、发送接收双方的账号给技术人员排查
参考文档:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。