- 浏览: 3011937 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (893)
- android (110)
- iphone (198)
- java (79)
- JavaScript手册-目录 (9)
- JavaScript手册-Array (19)
- JavaScript手册-Boolean (5)
- JavaScript手册-Date (50)
- JavaScript手册-Math (30)
- JavaScript手册-Number (14)
- JavaScript手册-RegExp (7)
- JavaScript手册-String (38)
- JavaScript手册-全局函数 (8)
- JavaScript实用脚本 (7)
- Others (21)
- java-jpcap (7)
- java-thread (1)
- ibm文章 (3)
- classloader (2)
- java-filter (2)
- 运行环境 (33)
- java-正则 (2)
- oracle (1)
- linux-shell (26)
- wap (1)
- sqlite (3)
- wow (1)
- jvm (1)
- git (5)
- unity3d (29)
- iap (2)
- mysql (23)
- nginx (14)
- tomcat (9)
- apache (2)
- php (1)
- ubuntu (40)
- rsa (1)
- golang (21)
- appstore (5)
- sftp (2)
- log4j (2)
- netty (18)
- 测试工具 (6)
- memcache (5)
- 设计模式 (1)
- centos (8)
- google_iab (5)
- iOS专题 (4)
- mac (10)
- 安装配置帮助手册 (2)
- im4java_graphicsmagick (5)
- inotify-tools (1)
- erlang (6)
- 微信支付 (1)
- redis (8)
- RabbitMQ (5)
最新评论
-
heng123:
Netty视频教程https://www.douban.com ...
netty4.0.23 初学的demo -
maotou1988:
使用Netty进行Android与Server端通信实现文字发 ...
netty4.0.23 初学的demo -
码革裹尸:
非常感谢,正好用上
android 呼入电话的监听(来电监听) -
rigou:
提示的/222.177.4.242 无法链接到ip地址,是什 ...
通过 itms:services://? 在线安装ipa ,跨过app-store -
duwanbo:
GridView与数据绑定
iPhone推送通知功能分析总结
转载自: http://mtoou.info/iphone-tuisong/
图中,Provider是指某个iPhone软件的Push服务器。APNS是Apple Push Notification Service(Apple Push服务器)的缩写。
整个过程可以分为三个阶段:
- 第一阶段:Push服务器把要发送的消息、目的iPhone的标识打包一个通知包,发给APNS。通知包使用JSON格式并且每一个通知包限定为256B,因此一个推送的信息是十分有限的。
- 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相同标识的iPhone,并把消息发到iPhone。
- 第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
多个供应商推送到多个设备的通知
准备:
要开始进行推送服务的开发,就必须访问苹果公司的iphone Developer Program门户。https://developer.apple.com/ios/my/overview/index.action 利用iPhone开发人员凭据登入以便访问此站点。在网站上,可以逐步了解创建一个新应用程序标识符的步骤,此标识符与推送服务相关。生成一个应用程序标识符。
生成一个应用程序标识符
在开发人员门户网站上,单击App IDs,这是打开一个允许创建应用程序标识符的页面。每项推送服务都基于一个独立的标识符,所以必须创建一个标识符并设为允许远程通知。推送服务应用程序不能使用通配符标识符,每个启动了推送服务的应用程序都要求有一个唯一的标识符。生成SSL证书。
生成SSL证书
developer,用于测试 production,用于产品 如果是内部测试,使用developer方式即可。推送服务特有的准备文件。
启用了推送服务的应用程序不能用通配符作为准备文件,必须为该应用程序创建一个单独的准备文件。
注册应用程序
利用一个兼容推送服务的移动准备文件来签署应用程序只是使用推送通知的第一步。该应用程序必须利用iphone的远程通知系统来请求注册自己。使用一个单独的UIApplication调用就可以完成。
[[UIApplication sharedApplication]registerForRemoteNotificationTypes:types]
此调用告知iphone OS,该应用程序要接受推送消息。Types指定应用程序将接受的通知警告类型。iphone提供三种类型:UIRemoteNotificationTypeBadge、UIRemoteNotificationTypeSound和UIRemoteNotificationTypeAlert。
选择要使用的类型,通过|一起使用它们:
types = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert;
通过[[UIApplication sharedApplication] unregisterForRemoteNotifications] 来取消注册。
检索设备令牌:
只有应用程序生成一个设备令牌并将其发送到服务器之后才能接受推送消息。应用程序必须将设备令牌发送到推送实际通知的外设备。
一个令牌与一个设备关联。它与SSL证书结合使用来唯一标识iPhone,并且可以用来将消息发送回相关手机。形式如下:
deviceToken = @"8baa53ca 210fc48d e339f80a 2672e58f 4f86f87f 73695797 b43cde969dffe954";
设备令牌是作为注册的副产品而创建的。接受到注册请求之后,iPhone OS使用一个SSL请求立刻联络APNS。因此要连接因特网,如果没有连接,则注册失败。Iphone将请求转发到APNS并等待返回一个设备令牌。
APNS构建设备令牌并将它返回到iPhone OS,有iphone OS通过应用程序委托回调:
-(void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken。
有时,APNS不能创建令牌或设备不能发送请求。通过
-(void)application:(UIApplication *)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *)error来处理请求错误。
相应通知:
iPhone使用一系列操作来响应推送通知。当应用程序正在运行时,通知将被直接发送到-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 方法。以JSON格式发送的有效内容将被自动转为NSDictionary,应用程序可以根据需要任意使用有效内容中的信息。当应用程序运行时,不再调用声音、标志或警告。
当应用程序未运行时,iphone执行通知。当警告框出现时,用户可以选择Close关闭这个警告框,也可以选择View启动应用程序。启动后,依然通过-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo的方法回调通知信息。
推送服务器
Provider以一种异步的二进制接口与APNS沟通,这种接口对于Provider来说的高速,高容量的,他使用TCP socket流。
发布的接口是通过访问:gateway.push.apple.com, port 2195。
开发的接口是通过访问:gateway.sandbox.push.apple.com, port 2195
对于每一个接口,你应该使用TLS(或SSL)建立安全通信通道。这些连接所需的SSL证书就是在准备工作中所生成的SSL证书 (如果服务器是运行在MacOS X)。
因此,最简单的provider实现,其实就是通过证书,和苹果服务器建立安全连接(tsl或ssl),通过认证建立连接后,provider将token号、通知内容、通知形式(比如是否弹出提示 窗口、是否发声等)发送给苹果的服务器(apns)。
The Notification Payload格式:
{"aps" : { "alert" : { "body" : "Bob wants toplay poker" }, "badge" : 5, "sound" :"bingbong.aiff"}, "acme1" : "bar", "acme2" : ["bang", "whiz" ] }
通知格式
- (IBAction)push:(id)sender { if(self.certificate == nil) { return; } if(self.deviceToken == nil || self.payload == nil) { return; } NSMutableData *deviceToken = [NSMutableData data]; unsigned value; NSScanner *scanner = [NSScanner scannerWithString:self.deviceToken]; while(![scanner isAtEnd]) { [scannerscanHexInt:&value]; value= htonl(value); [deviceTokenappendBytes:&value length:sizeof(value)]; } char *deviceTokenBinary = (char *)[deviceToken bytes]; char *payloadBinary = (char *)[self.payload UTF8String]; size_t payloadLength = strlen(payloadBinary); uint8_t command = 1; /* command number */ char binaryMessageBuff[sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint16_t) + 32 + sizeof(uint16_t) + payloadLength]; char *binaryMessagePt = binaryMessageBuff; uint32_twhicheverOrderIWantToGetBackInAErrorResponse_ID = 1234; uint32_t networkOrderExpiryEpochUTC = htonl(time(NULL)+86400); // expire message if not delivered in 1 day uint16_t networkOrderTokenLength = htons(32); uint16_t networkOrderPayloadLength = htons(payloadLength); /* command */ *binaryMessagePt++ = command; /* provider preference ordered ID */ memcpy(binaryMessagePt,&whicheverOrderIWantToGetBackInAErrorResponse_ID, sizeof(uint32_t)); binaryMessagePt += sizeof(uint32_t); /* expiry date network order */ memcpy(binaryMessagePt,&networkOrderExpiryEpochUTC, sizeof(uint32_t)); binaryMessagePt += sizeof(uint32_t); /* token length network order */ memcpy(binaryMessagePt,&networkOrderTokenLength, sizeof(uint16_t)); binaryMessagePt += sizeof(uint16_t); /* device token */ memcpy(binaryMessagePt, deviceTokenBinary, 32); binaryMessagePt += 32; /* payload length network order */ memcpy(binaryMessagePt,&networkOrderPayloadLength, sizeof(uint16_t)); binaryMessagePt += sizeof(uint16_t); /* payload */ memcpy(binaryMessagePt, payloadBinary,payloadLength); binaryMessagePt += payloadLength; size_t processed = 0; OSStatus result = SSLWrite(context, binaryMessageBuff,(binaryMessagePt - binaryMessageBuff),&processed) > 0; NSLog(@"SSLWrite(): %d %d", result, processed); }
推送的局限性:推送通知不是都是可靠的,苹果公司不保证传送每个通知以及通知到达的顺序。
反馈服务
苹果公司的反馈服务会报告通知的失败。
发布的接口是通过访问:feedback.push.apple.com, port2196。
开发的接口是通过访问:feedback.sandbox.push.apple.com, port2196。
注:Provider要反复监测苹果的反馈服务,来确保不向已经不存在的设备发送推送通知。
发表评论
-
iOS程序运行生命周期
2015-11-10 09:05 1016iOS程序运行生命周期 在文件AppDele ... -
iOS开发系列--IOS程序开发概览
2015-11-10 07:32 1229iOS开发系列--IOS程序开发概览 概览 ... -
2015年11月Xcode7.1(7B91b)打包发布苹果iOS应用指南
2015-11-09 18:29 109842015年11月Xcode7.1(7B91b) ... -
self.navigationController pushViewController执行不成功
2015-11-06 08:28 1717self.navigationControlle ... -
ios NSString format 保留小数点 float double
2015-11-05 17:37 2994ios NSString format 保留小数点 f ... -
自定义 URL Scheme 完全指南
2015-11-04 16:21 949自定义 URL Scheme 完全指南 转载 htt ... -
UIViewController生命周期方法viewDidLoad、viewWillAppear和viewDidAppear
2015-11-01 12:29 3016UIViewController生命周期 ... -
关于self.view.window与viewDidLoad、viewWillAppear、viewDidAppear
2015-11-01 09:36 2613关于self.view.window与viewD ... -
UIScreen学习记录
2015-10-31 08:18 1105UIScreen学习记录 转载自 ... -
使用NSTimer和CGAffineTransformMakeRotation实现旋转动画
2015-10-29 11:53 1906使用NSTimer和CGAffineTransform ... -
【原】iOSCoreAnimation动画系列教程(一):CABasicAnimation【包会】
2015-10-29 08:59 1076【原】iOSCoreAnimation动 ... -
iOS 在UILabel显示不同的字体和颜色
2015-10-27 08:07 1592在项目开发中,我们经常会遇到在这样一种情形:在一个UI ... -
UISlider滑动条的属性介绍以及于标签联合使用实时显示变动值
2015-10-27 08:06 1315UISlider滑动条的属性 ... -
关于使用DSLTableView下拉刷新数据遇到的问题
2015-10-23 21:17 998关于使用DSLTableView下 ... -
使用AdSupport.framework生成IDFA唯一标识符
2015-10-23 17:29 4770使用AdSupport.framework生成IDFA ... -
AppDelegate的详解
2015-10-22 17:51 731AppDelegate的详解 ... -
iOS开发问题集锦
2015-10-22 13:06 5651. Xcode开发连真机运行报错Please ver ... -
iOS 对象属性参数名定义的注意事项不能以alloc,new,copy,mutableCopy 作为开头命名
2015-10-21 15:41 1374property's synthesized g ... -
iOS-自定义的画圆或弧的UIView
2015-10-21 14:20 2705iOS-自定义的画圆或弧的UIView Cu ... -
iOS自定义的模态提示对话框
2015-10-20 14:27 6533iOS自定义的模态提示对话框 基本思路: 1.创建 ...
相关推荐
- 消息推送:利用苹果的推送服务(APNs)实现实时消息通知。 - 数据同步:通过网络API与后端服务器进行交互,保持数据的一致性。 #### 3.2 游戏应用开发 对于游戏应用而言,除了基本的UI设计和交互逻辑外,还需要考虑...
- **推送通知**:讲解推送通知的实现机制及注意事项。 5. **最佳实践** - **性能优化**:分享如何通过内存管理和代码优化来提升应用性能。 - **错误处理与调试**:介绍调试技巧,如使用 Xcode 的调试器等。 - ...
- **推送通知**:讲解如何配置和接收远程推送通知,增强应用的互动性。 #### 四、实战项目经验分享 - **实战案例**:通过分析真实的项目案例,帮助读者理解如何将理论知识应用于实际开发过程中。 - **常见问题及...
7. **推送通知** - **本地通知**:掌握本地通知的触发机制及使用方法。 - **远程推送**:了解远程推送服务的工作流程及如何在应用中实现。 8. **性能优化与调试技巧** - **Instruments工具**:介绍Instruments的...
本书对iPhone 3.0 SDK中的所有新增特性进行了详细介绍,包括多任务处理、推送通知、剪贴板支持等。这些特性极大地扩展了应用的功能性和实用性。 **3.2 实战案例分析** 为了帮助读者更好地理解和运用所学知识,本书...
为了让应用在后台也能与用户互动,iOS支持推送通知和本地通知。学习如何设置证书、集成Apple Push Notification service (APNs)以及在应用中处理通知事件,是提升用户体验的关键。 九、动画与过渡效果 iOS提供了...
除此之外,客户端的源码可能还包含了推送通知、后台任务、多线程等关键功能的实现。例如,使用Firebase Cloud Messaging(FCM)进行远程推送,使用OperationQueue或DispatchQueue进行异步任务调度,这些都是iOS开发...
- **推送通知**:讲解了如何实现推送通知功能,使得应用能够在后台向用户发送消息。 - **位置服务**:探讨了如何利用GPS等位置服务获取用户的地理位置信息,并将其应用于实际场景中。 - **社交媒体分享**:介绍了...
此外,可能还需要集成推送通知、地图服务等其他功能,这就需要熟悉Apple的相关服务和API。 总结,"ios应用源码之火车余票查询 for iPhone 2018128"这个项目涵盖了网络请求、UI设计、数据管理、性能优化等多个iOS...
为了让用户及时获取旅行相关的信息,"WorldTour"可能使用了本地通知或远程推送通知。这部分源码会展示如何集成UserNotifications框架,设置触发条件,并发送通知。 总结来说,通过对"WorldTour"源码的分析,开发者...
- **推送通知**:讲述了如何设置和接收远程推送通知。 - **地理位置服务**:介绍了如何使用定位API获取用户的地理位置信息。 #### 六、案例分析与实战演练 为了帮助读者更好地理解和运用所学知识,本书包含了一系列...
- **Apple推送通知服务** - **地图显示** - **后台应用程序的设计** ### 详细知识点解析 #### iOS 4编程简介 - **基础知识**: 本书首先介绍了iOS 4编程的基础知识,包括iOS 4的基本架构、特点以及为何选择iOS作为...
除了多任务,Cocoa Touch还支持触摸事件处理、动画、推送通知、地图服务、游戏引擎(如Game Kit)、社交媒体整合以及Core Data等数据持久化框架。这些特性使得开发者能够创建功能丰富、交互性强的应用,满足用户多样...
同时,支持订阅通知、推送消息,保持与用户的互动。 9. SEO优化:尽管是在微信内运行,但商城模板仍需考虑搜索引擎优化,以提高外部流量。合理的元信息设置、URL结构优化等都是提升搜索引擎排名的关键。 10. 安全...
此外,还支持短信群发、消息推送和通讯录资源共享,以增强团队协作。平台的安全性是关键,通常会采用数据加密、USB Key增强认证以及安全应用机制来保护敏感信息。 【产品资费与服务】 移动办公业务的费用主要分为...