必知的技术知识:ios个推推送集成

简介: 必知的技术知识:ios个推推送集成

个推推送总结:


个推第三方平台官网地址:


首先去官网注册账号,创建应用,应用的配置信息,创建APNs推送证书上传 P12证书(开发对应开发证书,上线对应生产证书)包括导入 SDK 添加依赖库...这些繁琐的事请移步个推官网查看 xcode 集成教程.


一.推送的流程


个推 iOS 推送服务框架如下图所示:


绿色部分是 APNs 推送,个推平台替开发者的应用通过苹果 APNs 服务器向指定的目标设备进行推送。由 APNs Server 将通知推送到相应的 iOS 设备上。


红色部分是个推应用内推送部分,即 App 启动时,应用内集成的个推SDK会//代码效果参考:http://www.lyjsj.net.cn/wz/art_24115.html

开启长连接到个推服务器,从而开发者可通过个推服务器推送消息到 App 里,这条链路性能和稳定性更强,是APNs的一个很重要的补充。

  app 在收到推送消息时分为三种情况


1.app 在前台接收到通知


APP接收到推送后推送后首先弹出一个Alert提示是否跳转页面


2.app 在后台接收到通知


点击通知栏使APP进入前台后,直接跳转页面


点击icon图标使APP进入前台后,不作操作


3.app 处于关闭状态接收到通知


点击通知栏启动APP,直接跳转页面


点击icon图标启动APP,不作操作


二.iOS 集成个推只支持透传消息(透传消息并且支持安卓)


三.集成个推官网 SDK 配置AppID,AppKey,AppSecret


p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 132, 0, 1) }


span.s1 { font-variant-ligatures: no-common-ligatures }


span.s2 { font: 11px "PingFang SC"; font-variant-ligatures: no-common-ligatures }


p.p1 { margin: 0; font: 16px "Helvetica Neue"; color: rgba(47, 47, 47, 1); -webkit-text-stroke: #2f2f2f }


span.s1 { font-kerning: none }


首先为AppDelegate添加一个属性 分辨通知的三种情况


// 用来判断是否是通过点击通知栏开启(唤醒)APP


@property (nonatomic) BOOL isLaunchedByNotification;


【1】:使用APPID/APPKEY/APPSECRENT创建个推实例


- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {


【self startSdkWith:kGtAppId appKey:kGtAppKey appSecret:kGtAppSecret】;


}


- (void)startSdkWith:(NSString )appID appKey:(NSString )appKey appSecret:(NSString )appSecret


{


//【1-1】:通过 AppId、 appKey 、appSecret 启动SDK


//该方法需要在主线程中调用


【GeTuiSdk startSdkWithAppId:appID appKey:appKey appSecret:appSecret delegate:self】;


//【1-2】:设置是否后台运行开关


【GeTuiSdk runBackgroundEnable:YES】;


//【1-3】:设置电子围栏功能,开启LBS定位服务 和 是否允许SDK 弹出用户定位请求


【GeTuiSdk lbsLocationEnable:YES andUserVerify:YES】;


}


【2】:注册APNS


#pragma mark - 用户通知(推送) _自定义方法


/** 注册远程通知 /


- (void)registerRemoteNotification {


if (【【UIDevice currentDevice】.systemVersion floatValue】 >= 10.0) {


#if IPHONE_OS_VERSION_MAX_ALLOWED >= IPHONE_10_0 // Xcode 8编译会调用


UNUserNotificationCenter center = 【UNUserNotificationCenter currentNotificationCenter】;


【center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionCarPlay) completionHandler:^(BOOL granted, NSError _Nullable error) {


if (!error) {


NSLog(@"request authorization succeeded!");


}


}】;


【【UIApplication sharedApplication】 registerForRemoteNotifications】;


#else // Xcode 7编译会调用


UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge);


UIUserNotificationSettings settings = 【UIUserNotificationSettings settingsForTypes:types categories:nil】;


【【UIApplication sharedApplication】 registerUserNotificationSettings:settings】;


【【UIApplication sharedApplication】 registerForRemoteNotifications】;


#endif


} else if (【【【UIDevice currentDevice】 systemVersion】 floatValue】 >= 8.0) {


UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge);


UIUserNotificationSettings settings = 【UIUserNotificationSettings settingsForTypes:types categories:nil】;


【【UIApplication sharedApplication】 registerUserNotificationSettings:settings】;


【【UIApplication sharedApplication】 registerForRemoteNotifications】;


} else {


UIRemoteNotificationType apn_type = (UIRemoteNotificationType)(UIRemoteNotificationTypeAlert |


UIRemoteNotificationTypeSound |


UIRemoteNotificationTypeBadge);


【【UIApplication sharedApplication】 registerForRemoteNotificationTypes:apntype】;


}


}


p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 132, 0, 1) }


span.s1 { font-variant-ligatures: no-common-ligatures }


span.s2 { font: 11px "PingFang SC"; font-variant-ligatures: no-common-ligatures }


p.p1 { margin: 0; font: 11px "PingFang SC"; color: rgba(0, 132, 0, 1) }


span.s1 { font-variant-ligatures: no-common-ligatures }


【3】远程通知注册成功委托


/* 远程通知注册成功委托 /


- (void)application:(UIApplication )application didRegisterForRemoteNotificationsWithDeviceToken:(NSData )deviceToken {


NSString *token = 【【deviceToken description】 stringByTrimmingCharactersInSet:【NSCharacterSet characterSetWithCharactersInString:@""】】;


token = 【token stringByReplacingOccurrencesOfString:@" " withString:@""】;


NSLog(@"\n]>【DeviceToken Success】:%@\n\n", token);


NSLog(@"--个推注册成功-");


// 【 GTSdk 】:向个推服务器注册deviceToken


【GeTuiSdk registerDeviceToken:token】;


}


p.p1 { margin: 0; font: 11px "PingFang SC"; color: rgba(0, 132, 0, 1) }


span.s1 { font: 11px Menlo; font-variant-ligatures: no-common-ligatures }


span.s2 { font-variant-ligatures: no-common-ligatures }


/ 远程通知注册失败委托 /


- (void)application:(UIApplication )application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error


{


NSLog(@"---个推注册失败---");


//注册失败通知个推服务器


【GeTuiSdk registerDeviceToken:@""】;


}


p.p1 { margin: 0; font: 11px "PingFang SC"; color: rgba(0, 132, 0, 1) }


span.s1 { font: 11px Menlo; font-variant-ligatures: no-common-ligatures }


span.s2 { font-variant-ligatures: no-common-ligatures }


【4】APP已经接收到“远程”通知(推送) - (App运行在后台/App运行在前台)


/ APP已经接收到“远程”通知(推送) - (App运行在后台/App运行在前台) /


- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler


{


//此时 App 在后台点击通知栏进去前台 这里可做进入前台操作


//app 进去前台 icon角标显示数为0 并且发送个推服务器


【【UIApplication sharedApplication】 cancelAllLocalNotifications】;


【UIApplication sharedApplication】.applicationIconBadgeNumber = 0;


【GeTuiSdk setBadge:0】;


// 【 GTSdk 】:将收到的APNs信息传给个推统计


【GeTuiSdk handleRemoteNotification:userInfo】;


// 【4-EXT】:处理APN


NSString record = 【NSString stringWithFormat:@"App运行在后台/App运行在前台【APN】%@, %@", 【NSDate date】, userInfo】;


NSLog(@"%@", record);


completionHandler(UIBackgroundFetchResultNewData);


self.isLaunchedByNotification = YES;


p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 132, 0, 1) }


span.s1 { font-variant-ligatures: no-common-ligatures }


span.s2 { font: 11px "PingFang SC"; font-variant-ligatures: no-common-ligatures }


//iOS 10中收到推送消息


#pragma mark - iOS 10中收到推送消息


#if IPHONE_OS_VERSION_MAX_ALLOWED >= IPHONE_10_0


// iOS 10: App在前台获取到通知


- (void)userNotificationCenter:(UNUserNotificationCenter )center willPresentNotification:(UNNotification )notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {


NSLog(@"willPresentNotification:%@", notification.request.content.userInfo);


// 根据APP需要,判断是否要提示用户Badge、Sound、Alert


completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);


}


// iOS 10: 点击通知进入App时触发


- (void)userNotificationCenter:(UNUserNotificationCenter )center didReceiveNotificationResponse:(UNNotificationResponse )response withCompletionHandler:(void (^)())completionHandler {


//角标复位


【GeTuiSdk resetBadge】;


【【UIApplication sharedApplication】setApplicationIconBadgeNumber:0】;


【【UIApplication sharedApplication】 cancelAllLocalNotifications】;


NSLog(@"didReceiveNotification:%@", response.notification.request.content.userInfo);


// 【 GTSdk 】:将收到的APNs信息传给个推统计


【GeTuiSdk handleRemoteNotification:response.notification.request.content.userInfo】;


completionHandler();


}


#endif


p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 132, 0, 1) }


span.s1 { font-variant-ligatures: no-common-ligatures }


//设置GeTuiSdkDelegate


注意 APP 启动成功会返回 clientId ,我们项目中使用clientId进行消息透传,在登录的时候将clientId传给我们自己的服务器,我们服务器根据clientId给用户进行推送


/ SDK启动成功返回cid /


- (void)GeTuiSdkDidRegisterClient:(NSString )clientId


{


// 【4-EXT-1】: 个推SDK已注册,返回clientId


NSLog(@"<span style="color: rgba(128, 0, 0, 1)"]]【GeTuiSdk RegisterClient】:----%@", clientId);


// 将clientId写入本地


【USER_DEFAULT setObject:clientId forKey:kPushClientId】;


}


/ SDK遇到错误回调 /


- (void)GeTuiSdkDidOccurError:(NSError )error


{


// 【EXT】:个推错误报告,集成步骤发生的任何错误都在这里通知,如果集成后,无法正常收到消息,查看这里的通知。


NSLog(@"\n]【GTSdk error】:%@\n\n", 【error localizedDescription】);


}


p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 132, 0, 1) }


span.s1 { font-variant-ligatures: no-common-ligatures }


span.s2 { font: 11px "PingFang SC"; font-variant-ligatures: no-common-ligatures }


/ SDK收到透传消息回调 */


/ SDK收到透传消息回调 /


- (void)GeTuiSdkDidReceivePayloadData:(NSData )payloadData andTaskId:(NSString )taskId andMsgId:(NSString )msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString )appId


{


// 汇报个推自定义事件


【GeTuiSdk sendFeedbackMessage:90001 andTaskId:taskId andMsgId:msgId】;


// 【4】: 收到个推消息


//这里收到透传消息,根据自己服务器返回的格式处理


NSDictionary jsonDict = 【NSJSONSerialization JSONObjectWithData:payloadData options:NSJSONReadingMutableLeaves error:nil】;


// 当app不在前台时,接收到的推送消息offLine值均为YES


// 判断app是否是点击通知栏消息进行唤醒或开启


// 如果是点击icon图标使得app进入前台,则不做操作,并且同一条推送通知,此方法只执行一次


if (offLine) {


// 离线消息,说明app接收推送时不在前台


if (self.isLaunchedByNotification) {


// app是通过点击通知栏进入前台


} else {


// app是通过点击icon进入前台,在这里不做操作


}


} else {


// app已经处于前台,提示框提示


//调用系统震动系统声音


AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);


AudioServicesPlaySystemSound(1007);


}


// 控制台打印日志


NSString msg = 【NSString stringWithFormat:@"SDK收到透传消息回调taskId=%@,messageId:%@,payloadMsg:%@%@", taskId, msgId, jsonDict, offLine ? @"" : @""】;


NSLog(@"\n]【GTSdk ReceivePayload】:%@\n\n", msg);


#pragma mark--- 接收到推送后,进行提示或怎样


}


/** SDK收到sendMessage消息回调 /


- (void)GeTuiSdkDidSendMessage:(NSString )messageId result:(int)result


{


// 发送上行消息结果反馈


NSString msg = 【NSString stringWithFormat:@"sendmessage=%@,result=%d", messageId, result】;


NSLog(@"\n]【GTSdk DidSendMessage】:%@\n\n", msg);


}


/* SDK运行状态通知 /


- (void)GeTuiSDkDidNotifySdkState:(SdkStatus)aStatus


{


// 通知SDK运行状态


NSLog(@"\n]【GTSdk SdkState】:%u\n\n", aStatus);


}


#pragma mark ---application


- (void)application:(UIApplication )application didRegisterUserNotificationSettings:(UIUserNotificationSettings )notificationSettings {


NSLog(@"推送的内容:%@",notificationSettings);


【application registerForRemoteNotifications】;


}


注意: app 运行在后台时并不会走 APNS 推送,由个推服务器推送,我们要让 app在后台第一时间让个推 SDK 断线,先用 APNS 推送, app 进入前台重新激活 SDK, 如果由个推服务器推送 app 可以收到透传的消息,但不会在通知栏提示.


- (void)applicationDidEnterBackground:(UIApplication )application {


///切后台关闭SDK,让SDK第一时间断线,让个推先用APN推送


【GeTuiSdk destroy】;


}


- (void)applicationWillEnterForeground:(UIApplication )application {


//设置角标为0 相当于复位


【GeTuiSdk setBadge:0】;


【【UIApplication sharedApplication】setApplicationIconBadgeNumber:0】;//进入前台取消应用消息图标搜索


//代码效果参考:http://www.lyjsj.net.cn/wz/art_24113.html

【【UIApplication sharedApplication】 cancelAllLocalNotifications】;

}


- (void)applicationDidBecomeActive:(UIApplication *)application {


【DeviceDelegateHelper sharedInstance】.preDate = 【NSDate date】;


/// 重新上线


【self startSdkWith:kGtAppId appKey:kGtAppKey appSecret:kGtAppSecret】;


}


相关文章
|
2月前
|
SQL 数据可视化 关系型数据库
MCP与PolarDB集成技术分析:降低SQL门槛与简化数据可视化流程的机制解析
阿里云PolarDB与MCP协议融合,打造“自然语言即分析”的新范式。通过云原生数据库与标准化AI接口协同,实现零代码、分钟级从数据到可视化洞察,打破技术壁垒,提升分析效率99%,推动企业数据能力普惠化。
253 3
|
1月前
|
定位技术 开发工具 iOS开发
百宝箱开放平台 ✖️ iOS 集成说明
本文介绍百宝箱智能体与友盟+ iOS 应用集成方法,涵盖手动集成、权限配置、SDK 初始化、日志查看及效果验证。提供依赖库添加、Info.plist 权限声明、channel 规范、demo 工程下载与运行说明,助您快速完成接入。
162 1
|
4月前
|
数据采集 运维 DataWorks
DataWorks 千万级任务调度与全链路集成开发治理赋能智能驾驶技术突破
智能驾驶数据预处理面临数据孤岛、任务爆炸与开发运维一体化三大挑战。DataWorks提供一站式的解决方案,支持千万级任务调度、多源数据集成及全链路数据开发,助力智能驾驶模型数据处理与模型训练高效落地。
|
6月前
|
传感器 人工智能 算法
聚焦“以技术集成支撑单亩价值创造”与“增加值分配机制区块链存证确权”两大核心本质
“振兴链-技术集成科技小院”以技术集成与区块链为核心,推动农业现代化。通过多维度技术整合(如精准农业、物联网等),突破资源约束,最大化单亩产值;同时利用区块链确权存证,建立透明分配机制,解决传统农业中收益不均问题。技术赋能生产,制度重塑分配,实现效率与公平的平衡,助力乡村振兴与产业升级。典型场景显示,该模式可显著提升单亩价值并确保增值公平分配。
|
运维 监控 安全
Cisco ISR 4000 Series IOS XE 17.18.1a ED 发布 - 思科 4000 系列集成服务路由器 IOS XE 系统软件
Cisco ISR 4000 Series IOS XE 17.18.1a ED - 思科 4000 系列集成服务路由器 IOS XE 系统软件
106 0
|
9月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
341 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
2月前
|
监控 Cloud Native Java
Spring Integration 企业集成模式技术详解与实践指南
本文档全面介绍 Spring Integration 框架的核心概念、架构设计和实际应用。作为 Spring 生态系统中的企业集成解决方案,Spring Integration 基于著名的 Enterprise Integration Patterns(EIP)提供了轻量级的消息驱动架构。本文将深入探讨其消息通道、端点、过滤器、转换器等核心组件,以及如何构建可靠的企业集成解决方案。
250 0
|
3月前
|
人工智能 自然语言处理 分布式计算
AI 驱动传统 Java 应用集成的关键技术与实战应用指南
本文探讨了如何将AI技术与传统Java应用集成,助力企业实现数字化转型。内容涵盖DJL、Deeplearning4j等主流AI框架选择,技术融合方案,模型部署策略,以及智能客服、财务审核、设备诊断等实战应用案例,全面解析Java系统如何通过AI实现智能化升级与效率提升。
330 0
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?

热门文章

最新文章