消息通信机制NSNotificationCenter -备

时间:2022-12-09 07:45:23

消息通信机制NSNotificationCenter的学习。最近写程序需要用到这类,研究了下,现把成果和

NSNotificationCenter是专门供程序中不同类间的消息通信而设置的,使用起来极为方便,

长话短说。

设置通知,就是说要在什么地方(哪个类)接受通知,一般在初始化中做。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test:) name:@"test" object:nil];  
我仅对以上参数做以说明:addObserver 这个是观察者,就是说 在什么地方接收通知;

selector 这个是收到通知后,调用何种方法;

name: 这个是通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。

发送通知,就是说此时要调用观察者处的方法。

[[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:searchFriendArray]; 
我仅对以上参数做以说明:

postNotificationName:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。

object:传递的参数

发送通知时,默认调用test方法。

- (void) test:(NSNotification*) notification  
{  
searchFriendArrary = [notification object];//通过这个获取到传递的对象  
}

小结:关于详解iPhone开发之消息通信机制NSNotificationCenter的内容介绍我那了,希望通过本文的学习能对你有所帮助。

iOS push机制

iOS消息推送的工作机制可以简单的用下图来概括:
消息通信机制NSNotificationCenter -备

Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。

上图可以分为三个阶段:

第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。

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

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

消息通信机制NSNotificationCenter -备

从上图我们可以看到:

1、应用程序注册消息推送。

2、iOS从APNS Server获取device token,应用程序接收device token。

3、应用程序将device token发送给PUSH服务端程序。

4、服务端程序向APNS服务发送消息。

5、APNS服务将消息发送给iPhone应用程序。

无论是iPhone客户端和APNS,还是Provider和APNS,都需要通过证书进行连接。

下面我介绍一下几种用到的证书。

一、CSR文件

1、生成Certificate Signing Request(CSR)

 

消息通信机制NSNotificationCenter -备

2、填写你的邮箱和常用名称,并选择保存到硬盘。

消息通信机制NSNotificationCenter -备
点击继续:
消息通信机制NSNotificationCenter -备

这样就在本地生成了一个Push.certSigningRequest文件。

二、p12文件

1、导出密钥。

消息通信机制NSNotificationCenter -备

消息通信机制NSNotificationCenter -备

2、输入你的密码。
消息通信机制NSNotificationCenter -备
 

这样就生成了一个Push.p12文件。

三、SSL certificate文件

1、用你付过费的帐号登录到iOS Provisioning Portal,并新建一个App ID,这个过程可以参考:iOS应用的真机调试,这样就会生成下面这条记录:

 

消息通信机制NSNotificationCenter -备

 
2、点击右侧的Configure:
 
消息通信机制NSNotificationCenter -备
 
3、点击Development Push SSL Certificate一行后的Configure:
 
消息通信机制NSNotificationCenter -备
 
 
4、点击Continue
 
消息通信机制NSNotificationCenter -备

5、选择前面生成好的Push.certSigningRequest文件,点击Generate,出现如下所示的页面:

消息通信机制NSNotificationCenter -备
6、点击Continue:

消息通信机制NSNotificationCenter -备

7、点击Download,并将文件命名为aps_developer_identity.cer。

8、点击Done,你会发现状态变成了Enabled:

消息通信机制NSNotificationCenter -备

 

注意:有的App ID的Apple Push Notification service列是灰色的,并且不允许使用Configure按钮,这是因为APNS不支持带通配符的App ID。

到现在为止,我们已经生成了三个文件:

1、Push.certSigningRequest

2、Push.p12

3、aps_developer_identity.cer

在项目的AppDelegate中的didFinishLaunchingWithOptions方法中加入下面的代码:

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

通过registerForRemoteNotificationTypes方法,告诉应用程序,能接受push来的通知。

在项目的AppDelegate中添加下面的方法来获取deviceToken:

  1. - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  2. NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
  3. NSLog(@"My token is:%@", token);
  4. // 把token发送给服务器保存起来

    //NSLog(@"Did register for remote notifications: %@", deviceToken);

    //ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:HX_API_PUSH]];

    //NSLog(@"%@", [request url]);

    //[request setPostValue:[self hexToken:deviceToken] forKey:@"token"];

    //[request setPostValue:@"com.chinaamc.hxjjhd" forKey:@"app"];

    //[request setPostValue:@"0" forKey:@"unread"];

    //NSString * appversion =[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];//版本号

    //[request setPostValue:appversion forKey:@"userid"];

    //[request setDelegate:self];

    //[request setDidFinishSelector:@selector(requestDidFinishPush:)];

    //[request setDidFailSelector:@selector(requestDidFailPush:)];

    //[request startAsynchronous];

  1. }
  2. - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
  3. NSString *error_str = [NSString stringWithFormat: @"%@", error];
  4. NSLog(@"Failed to get token, error:%@", error_str);
  5. }

获取到的deviceToken,我们可以提交给后台应用程序,发送通知的后台应用程序除了需要知道deviceToken之外,还需要一个与APNS连接的证书。

这个证书可以通过我们前面生成的两个文件中得到。

1、将aps_developer_identity.cer转换成aps_developer_identity.pem格式

  1. openssl x509 -in aps_developer_identity.cer -inform DER -out aps_developer_identity.pem -outform PEM

2、将p12格式的私钥转换成pem

  1. openssl pkcs12 -nocerts -out Push_Noenc.pem -in Push.p12

3、创建p12文件

  1. openssl pkcs12 -export -in aps_developer_identity.pem -inkey Push_Noenc.pem -certfile Push.certSigningRequest -name "aps_developer_identity" -out aps_developer_identity.p12

这样我们就得到了在.net或java等后台应用程序中使用的证书文件:aps_developer_identity.p12

如果后台应用是php的话,那么可以按照iOS消息推送机制中pem文件的生成这篇文章中的方法来生成php后台应用程序中使用的证书文件:ck.pem

注意:有的App ID的Apple Push Notification service列是灰色的,并且不允许使用Configure按钮,这是因为APNS不支持带通配符的App ID。

到现在为止,我们已经生成了三个文件:

1、Push.certSigningRequest

2、Push.p12

3、aps_developer_identity.cer

在项目的AppDelegate中的didFinishLaunchingWithOptions方法中加入下面的代码:

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

通过registerForRemoteNotificationTypes方法,告诉应用程序,能接受push来的通知。

在项目的AppDelegate中添加下面的方法来获取deviceToken:

  1. - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  2. NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
  3. NSLog(@"My token is:%@", token);
  4. }
  5. - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
  6. NSString *error_str = [NSString stringWithFormat: @"%@", error];
  7. NSLog(@"Failed to get token, error:%@", error_str);
  8. }

获取到的deviceToken,我们可以提交给后台应用程序,发送通知的后台应用程序除了需要知道deviceToken之外,还需要一个与APNS连接的证书。

这个证书可以通过我们前面生成的两个文件中得到。

1、将aps_developer_identity.cer转换成aps_developer_identity.pem格式

  1. openssl x509 -in aps_developer_identity.cer -inform DER -out aps_developer_identity.pem -outform PEM

2、将p12格式的私钥转换成pem

  1. openssl pkcs12 -nocerts -out Push_Noenc.pem -in Push.p12

3、创建p12文件

  1. openssl pkcs12 -export -in aps_developer_identity.pem -inkey Push_Noenc.pem -certfile Push.certSigningRequest -name "aps_developer_identity" -out aps_developer_identity.p12

这样我们就得到了在.net或java等后台应用程序中使用的证书文件:aps_developer_identity.p12

如果后台应用是php的话,那么可以按照iOS消息推送机制中pem文件的生成这篇文章中的方法来生成php后台应用程序中使用的证书文件:ck.pem

消息通信机制NSNotificationCenter -备的更多相关文章

  1. Python并发编程之线程消息通信机制任务协调(四)

    大家好,并发编程 进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 . 前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程 ...

  2. NSNotificationCenter消息通信机制

    作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息 [[NSNotificationCenter defaultCenter] ...

  3. 【单页应用之通信机制】view之间应该如何通信

    前言 在单页应用中,view与view之间的通信机制一直是一个重点,因为单页应用的所有操作以及状态管理全部发生在一个页面上 没有很好的组织的话很容易就乱了,就算表面上看起来没有问题,事实上会有各种隐忧 ...

  4. Android 消息队列机制

    在非UI线程使用Handler进行线程通信时,一般都需要进行3个步骤: 创建Looper Looper.prepar() 创建Handler 启动消息循环Looper.loop() 通过这3步,基本就 ...

  5. 浅议NetMQ常见模式和消息加密机制

    浅议NetMQ常见模式和消息加密机制 概述 在传统企业级开发中,消息队列机制已经成为一种非常常见的技术实现手段,而基于NetMQ则看起来有点像一朵"奇葩",看起来从名字似乎是一个消 ...

  6. IOS 消息机制(NSNotificationCenter)

    消息机制 NSNotificationCenter 一直都在频繁使用,但是却对其原理不是十分了解.今天就花些时间,把消息机制原理重头到尾好好过一遍. iOS 提供了一种 "同步的" ...

  7. iOS开发-消息通知机制(NSNotification和NSNotificationCenter)

    iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多,类之间的传值用到的比较多,不过委托相对来说只能是一对一,比如说页面A跳转到页面B,页面的B的值改变要映射到页 ...

  8. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  9. NSNotificationCenter消息通信&lpar;KVO&rpar;

    NSNotificationCenter是程序不同类间的消息通信. 注册消息通知: [[NSNotificationCenter defaultCenter]addObserver:self sele ...

随机推荐

  1. gulp-babel使用

    各大浏览器厂商对es2015功能支持不完全,等到全部支持会等很长时间,如果现在使用es2015,可以选择babel一个将ES6/ES7写的代码转换为ES5代码的编译器. 我们选择使用gulp自动化编译 ...

  2. ifdown eth0 &amp&semi;&amp&semi; idup eth0 ifdown --exclude&equals;l0 -a &amp&semi;&amp&semi; ifup --exclude&equals;lo -a

  3. ASP&period;NET Web API 实例

    ASP.NET Web API 入门大杂烩 创建Web API解决方案,命名为VCoinWebApi,并且创建了同名的Project,然后,创建一个Empty Project:Models,创建一个W ...

  4. pytest生成测试报告-4种方法

    1.生成resultlog文件 2.生成JunitXML文件 3.生成html测试报告 > pip install pytest-html     # 通过pip安装pytest-html 4. ...

  5. SpringBoot入门教程&lpar;十七&rpar;&commat;Service、&commat;Controller、&commat;Repository、&commat;Component

    spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring ...

  6. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V4 -- 粘包拆包

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- new LengthFieldPrepender(2) : 设置数据包 2 字节的特征码 new LengthFieldB ...

  7. Android sdk安装目录中没有platform-tools目录问题详解

    sdk下载地址 http://tools.android-studio.org/index.php/sdk 安装步骤很简单,百度即可. 下面详细说一下,在安装中遇到android sdk下没有plat ...

  8. openwrt下使用wget出现Failed to allocate uclient context

    一.场景重现 root@OpenWrt:/# wget www.baidu.com Downloading 'www.baidu.com' Failed to allocate uclient con ...

  9. Eclipse apk 签名

    Eclipse apk 签名 project>right mouse click>android tool>Export signed Application package cre ...

  10. 调用阿里云API 的demo示例(java&sol;python)

    Java 示例 // 创建DefaultAcsClient实例并初始化 DefaultProfile profile = DefaultProfile.getProfile(vo.getAliRegi ...