必知的技术知识: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】;


}


相关文章
|
8天前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
1月前
|
安全 Android开发 iOS开发
Android vs. iOS:构建生态差异与技术较量的深度剖析###
本文深入探讨了Android与iOS两大移动操作系统在构建生态系统上的差异,揭示了它们各自的技术优势及面临的挑战。通过对比分析两者的开放性、用户体验、安全性及市场策略,本文旨在揭示这些差异如何塑造了当今智能手机市场的竞争格局,为开发者和用户提供决策参考。 ###
|
27天前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术深度对比
【10月更文挑战第18天】 在智能手机操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两种系统的技术特点、优势以及它们之间的主要差异,帮助读者更好地理解这两个平台的独特之处。
44 0
|
12天前
|
监控 iOS开发 开发者
iOS性能优化:深入函数调用栈与符号化技术
在iOS开发中,函数调用栈是理解程序执行流程和优化性能的关键。当应用出现性能问题或崩溃时,能够准确地读取和解析调用栈信息对于快速定位问题至关重要。本文将探讨iOS中的函数调用栈,以及如何通过符号化技术进行有效的性能调优。
24 3
|
17天前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
42 2
|
19天前
|
安全 搜索推荐 Android开发
揭秘iOS与安卓系统的差异:一场技术与哲学的较量
在智能手机的世界里,iOS和Android无疑是两大巨头,它们不仅定义了操作系统的标准,也深刻影响了全球数亿用户的日常生活。本文旨在探讨这两个平台在设计理念、用户体验、生态系统及安全性等方面的本质区别,揭示它们背后的技术哲学和市场策略。通过对比分析,我们将发现,选择iOS或Android,不仅仅是选择一个操作系统,更是选择了一种生活方式和技术信仰。
|
19天前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
24天前
|
安全 Android开发 iOS开发
iOS与安卓:技术生态的双雄争霸
在当今数字化时代,智能手机操作系统的竞争愈发激烈。iOS和安卓作为两大主流平台,各自拥有独特的技术优势和市场地位。本文将从技术架构、用户体验、安全性以及开发者支持四个方面,深入探讨iOS与安卓之间的差异,并分析它们如何塑造了今天的移动技术生态。无论是追求极致体验的苹果用户,还是享受开放自由的安卓粉丝,了解这两大系统的内在逻辑对于把握未来趋势至关重要。
|
25天前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
29天前
|
安全 Android开发 iOS开发
安卓vs iOS:探索两种操作系统的独特魅力与技术深度###
【10月更文挑战第16天】 本文旨在深入浅出地探讨安卓(Android)与iOS这两种主流移动操作系统的特色、优势及背后的技术理念。通过对比分析,揭示它们各自如何塑造了移动互联网的生态,并为用户提供丰富多彩的智能体验。无论您是科技爱好者还是普通用户,都能从这篇文章中感受到技术创新带来的无限可能。 ###
49 2