推送之信鸽推送详解 Think Different
最近公司应用要从腾讯的信鸽推送转变到个推推送。咱就先把信鸽推送总结一下,以备后用。(复杂实际是处理推送,而不是接入。重要是思想以及思考)
信鸽接入还是比较简单的,缺点就是(实际使用中)体验上有时候比较慢,不及时。
1.接入准备。
你首先的需要一个demo应用。然后注册一个信鸽账号,添加你的demo应用。拿到接入推送的一些凭证(appID,appKey).然后将你的demo应用在苹果开发者证书配置中注册推送开发或者生产证书(这个你可以网上找很多图文的)。下载完双击(添加至Mac钥匙串,右键导出格式p12),导出p12文件。添加至信鸽应用管理的对应的配置环境中。接入准备over~。
2.打开iOS接入文档,打开iOS接入文档,打开iOS接入文档!
倒入所需要的framework & lib. 按照文档接入一般是没问题的(仔细一点儿)。信鸽demo写的不错。只需要改一些自己的代码习惯就好了。
在AppDelegate.m 中添加
#import "XGSetting.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
//引导页 做一些文件目录, 三方库初始化,推送通知初始化,指定主控制器 版本检测
return YES;
}
中加入
// 通知
[self didConfigureNotification:launchOptions];
然后自定义方法 doNotification:
#pragma mark Notification
- (void)didConfigureNotification:(NSDictionary * )launchOptions{
// 接入XG 推送
[[XGSetting getInstance] enableDebug:YES];/*提高: 调试信息开关 根据环境 你可以写个判断当前编译环境,方便调试*/
//将你拿到的信鸽appID appKey填入 这里是宏
[XGPush startApp:XGId appKey:XGKey];
//应用完全退出 点击通知处理
NSDictionary* remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (nil!=remoteNotification) {//没通知
}else{
//清空消息角标
[UIApplication sharedApplication].applicationIconBadgeNumber = 0 ;
}
[self registerAPNS]; //向苹果服务器注册远程推送
/*提高 注册本地推送*/
//启动信鸽SDK
[XGPush handleLaunching:remoteNotification successCallback:^{
// NSLog(@"[XGDemo] Handle launching success:%@",launchOptions);
} errorCallback:^{
// NSLog(@"[XGDemo] Handle launching error");
}];
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
//拿到苹果推送标识 向信鸽注册标识
NSString *deviceTokenStr = [XGPush registerDevice:deviceToken account:【你自定义的账户】successCallback:^{
// NSLog(@"XGPushsuccess register");
} errorCallback:^{
// NSLog(@"XGPushfailed register");
}];
/* 提高 举个例子: 注册客服SDK 为你的商城应用添加在线客服*/
[[NSUserDefaults standardUserDefaults] setValue:deviceTokenStr forKey:@"deviceToken"];// 保存起来,找个地方。线上版本出了问题可以拿来救命(调试)
//服务器注册 信鸽token 初始化推送的一些标签什么的 我用了一个单例:推送相关操作
[[Tools getOnlyOne] ..];
}
//推送注册 失败
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
// NSLog(@"[XGDemo] register APNS fail.\n[XGDemo] reason : %@", error);
重新在注册一遍
}
//background fetch 唤醒
//- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
//进入前台 恢复SDK 运行 有些SDK不需要 比如:信鸽
//completionHandler(UIBackgroundFetchResultNewData);
//}
/**
收到通知统一的处理
*/
- (void)appReceiveNotification:(NSDictionary *)XGPushNotification{
if (nil!=serverNoti) {//通知告诉所有的相关页面
[kNotificationCenter postNotificationName:@"XGPushReceiver" object:nil userInfo:XGPushNotification];
}
}
//iOS 通知的不同处理
//- iOS 7~10 版本收到远程推送
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
//ios 7- //告知信鸽我收到了
[XGPush handleReceiveNotification:userInfo successCallback:^{
//NSLog(@"[XGDemo] Handle receive success");
} errorCallback:^{
//NSLog(@"[XGDemo] Handle receive error");
}];
}
/**
收到静默推送的回调
@param application UIApplication 实例
@param userInfo 推送时指定的参数
@param completionHandler 完成回调
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"[XGDemo] receive slient Notification");
//NSLog(@"[XGDemo] userinfo %@", userInfo);
[XGPush handleReceiveNotification:userInfo
successCallback:^{
//NSLog(@"[XGDemo] Handle receive success");
} errorCallback:^{
//NSLog(@"[XGDemo] Handle receive error");
}];
//ios 7+
completionHandler(UIBackgroundFetchResultNewData);
}
/*
按钮点击事件回调
*/
//远程推送
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler{
[XGPush handleReceiveNotification:userInfo
successCallback:^{
//NSLog(@"[XGDemo] Handle receive success");
} errorCallback:^{
//NSLog(@"[XGDemo] Handle receive error");
}];
[self appReceiveNotificationAction:userInfo];
completionHandler();
}
//本地通知
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler{
//自己本地通知处理
completionHandler();
}
// iOS 10 新增 API
// iOS 10 会走新 API, iOS 10 以前会走到老 API
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
// App 用户点击通知的回调 无论前台还是后台
// 无论本地推送还是远程推送都会走这个回调
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler {
[self appReceiveNotification:response.notification.request.content.userInfo];
//ios 10+
[XGPush handleReceiveNotification:response.notification.request.content.userInfo
successCallback:^{
//NSLog(@"[XGDemo] Handle receive success");
} errorCallback:^{
//NSLog(@"[XGDemo] Handle receive error");
}];
[self appReceiveNotificationAction:userInfo];//通知处理
completionHandler();
}
/**
// App 在前台弹通知需要调用这个接口 基本不需要任何操作
*/
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}
#endif
// 点击通知操作
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler{
//appReceiveNotificationAction
completionHandler();
}
... 一些兼容性的推送方法 iOS7 ~ iOS11 //都在一块比如上边的方法
#pragma mark ========注册apns =======
- (void)registerAPNS {
float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue];
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
if (sysVer >= 10) {
// iOS 10
[self registerPush10];
} else if (sysVer >= 8) {
// iOS 8-9
[self registerPush8to9];
} else {
// before iOS 8
[self registerPushBefore8];
}
#else
if (sysVer < 8) {
// before iOS 8
[self registerPushBefore8];
} else {
// iOS 8-9
[self registerPush8to9];
}
#endif
}
- (void)registerPush10{//iOS 10的注册
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
UNUserNotificationCenter *appCenter = [UNUserNotificationCenter currentNotificationCenter];
appCenter.delegate = self;
[appCenter requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
}
if (error) {
//NSLog(@"registerPush10:%@",error);
}
}];
[[UIApplication sharedApplication] registerForRemoteNotifications];
#endif
}
- (void)registerPush8to9{
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *appSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:appSettings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
- (void)registerPushBefore8{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}
#pragma mark注册本地通知
-(void)registLocationNotification
{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0){
// 使用 UNUserNotificationCenter 来管理通知
UNUserNotificationCenter *appCenter = [UNUserNotificationCenter currentNotificationCenter];
//监听回调事件
appCenter.delegate = self;
//iOS 10 使用以下方法注册,才能得到授权
[appCenter requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound)
completionHandler:^(BOOL granted, NSError * _Nullable error) {
NSLog(@"granted: %d ,error:%@",granted,error); }];
//获取当前的通知设置,UNNotificationSettings 是只读对象,不能直接修改,只能通过以下方法获取
[appCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@",settings);
}];
}else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0&&[[UIDevice currentDevice].systemVersion floatValue] < 10.0){
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
}
}
推送之信鸽推送详解 Think Different相关推荐
- php微信小程序物流进度推送,微信小程序 消息推送php服务器验证实例详解
微信小程序 消息推送php服务器验证实例详解 设置页面("设置">>"开发设置"): 1.设置服务器域名 注意http和https协议的不同. 2. ...
- [新手必备]Unity推箱子小游戏C#代码详解(第一篇-代码部分)
完整项目请参考博客:https://blog.csdn.net/qq_41676090/article/details/96300302 本文为推箱子小游戏C#代码详解第一篇的代码部分,主要讲解 Sy ...
- Android 阿里云移动推送厂商辅助通道集成详解
厂商通道配置 1.添加额外依赖项 implementation 'com.aliyun.ams:alicloud-android-push:3.1.9.1'implementation 'com.al ...
- python是否高送转预测股票_详解:如何深度挖掘高送转板块(附:2018年高送转个股预测)...
原标题:详解:如何深度挖掘高送转板块(附:2018年高送转个股预测) 不知不觉又到了11月份,又到了高送转板块表现的时候.今天上午小编主要为大家详解高送转板块:什么是高送转.炒作的几个阶段.如何选择有 ...
- apns java 证书_APNS推送服务证书制作 图文详解教程(新)
iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...
- iOS 远程消息推送,原理和开发详解篇(新手推荐)
1.APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Servic ...
- Facebook力推导航库:React Navigation使用详解
本文来自Songlcy投稿:文章地址:http://blog.csdn.net/u013718120/article/details/72357698 一.开源库介绍 今年1月份,新开源的react- ...
- su联合推拉使用方法_紫天学习星球教学:联合推拉插件完全功能使用详解(中文)...
视频作者:TutorialsUp 视频来源:https://youtu.be/d8ucLEXaNDI 中文讲解:紫天肖万涛 联合推拉插件是由 Fredo6 大神开发的重量级推拉工具集,它可以批量对面和 ...
- Android 消息推送框架详解
消息推送的概念 消息推送,是指绕过手机运营商,通过TCP/IP网络传输的方式,向应用程序发送数据,这些数据包括简单的文本,图片,或者其他多媒体数据. 与手机运营商发送短信的方式相比,消息推送普及性和可 ...
- Android集成腾讯信鸽推送SDK
推送是每个应用中常见的功能今天使用一下腾讯的信鸽推送听说信鸽推送保活率比较高~ 第一步先去官网注册账号https://xg.qq.com/推荐使用QQ直接登陆,进去之后点击"新建应用&quo ...
最新文章
- 某百度程序员中午面试一个阿里程序员,晚上去阿里面试,面试官竟是中午那个人!
- 文巾解题 326. 3的幂
- CodeForces - 1426F Number of Subsequences(dp)
- Effective Java 学习笔记(第53条:接口优先于反射机制)
- vf计算机教程,VF教程,打印版.pdf
- 科研论文画图技巧分享!超级实用!
- HTML5系列代码:使用空格符号
- Kruise Rollout v0.2.0 版本发布:支持 Gateway API、StatefulSet 分批发布等能力
- 牛客 数据库SQL实战 获取员工其当前的薪水比其manager当前薪水还高的相关信息
- 单片C语言程序设计,用C语言编程操作SPMC75系列单片 - 控制/MCU - 电子发烧友网
- 战舰少女服务器不显示,老玩家告诉你游戏战舰少女连不上网的解决方法
- emu8086 第一个程序
- zune连接手机报错,提示无法连接的解决方法
- HDU-3001 Travelling
- 【QQ爱上360】让360与qq兼容不吵架【本博原创软件】
- 全国首个珠贝交易市场鄱湖珠贝城走上金算盘全程电子商务之路
- NYOJ869---切蛋糕
- 中控 c语言,「分享」C语言如何编写图形界面
- 二极管、三极管相关知识整理
- 100个酒瓶(含盖),每8个盖子或3个空瓶可以换一瓶酒(含盖),请计算瓶盖瓶身独立去兑换,能兑换多少...
热门文章
- ACM解题总结——HihoCoder1237 (微软笔试题)
- 高中教师计算机水平要求,高中信息技术教师考试大纲
- Excel常用函数大全
- Zabbix自定义报警提示声音
- 客户管理系统哪个好用 crm客户管理系统排名
- 主板检测卡c5_主板检测卡代码(常见)及解决方法
- ModifyStyle()调用不起作用
- Python简单数据清洗
- 下载verycd的方法下载电驴资源隐藏资源的最新可用方法
- [Android 4.4.3] 泛泰A860 Omni4.4.3 20140610 RC2.0 三版通刷 by syhost