推送 其他

iOS开发-进阶:开启Remote notifications 需要在Xcode 中修改应用的 Capabilities 开启Remote notifications,请参考下图: 修改通知处理函数 当注册了Backgroud Modes -> Remote notifications 后,notification 处理函数一律切换到下面函数,后台推送代码也在此函数中调用。 - (void)appl 阅读详情

关于推送通知

 

推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的。一般说来,当要显示消息或下载数据的时候,通知是由远程服务器(程序的提供者)发送,然后通过苹果的推送通知服务(Apple Push Notification Service,简称apns)推送到设备的程序上。

推送的新消息可能是一条信息、一项即将到期的日程或是一份远程服务器上的新数据。在系统上展现的时候,可以显示警告信息或在程序icon上显示数字,同时,也可以播放警告音。一旦用户注意到程序有新的信息、时间或是数据,他们可以运行程序并访问新的内容。也可以选择忽略通知,这时程序将不会被激活。

iPhone, iPad和iPod touch上同一时刻只有一个app在前台运行。大多数程序在后台运行的时候,可以对某些用户感兴趣的内容做出回应(定时、或数据等)。推送通知能让程序在这些事件发生的时候通知用户。

作为提供者为程序开发和部署推送通知,必须通过iOS Developer Program Portal获得SSL证书。每个证书限用于一个程序,使用程序的bundle ID作为标识。证书有两种用途的:一种是针对sandbox(用于开发和测试),另外一种针对发布产品。这两种运行环境拥有为各自指定的IP地址并且需要不同的证书。还必须为两种不同的环境获取各自的provisioning profiles。

APNS提供了两项基本的服务:消息推送和反馈服务。

消息推送:使用流式TCP套接字将推送通知作为二进制数据发送给APNs。消息推送有分别针对开发和测试用的sandbox、发布产品的两个接口,每个都有各自的地址和端口。不管用哪个接口,都需要通过TLS或SSL,使用SSL证书来建立一个安全的信道。提供者编制通知信息,然后通过这个信道将其发送给APNs。 注:sandbox:   gateway.sandbox.push.apple.com:219 产品接口:gateway.push.apple.com:2195

反馈服务:可以得到针对某个程序的发送失败记录。提供者应该使用反馈服务周期性检查哪些设备一直收不到通知,不需要重复发送通知到这些设备,降低推送服务器的负担。 注:sandbox:feedback.push.apple.com:2196 产品接口:feedback.sandbox.push.apple.com:2196

二.Apple Push Notification的工作机制

自己的客户端发送消息到自己应用软件的apns,apns发送消息到你的手机。这个是根据令牌识别的。手机在发送消息到你的应用软件。

  •   首先是应用程序注册消息推送。
  • IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
  • 应用程序将deviceToken发送给PUSH服务端程序(Provider)。
  • 服务端程序向APNS服务发送消息。
  • APNS服务将消息发送给iPhone应用程序。

     1. Provider是指某个iPhone软件的Push服务器,是我们将要开发的服务器。

2. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。

 

上图可以分为三个阶段:

第一阶段:推送服务器(provider)把要发送的消息、目的iPhone的标识打包,发给APNS;

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone;

第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

 
三 推送之前的配置
在任何iOS应用开发里面,开发人员总是在团队里面扮演某一角色:团队经理,团队管理员,和团队成员。iPhone开发证书和配置文件由不同角色完成。通常团队经理是团队里面唯一可以创建Development SSL证书(沙箱环境)和Distribution SSL证书(产品环境)的人。而团队经理和团队管理员都可以创建Development和Distribution的配置文件。团队成员只能下载并安装证书和配置文件(!这里要区别好证书和配置文件的概念:证书,即Certificates,它主要是使用Access Key Chain来生成的一个签名密钥。而配置文件,即Provisioning profiles,它主要是根据不同的App来生成的针对性的代码签名文件。二者区别是一般一个开发者账户只能有一个Certificates(而Development一个,Distribtuion一个),但是可以有多个Provisioning profiles文件,且这些Provisioning profiles通常创建的时候都使用同一个Certrificates)。以下部分详细介绍该过程。
注意:iOS Provisioning Portal给所有iOS开发者。
创建SSL证书和密钥
在iOS Dev Center的iOS Provisioning Portal里面,团队经理选中相应APNs的AppID。他需要完成以下步骤来创建SSL证书:
1.
点击窗口左边侧边栏的App IDs。
将会跳转到一个显示当前合法应用IDs的页面。每个应用的ID前面包含了它的Bundle ID,而在Bundle ID之前包含了苹果生成的十位字符串。团队管理员必须输入Bundle ID。对于每个证书,它必须匹配某一特定的Bundle ID,你不能使用“wildcart”的应用ID。即要使用推送通知的应用的Bundle ID不能使用“*”来创建。
2.
找到需要创建SSL证书的应用ID(和Development Provisioning Profile相关),并单击Configure按钮。
你必须确保该App ID下面的苹果推送通知服务栏下面显示“可用”状态才能为该应用配置APNs证书。
3.
在App ID配置页面,检查已经勾选了“Enable for Apple Push Notification service”复选框,并点击下面的“Configure”按钮。
单击该按钮将会启动APNs助理,它会通过一系列步骤来引导完成操作。
4.
第一步要求你启动Keychain Access应用并生成一个Certificate Signing Request(CSR)文件。
下面的介绍来自证书助理。当你完成生成CSR后,点击Keychain Access上面Continue来返回到APNs Assistant。
当你创建一个CSR时,Keychain Access生成一个私有和公有的加密密钥对。而私有的密钥会默认被放入你的Login keychain里面。而公有的密钥包含CSR会发送到配置服务器。当配置服务器把证书发回给你的时候,证书里面的其中一个条目将是公有密钥。
5.
在Submit Certificate Signing Request面板上,单击Choose File。导航到你之前创建的CSR文件的地方并选中它。
6.
单击Generate按钮。
在显示Generate Your Certificate面板的同时,Assistant会配置并生成你的客户端SSL证书。如果生成成功,它将会显示信息“Your APNs Certificate has been generated.”。单击Continue来进入下一步操作。
7.
在下一个面板,单击Download Now按钮来下载证书文件到本地文件夹。找到文件下载的地方并双击证书文件(该证书文件包含一个.cer的扩展名)来把它安装到你的keychain里面。当完成后,单击APNs Assistant上面的Done按钮。
双击加载启动Keychain Access。确保你已经把刚才的证书安装到了你用于开发的电脑的login keychain里面。在Keychain Access里面,确保你的证书使用的ID匹配你应用的Bundle ID。APNs的SSL证书应该安装到你的通知服务上面。
当你返回到iOS Dev Center Portal的Configure App ID页面完成这些步骤后,你的证书应该会变成绿色,并且显示“Enabled”。
为了给产品环境创建一个证书,重复上述步骤,但记住选中产品证书的应用ID。
团队经理或团队管理器接下来必须创建在服务器用于远程通知开发的配置证书(Development 或 Distribution)。配置文件就是一个集合,它囊括了和应用相关的开发者和开发团队验证过的设备并使用这些设备来测试应用程序。配置文件包含了证书、设备标示符、应用的Bundle ID、和所有权利,包括<aps-environment>。所有团队程序需要在运行并测试他们应用代码的设备上面安装该配置文件。
注意:关于创建配置文件的详细解析参考编程用户指南。
为了下载并安装配置文件,团队程序必须完成以下步骤:
1.
进入iOS Dev Center的Provisioning portal页面。
2.
创建一个新的配置文件,并包含你注册用于APNs的App ID。
3.
在你下载这个新的配置文件之前修改任何已存在的配置文件。
你必须修改配置文件的一些细微部分(比如切换选项)来生成一个新的配置文件。如果配置文件并没有“受损(dirtied)”,你不应该给以该原始配置文件任何推送的权利。
4.
找到文件的下载目录,把该配置文件(通常是一个.mobileprovision扩展文件)拖拉到Xcode或iTunes应用程序的图标上面。
可选的,你也可以把配置文件复制到~/Library/MobileDevice/Provisioning Profiles目录。如果当前目录不存在则生成一个新目录。
5.
验证该配置文件的权利是否正确。为此,使用文本编辑器打开.mobileprovision文件。该文件的内容是一个XML的文本。查看在aps-environment键的位置的字典值。对于一个开发模式的配置文件,该值应该是development;而对应发布模式的配置文件,该字符值应该是production。
6.
在Xcode的Organizer窗口,查看Provisioning Profiles部分,并确认证书已经安装到你的设备上面。
当你编译该工程的时候,二进制文件现在使用证书的私有密钥签名。
4.2.3
安装SSL证书和密钥到你的服务器上面
你必须安装SSL发布证书和你之前获取的私有加密密钥到需要运行提供者代码的服务器上,从该服务器连接到APNs的沙箱或产品环境。为此,需要完成以下步骤:
1.
打开Keychain Access实体并单击左边面板的My Certificates类别。
2.
找到你将要安装的证书,并打开相应内容。
你将会看到证书和私有密钥。
3.
选中证书和密钥,选中File > Export Items,并把它们导出个人信息交换文件(.p12)。
4.
如果服务器采用Buby或Perl语言来实现的话,那么它们更容易处理个人信息交换格式的文件。为了把证书转换为该格式,需要完成以下步骤:
a)
在Keychain Access里面,选中相应证书并选择File > Export Items。选择个人信息交换格式选项(.p12)。选择一个保存地址,并单击Save按钮。
b)
加载终端应用,并输入如下的命令:
openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes
5.
拷贝.pem证书文件到新的电脑并安装它到合适的地方。
这次准备工作已经完成了。
下面是客户端的步骤了
一个应用程序必须在设备(iOS设备或Mac电脑)上面注册了苹果推送通知服务才能接收来自程序提供者的远程通知。
注册过程包含以下三个步骤:
一个应用程序必须在设备(iOS设备或Mac电脑)上面注册了苹果推送通知服务才能接收来自程序提供者的远程通知。
注册过程包含以下三个步骤:
1.
程序调用registerForRemoteNotificationTypes:方法。
2.
委托实现application:didRegisterForRemoteNotificationsWithDeviceToken:方法来接收设备令牌。
3.
把设备令牌作为非对象(二进制值)传递给程序提供者。

1.
程序调用registerForRemoteNotificationTypes:方法。
2.
委托实现application:didRegisterForRemoteNotificationsWithDeviceToken:方法来接收设备令牌。
3.
把设备令牌作为非对象(二进制值)传递给程序提供者。
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  • {  
  •     self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];  
  •     // Override point for customization after application launch.  
  •     self.viewController = [[[ViewController alloc] init] autorelease];  
  •     self.window.rootViewController = self.viewController;  
  •     [self.window setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]]];  
  •     [self.window makeKeyAndVisible];  
  •     /** 注册推送通知功能, */ 
  •     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];  
  •       
  •     //判断程序是不是由推送服务完成的  
  •     if (launchOptions) {  
  •         NSDictionary* pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];  
  •         if (pushNotificationKey) {  
  •             UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"推送通知"   
  •                                                            message:@"这是通过推送窗口启动的程序,你可以在这里处理推送内容" 
  •                                                           delegate:nil   
  •                                                  cancelButtonTitle:@"知道了"   
  •                                                  otherButtonTitles:nil, nil];  
  •             [alert show];  
  •             [alert release];  
  •         }  
  •     }  
  •     return YES;  
  • }  

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

  •     NSString* token = [NSString stringWithFormat:@"%@",deviceToken];  
  •     NSLog(@"apns -> 生成的devToken:%@", token);  
  •     //把deviceToken发送到我们的推送服务器  
  •     DeviceSender* sender = [[[DeviceSender alloc]initWithDelegate:self ]autorelease];  
  •     [sender sendDeviceToPushServer:token ];      
  • }  

 

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {  

 

  •     NSLog(@"apns -> 注册推送功能时发生错误, 错误信息:\n %@", err);  
  • }

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

  • {  
  •     NSLog(@"\napns -> didReceiveRemoteNotification,Receive Data:\n%@", userInfo);  
  •     //把icon上的标记数字设置为0,  
  •     application.applicationIconBadgeNumber = 0;  
  •     if ([[userInfo objectForKey:@"aps"] objectForKey:@"alert"]!=NULL) {  
  •         UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"**推送消息**" 
  •                                                         message:[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]  
  •                                                        delegate:self  
  •                                               cancelButtonTitle:@"关闭" 
  •                                               otherButtonTitles:@"处理推送内容",nil];  
  •         alert.tag = alert_tag_push;  
  •         [alert show];  
  •     }  
  • }  
VB6.0 与 VS2010 在VB编程上的区别小总结 这段时间相信大家已经慢慢习惯使用VB6.0来制作各自的小程序了,不过除了VB6.0以外,VS2008和VS2010都可以进行VB程序设计,这一点想必没有太多同学去关注。        其实发现这个也纯属巧合,因为笔记本重装系统之后程序不全,而我有急着编程,所以就准备用家里的电脑写程序。之后才发现家里一直都没有安装VB6.0,而且网络也不甚通畅,所以只能用VS2010碰碰运气,好运的是VS2010 阅读详情

相关推荐

VB6.0和VB.NET区别

学习了一段时间的VB.net,感觉大部分和之前学过的VB形似,但是因为名字不一样,所以肯定就有不同的地方,接下来说说VB和VB.net有哪些不同的地方。 VB.net是推出的一种开发基于.net平台应用程序的开发语言。掌握VB.net不仅要掌握语法,还要理解并运用这些新的概念,功能和观点,还有掌握.net框架。理解CLR(common language runtime,通用语言进行时)。 接下

张旭 廊坊师范学院信息技术提高班 十二期 4823

win 7 解除远程桌面多用户同时连接(会话)数限制

由于 Windows XP/Vista 的许可限制,在一台电脑上同一时间只允许一个用户登录(会话)。 如果有第二个用户通过远程桌面服务登录本机,那么在此之前本地已登录的用户、或远程已登录的用户将被踢出。 本补丁的功能就是去除这个限制,允许多人多用户同时并行访问登录XP/Vista,拥有一个终端服务器的功能。

VB.NET与VB6.0区别初认识

VB.NET看完曹祖圣老师的视频,一口的台湾话,连PPT都不是简体中文的,听起来颇有意思。(.NET说是当内,第一次还想什么是当内呢。哈哈)不过话又说回来,这套视频和平常的视频不太一样,好像是对VB.NET有了一些了解之后在做的一些介绍。         课程:

吴零敏 8609

本机使用远程被阻止

本机使用远程被阻止

知行合一 2054

VB6和VB.NET中对光标的编程

在VB6中利用API对光标进行编程:Option ExplicitPrivate Type POINTAPI X As Long Y As LongEnd TypePrivate Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Declare

李洪根的blog-专注软件开发技术 6247

vb SkinH_VB6.dll

MsgBox "未能保存相关数据,请与开发商联系[ErrorMsg:SaveSkinFileError]!", vbInformation, "小贝壳提醒您:"MsgBox "未找到相关的皮肤文件!" & Err.Number & Err.Description, vbInformation, "小贝壳提醒您:"五、打开"开始-运行-输入regsvr32 SkinH_VB6.dll",回车即可解决。希望脚本之家为您提供的SkinH_VB6.dll对您有所帮助。

1114

限制一个远程会话的用户(可用两种方法实现)

限制到远程会话的用户 使用组策略(最佳操作)  使用终端服务配置  使用组策略(最佳操作) 打开“组策略”。 在“计算机配置”、“管理模板”、“Windows 组件”、“终端服务”中,双击“限制终端服务用户到一个远程会话”设置。  单击“已启用”,然后单击“确定”。  要点 在将对组策略设置的更改应用到用户或计算机之前,应对任

flybird77的专栏 2622

如何用VB6.0编写一个用户登录系统

工具/原料电脑VB6.0软件(没有的就去去下载一个)方法/步骤    进入VB6.0软件,双击“标准EXE”显示的页面如图。预设正确的用户名和密码为cxywlq和701213。    先从控件栏选择标签控件在form1窗体的相应位置画两个大小适合的标签,再从控件栏选择文本框控件在form1窗体的相应位置画两个大小适合的文本框,然后再从控件栏选择按钮控件在fo...

weixin_44509155的博客 5604

IOS推送详解

一.关于推送通知   推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的。一般说来,当要显示消息或下载数据的时候,通知是由远程服务器(程序的提供者)发送,然后通过苹果的推送通知服务(Apple Push Notification Service,简称apns)推送到设备的程序上。 推送...

weixin_33762321的博客 293

VB6多线程探秘

VB6稳定多线程,一直是争论很大的的。 比较稳定的多线程,一般使用 set MT=CreateObject("VbMT.MT") 但其他单元线程之间,是无法访问的,只有在创建者中,才可使用该对象MT.   还有一个问题,如果设置单元线程停止,一般通过设置属性,比如MT.bStop=True,设停止参数, 然后再单元线程中通过检测bStop而退出的。 但问题来了,如果单元线程挂起,通过

test2002的专栏 6819

Vb.NET与VB6.0的区别

Visual Basic .NET是Microsoft Visual Studio .NET套件中主要组成部分之一。.NET版本的Visual Basic增加了更多特性,而且演化为完全面向对象(就像C++)的编程语言。 1.什么是VB.NET     Microsoft推出全新的编程和操作系统Framework——.NET,支持多种语言利用公共.NET库开发应用程序,这些应用程序在.NET

张晓 2189

使用vb 6和vb.net为Office应用添加工具栏和按钮

使用vb 6和vb.net为Office应用添加工具栏和按钮在Office应用中,有可我们可能需要利用word进行一系列的操作,比如执行一段宏,通过点击一个工具栏按钮执行宏的代码段,下面的实例正是为office应用添加一个工具栏和按钮,类似可应用到excel和aceess等Office应用程序。 1.         在VB6中的应用:在VB6中引用Micosoft Word X.

李洪根的blog-专注软件开发技术 4699

看实例学VB6.0

  一、熟悉VB 6.0的编程环境  二、掌握VB常用控件的使用方法  三、试着开发简单的VB应用程序--看实例学VB 6.0--认识一下VB 6.0的编程环境--  VB6.0采用可视化的编程环境,它好学易用,运行VB6.0后,会出现如下图所示的窗口,呵呵,看起来蛮复杂的,好多的按钮、菜单、小窗口,别担心,待会儿我们会一起学习这些东东都是干什么用的。  先来解决一个小

多木要多多多木 1万+

在VB6中用CopyMemory拷贝字符串的种种猫腻(一)

版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明 作者:xixi 出处:http://blog.youkuaiyun.com/slowgrace/archive/2009/09/14/4549926.aspx本文来自此帖的冗长讨论,感谢Tiger_Zhao的全程指点和陈辉、阿勇、马云剑等很多朋友的热心参与。本文其他部分在:(二)、(三)、(四)。话说VB6是个很认

9723

直接在Windows7,Windows10,Windows11 x64位系统上安装、运行VB6.0+CodeSMART图示教程

直接在windows10、windows11 64位系统上安装vb6.0图标教程

xzbyw的博客 7311

VB.NET与VB6的主要区别和迁移注意事项

VB.NET与VB6(Visual Basic 6.0)的主要区别体现在多个方面,包括语言结构、类型系统、运行时环境、面向对象编程的支持、Unicode支持、内存管理以及集成开发环境(IDE)等。

2402_84885073的博客 1466

Vb6.0版StringBuilder

自动换行 【由 孤帆代码着色器1.1.0.0 着色】 孤帆Blog 前几个星期简单的研究了一下.net的StringBulider类.确实是一个很好的思想,用vb6.0实现了一下她的基本功能.写了3个版本2个自己分配内存版一个现在这个东西,经过多次的测试发现还是由vb6.0的功能来分配内存的效率还是比较高而且比较安全. OK!现在说说.net的StringBulider类的核心思想

孤帆的专栏 7689

vb6调用webservice

引用控件msxml6.dll Private Sub doReadDataPost() '????soap??? ????????????webservice???ù????á??????????soap12:Body Dim strtest, strxml As String On Error GoTo Z strtest = "<?xml version=""1.0"" encoding=""utf-8""?> " strtest =

zhu2017的博客 1763
上一篇: Java获取当前时间
下一篇: getRequestDispatcher()与sendRedirect()的区别
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值