Push Notification系列概括:

1.Push Notification简介和证书说明及生成配置

2.Push Notification的iOS处理代码和Provider详解

3.Push Notification的移动客户端定位服务

正文:

Push NotificationiOS处理代码和Provider详解

这一篇文档主要描述代码实现推送通知,在最后补充一些自己在整个过程中遇到的一些问题,供以后参考,也给其他朋友一个提醒。

一、应用程序的处理代码

这里就假定已经创建了一个iOS的App,名称就暂设为MyPushNotification吧。。。

处理推送通知的代码,主要在AppDelegate.m里,故在上述假定的项目中可以找到MyPushNotificationAppDelegate.m文件。

示例代码:

 //本地服务器地址

 #define provider_server @"http://*******"

 //应用启动时候注册推送通知服务,第一次安装时系统会自动提示用户

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

     //注册推送通知功能

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

 //将标记数字置为0,则不显示

     application.applicationIconBadgeNumber = ; 

 }

 //接收从苹果服务器返回的唯一的DeviceToken,然后发送给自己的服务端

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

     NSString* device_token = [NSString stringWithFormat:@"%@",deviceToken];

     NSString* device_name = [[UIDevice currentDevice] name];

     NSString* device_version = [[UIDevice currentDevice] systemVersion];

     NSString* device_type = [[UIDevice currentDevice] model];

     NSString *strUrl = [NSString stringWithFormat:@"%@?action=registerDevices&device_token=%@&device_name=%@&device_version=%@&device_type=%@",

                         provider_server,device_token,device_name,device_version,device_type];

     strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

     NSURL *url = [NSURL URLWithString:strUrl];

     NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

     //发送URL请求

     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

 }

 //程序处于启动状态,或者在后台运行时,会接收到推送消息

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

 {   

     if ([[userInfo objectForKey:@"aps"] objectForKey:@"alert"]!=NULL) {

         if(application.applicationState ==UIApplicationStateActive){

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"温馨提示"  

               message:[NSString stringWithFormat:@"\n%@",  

                    [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]  

                 delegate:self  

                 cancelButtonTitle:@"OK"  

               otherButtonTitles:nil];
      [alertView show];       [alertView release]; } } }

这里重点列出了几个值得注意的代理方法,当然,还可以实现更多的代理来丰富推送通知功能。

为了测试,我在实现

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

方法的时候,直接采用了控制台NSLog输出DeviceToken,然后将得到的字符串复制,以便在Provider中使用,因为暂时还没有搭建好本地服务器,无法采用发送url请求的方式。

只需要这几个方法就可以简单处理推送通知了。

二、Provider详解

终于说到Provider了,看了很多资料,对于这一块的介绍都不是很详细,大多都是一笔带过。

确实,目前最有效的办法是直接采用开源框架来处理,我这里也不例外,但是还是想多说一下这方面的心得。

首先,推荐两个开源框架:

(1)       Mac OS X系统下的PushMeBaby

https://github.com/zomfg/PushMeBaby-OneMoreTime-Again

这个框架的优势就是可以直接在Mac环境里使用,采用的证书为apns***.cer,详情参考上一篇的证书说明。不需要生成p12文件。使用方法简单快速,添加自己的证书文件到资源目录下,然后直接替换框架代码里面的证书变量和DeviceToken就可以了。

(2)       Windows系统下的PushSharp https://github.com/Redth/PushSharp

这个框架的优势在于可适用于多终端,这意味着,可扩展性更强,不管是向什么终端设备推送,都可以实现。跟上一个框架相比,需要采用p12文件作为推送条件,注意该框架要求提供p12文件的密码,这属于上一篇证书说明中生成p12文件的内容了。

从公司的长远考虑,我采用了研究这个框架。

代码修改说明:在项目PushSharp.Sample的Program.cs中将不用的终端类型代码注释,修改“APPLE NOTIFICATIONS”下面的代码,注意修改变量appleCert的p12证书和push.RegisterAppleService中的证书密码,最后将push.QueueNotification中的DeviceToken参数改为目标字符串,就大功告成了。

先运行客户端应用程序,然后运行命令行程序后,就可以看到推送过程了。

提醒:在编译PushSharp项目时,可能会出现一堆错误提醒,别担心,很可能是由于没有开启“NuGet”。在VS中,工具——选项——包管理器——常规,选中“允许NuGet在生成期间下载缺少的程序包”。再次等待编译就可以了。

但是不管采用哪个框架,实现思路都是一样的:

(1)       搭建本地服务器,配置环境和数据库

(2)       接收客户端发送来的DeviceToken,并对其进行妥善管理

(3)       以证书为凭据,将目标DeviceToken和消息内容发送给APNS,请求推送通知服务

(4)       可处理当客户端接收到APNS推送的消息后发来的url请求,并做相应处理。完成整个推送过程。

三、配置或者编译过程中遇到的错误

看到这里,无非两个结果嘛,如果成功了,可以不用往下看了,但是不成功的话,下面的内容或许可以帮你找到问题所在。

错误:

iOS推送消息证书错误-Code=3000 "未找到应用程序的“aps-environment”的权利字符串"

这个错误应该会很普遍,涉及的疑点比较多。

  1. AppID含有通配符,请参考上一篇内容
  2. 证书生成顺序不对,请参考上一篇内容
  3. Target证书配置不正确
  4. 编译的问题,可以先将设备上的该应用删除,然后clean后重新编译项目

到此,Push Notification总结系列就可以结束了,但是和别人比较,总要有新内容才算进步嘛,所以在这个总结里面,加入了第三篇,定位服务的提供。而且这个功能肯定和推送服务是一起的,因为推送内容的本地化要求和按区域区分,定位服务就必不可少了。

所以,下一篇就总结一下自己研究定位服务的心得。

Push Notification总结系列(二)的更多相关文章

  1. Push Notification总结系列(一)

    Notification系列概括: 1.Push Notification简介和证书说明及生成配置 2.Push Notification的iOS处理代码和Provider详解 3.Push Noti ...

  2. Push Notification总结系列之移动客户端定位服务

    Push Notification系列概括: 1.Push Notification简介和证书说明及生成配置 2.Push Notification的iOS处理代码和Provider详解 3.Push ...

  3. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  4. iOS push全方位解析(二)【译文】"——生成OpenSSL证书,Provisioning Profile

    这是一篇来自raywenderlich的教程,内容翔实!结构简单透彻.讲解循序渐进.文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下: 1.[iOS push全方位解析](一) push的 ...

  5. 苹果推送通知服务Push Notification探究总结(序)

    刚才发了两篇几个月前写的文档,觉得太敷衍了,想了想,还是来一发实在的. 再者,刚好上周研究了苹果的推送通知服务Push Notification,还是很有心得的,赶紧趁热打铁,记录一下,望与大家谈论下 ...

  6. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  7. SonarQube系列二、分析dotnet core/C#代码

    [前言] 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目.目录如下: SonarQube系列一.Linux安装与部署 SonarQube系列二.分析 ...

  8. 手牵手,从零学习Vue源码 系列二(变化侦测篇)

    系列文章: 手牵手,从零学习Vue源码 系列一(前言-目录篇) 手牵手,从零学习Vue源码 系列二(变化侦测篇) 陆续更新中... 预计八月中旬更新完毕. 1 概述 Vue最大的特点之一就是数据驱动视 ...

  9. Missing Push Notification Entitlement 问题

    最近打包上传是遇到一个问题: 描述: Missing Push Notification Entitlement - Your app includes an API for Apple's Push ...

随机推荐

  1. unix cd使用命令

    [语法]:     cd   [夹] [说明]:此命令用于工作文件以改变当前的文件夹,使用环境变量没有参数$HOME 作为它的参数,$HOME 路径通常在注册时输入. [抽样]: cd   文件夹 c ...

  2. C# 一个WCF简单实例

    以订票为例简单应用wcf 新建一个wcf服务应用程序 在IService1.cs定义服务契约 复制代码 代码如下: namespace WcfDemo { // 注意: 如果更改此处的接口名称 &qu ...

  3. linux_安装 redis

    Installation Download, extract and compile Redis with: $ wget http://download.redis.io/releases/redi ...

  4. Unity3D音频播放器 动态装载组件

    大多数在线Unity有关如何只教程Unity在播放音乐.之后如何通过拖动它们无法继续添加音频文件 但有时在游戏中的对象要玩几个声音.这时候我们就需要使用代码控制,拖动推教程AudioClip颂值的方法 ...

  5. Cannot find ActionMappings or ActionFormBeans collection

    出现此问题.首先检查web.xml,的主要结构被认为是在下面的图: 再检查struts-config.xml.确认是否有<form-beans>和<action-mappings&g ...

  6. 【百度地图API】——如何让标注自动呈现在最佳视野内

    原文:[百度地图API]--如何让标注自动呈现在最佳视野内 摘要: “我有一堆标注,不规则的散落在地图的各个地方,我想把它们展示在一个最佳视野中,怎么办呢?”一位API爱好者咨询道. -------- ...

  7. .NET 各种问题汇总

    1.i++ 与++i的区别 using System; class TestApp { public static void Main() { int i = 8; int count = ++i;/ ...

  8. selenium之多线程启动grid分布式测试框架封装(一)

    一.设计思路 在国内市场上,IE内核的浏览器占据了绝大部分的市场份额,那么此次框架封装将进行IE系列的浏览器进行多线程并发执行分布式测试的封装. 运行时主进程与多线程关系如下:

  9. 《那些年,我们拿下FPGA》做笔记

    spld.cpld和fpga等可不管什么样的逻辑是大自然来实现.任何逻辑可以由多项式来表示(要么逼关闭).比多项式乘法和处理操作仅此而已. 而就.您可以在门线上用.或门添加剂. fpga扩展架构SOP ...

  10. 快速构建Windows 8风格应用23-App Bar概述及使用规范

    原文:快速构建Windows 8风格应用23-App Bar概述及使用规范 本篇博文主要介绍App Bar概述.App Bar命令组织步骤.App Bar最佳实践.   App Bar概述 Windo ...