推送消息

APNS(Apple Push Notification Services)苹果专门的推送服务器 接收我们自己应用服务器需要被推送的消息 然后推送到我们的手机 手机通知我们的应用程序

注册的大概流程:

1 设备需要向APNS服务器注册

2 注册成功后返回device_token值

3 将这个token值发送给我们自己的服务器

4 有需要推送的消息时  自己的服务器将消息按一定的格式打包 结合token值发送给APNS服务器

5 由于App与APNS维持一个基于TCP的长连接 APNS将消息推送到我们的手机上

推送大致流程

1 你的APP支持推送 APP连接网络后会连接APNS 连接过程中 APNS会验证devices_token 连接成功后维持一个长连接

2 我们的服务器接收到需要推送的消息后将消息和设备的device_token一起打包发送给APNS服务器

3 APNS服务器接收到消息发送到指定device_token设备

4 设备接收到消息 通知我们的App

打包的消息结构

观看大神写的详情:http://www.cnblogs.com/taintain1984/p/3723324.html

1 本地推送

应用本地提醒用户事件

// 注册本地推送消息

+ (void)registerLocalNotification:(NSInteger)alertTime {

UILocalNotification *notification = [[UILocalNotification alloc] init];

// 设置触发通知的时间

NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];

NSLog(@"fireDate=%@",fireDate);

notification.fireDate = fireDate;

// 时区

notification.timeZone = [NSTimeZone defaultTimeZone];

// 设置重复的间隔

notification.repeatInterval = kCFCalendarUnitSecond;

// 通知内容

notification.alertBody =  @"该起床了...";

notification.applicationIconBadgeNumber = 1;

// 通知被触发时播放的声音

notification.soundName = UILocalNotificationDefaultSoundName;

// 通知参数

NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"开始学习iOS开发了" forKey:@"key"];

notification.userInfo = userDict;

// ios8后,需要添加这个注册,才能得到授权

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {

UIUserNotificationType type =  UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];

[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

// 通知重复提示的单位,可以是天、周、月

notification.repeatInterval = NSCalendarUnitDay;

} else {

// 通知重复提示的单位,可以是天、周、月

notification.repeatInterval = NSCalendarUnitMonth;

}

// 执行通知注册

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

}

// 接收到推送消息执行的方法

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

NSLog(@"noti:%@",notification);

// 这里真实需要处理交互的地方

// 获取通知所带的数据

NSString *notMess = [notification.userInfo objectForKey:@"key"];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前台)"message:notMess  delegate:nil cancelButtonTitle:@"OK"otherButtonTitles:nil];

[alert show];

// 更新显示的徽章个数

NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;

badge--;

badge = badge >= 0 ? badge : 0;

[UIApplication sharedApplication].applicationIconBadgeNumber = badge;

}

// 在Appdelegate 中调用注册推送消息的方法

[AppDelegate registerLocalNotification:10];

想要取消推送 需要调用

// 取消某个本地推送通知

+ (void)cancelLocalNotificationWithKey:(NSString *)key {

// 获取所有本地通知数组

NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

for (UILocalNotification *notification in localNotifications) {

NSDictionary *userInfo = notification.userInfo;

if (userInfo) {

// 根据设置通知参数时指定的key来获取通知参数

NSString *info = userInfo[key];

// 如果找到需要取消的通知,则取消

if (info != nil) {

[[UIApplication sharedApplication] cancelLocalNotification:notification];

break;

}

}

}

}

大神博客介绍:http://blog.csdn.net/woaifen3344/article/details/44302635

2 服务器推送

根据APP ID创建推送证书 转化成p12 再转成pem给后台用 后台推送的时候要把这个证书和push.php放在一起 后台使用push.php放在一起 后台使用push.php推送的时候要读取这个证书

创建一个测试证书

Appdelegate注册推送服务 并且通过代理方法的回调来获取注册成功的token值或者注册失败的信息(注册需要设置联网才可以 token可以理解为用户手机的唯一标识和应用程序的App ID组合生成的一个唯一标识,用来标识是哪个手机上的App token不是一直不变的 比如测试和发布的程序返回的token是不一样的)

把token值给服务器 这样服务器就会接受每一个同意了使用推送服务的用户的token 可以保存为一张表 当后台服务器需要发送消息的时候就可以从这张表里面找token后去发送消息

if ([[[UIDevice currentDevice] systemVersion] floatValue] >=8.0) {

// 1 向用户发送请求 去注册推送服务

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; //弹框 角标 声音

// 2 把推送设置配置给我们的应用程序

[[UIApplication sharedApplication] registerUserNotificationSettings:settings];//iOS8.0

// 3 注册推送服务

[[UIApplication sharedApplication] registerForRemoteNotifications];

}else{

// iOS8.0前的方法

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];

}

// 当前应用程序正在运行时候 接收到推送消息会执行的这个方法

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

{

NSLog(@"%@",userInfo);

_commentLabel.text = [userInfo objectForKey:@"aps"][@"alert"];

}

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

{

NSLog(@"注册远程推送服务失败:%@",error);

}

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

{

NSLog(@"token :%@",deviceToken);

// 正常情况下 会在这个地方发送请求 把这个token返回给自己的服务器

}

时间: 2024-10-07 17:30:01

推送消息的相关文章

signalr推送消息

参考:Tutorial: Getting Started with SignalR 2 and MVC 5 环境:vs2013,webapi2,entity framework6.0 实现效果:当用户上传一个文件时候,推送消息给关注此用户的其他用户,告知此用户上传了一个新的文件. 推送原理:当前端用户打开网页时候,SignalR 服务端会自动生成一个guid类型的ConnectionId.此ConnectionId用来连接确定用户端,用来确定发送给哪个当前在线用户.当要推送消息时候,后端方法会根

DWR实现服务器向客户端推送消息

原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研究详细记录下来备忘,也希望能帮助到像我一样的人.只写过程,不写原理(不是不写,而是有些地方我也不太懂),下面开始: 第一.在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下: <servlet> <servlet-name>dwr-invoker</servle

点击推送消息跳转处理(iOS)

当用户点击收到的推送消息时候,我希望打开APP,并且跳转到对应的界面,这就需要在AppDelegate里面对代理方法进行处理. 当用户点击推送消息打开APP的时候会调用 - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions launchOptions中会有推送消息的userInfo信息,此时我们可以通过 NSDictionary* rem

iOS极光推送 点击推送消息跳转页面

文章来自:http://www.jianshu.com/p/eaf07c4372a8 AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1 if ([[UIDevice currentDevice].s

ios如何实现远程推送消息

远程推送可以解决 当用户关闭程序的时候 不能收到推送消息.当客户端使用了远程推送的功能,不管用户有没有关闭程序,都能收到 服务器推送的消息. 苹果实现远程推送 是基于长连接的, 默认情况下 苹果的所有设备都是和 苹果的apns服务器建立长连接的, 只要设备已经联网. 长连接的好处: 苹果服务器可以主动向 客户端发送消息, 也可以找回我的设备(当设备丢失时). 远程推送的步骤: 客户端向苹果服务器获取deviceToken步骤:客户端将 BundleId 和 设备UDID 发送给苹果Apns服务器

Qt通过极光推送向app推送消息

简介 最近在做个项目,当客服端收到防盗的消息通知时向手机app推送一个消息,告知有防盗报警.这么小的功能没必要自己写个推送端,极光推送免费而且推送的成功率高,已经能满足我们的需求了. 极光推送的文档大家可以到极光推送的官网查看(http://docs.jiguang.cn/),由于我们这是是使用Qt C++开发的极光推送并没有提供c++的封装,这里我们选择rest API的方式推送,rest API的推送方式的demo以及json格式在http://docs.jiguang.cn/server/

IOS推送消息的步骤

实现消息推送的步骤 1.注册:为应用程序申请消息推送服务.此 时你的设备会向APNs服务器发送注册请求. 2.APNs服务器接收请求,并将deviceToken返 给你设备上的应用程序 3.客户端应用程序将deviceToken发送给后台 服务器程序,后台接收并储存. 4.后台服务器向APNs服务器发送推送消息 5.APNs服务器将消息发给deviceToken对应设 备上的应用程序

iOS开发,推送消息 steps

1.前期准备 在学习推送开发之前,开发者需要两样东西,(1).iPhone真机,因为模拟器不支持推送(2).付费的开发者账号. 2.新建项目,选择Single View Application模板. 3.注册通知(Registration Notification) (1)在AppDelegate文件的application:didFinishLaunchingWithOptions:方法中添加"注册推送"的代码. - (BOOL)application:(UIApplication 

Android:开机自启动并接收推送消息

接收推送消息部分我们通过ZeroMQ实现,可以参考http://www.cnblogs.com/ilovewindy/p/3984283.html. 首先是开机自启动的功能实现,代码如下:1.    AndroidManifest.xml中添加如下代码: 1 <!-- 抓取系统启动事件 --> 2 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 3 4 &l