您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > IOS

iOS系统的底层通知框架库

时间:2019-05-16 14:02:49  来源:  作者:

观察者模式

观察者模式是一种用于解耦一系列需要相互协作的类之间进行通信的对象行为模式。它定义了对象之间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。观察者模式的实现一般分为两个步骤:消费者注册通知消息监听器、生产者发送通知消息。

IOS系统提供了多种对观察者模式的实现:在Cocoa Touch层通过NSNotification类和NSNotificationCenter类来实现通知消息的注册处理和发送,而在CoreFoundation层则提供了CFNotificationXXX系列的C函数来实现通知消息的注册处理和发送,而在操作系统层面则通过libsystem_notify.dylib库提供了一套基于C语言的更加底层的通知消息注册和发送机制。

iOS系统的底层通知框架库

本文将重点介绍libsystem_notify.dylib(以后简称为系统通知库)库中所提供用于实现通知消息注册和通知消息发送的各种接口函数。系统通知库中的通知消息注册和发送是可以用来实现跨进程通信的一种底层的通知机制。

系统通知库的API

系统通知库中的所有函数都在notify.h文件中被声明,因此当你要使用系统通知库提供的函数时,需要在代码中#include 。正如其它所有基于通知消息的实现一样,每一种通知消息都通过一个字符串来进行标识,系统通知库中的通知消息也是如此。除此之外每个进程注册监听了一个通知消息时还会生成一个进程内有效的通知消息标识token。可以将token理解为进程在运行时对某个监听的通知消息的唯一表征。系统通知库在处理通知消息时分别提供了: 基于block的处理器、基于mach port的消息端口、基于信号的处理、基于文件操作的处理器一共四种处理方式。

一、通知消息的注册

系统通知库为支持上述四种消息处理机制,分别提供四个函数来实现各种处理类型的通知消息的注册:


 
  1. //基于block处理的通知注册 
  2. uint32_t notify_register_dispatch(const char *name, int *out_token, dispatch_queue_t queue, notify_handler_t handler) 
  3.  
  4. //基于信号处理的通知注册 
  5. uint32_t notify_register_signal(const char *name, int sig, int *out_token); 
  6.  
  7. //基于mach port消息的通知注册 
  8. uint32_t notify_register_mach_port(const char *name, mach_port_t *notify_port, int flags, int *out_token); 
  9.  
  10. //基于文件描述符的通知注册。 
  11. uint32_t notify_register_file_descriptor(const char *name, int *notify_fd, int flags, int *out_token); 

上述的四个函数可以看出,每个函数的第一个参数都是通知消息的名称,也就是我们想要监听的通知消息名称,并且每个函数都有一个out_token输出,用来标识进程在运行时注册的这个通知消息。对于block处理器而言,每次监听的通知被触发时总会在某个指定的queue中调用指定的block函数;对于signal而言,每次监听的通知被触发时总是会向系统发出指定的信号;对于mach port而言,每次监听的通知被触发时总是会往指定的mach port端口发送一条空的mach msg消息;对于文件描述符而言,每次监听的通知被触发时总是会往指定的文件中写入特定的内容。

  • 系统通知库不仅支持iOS系统还支持macOS系统,而且是跨进程的通知消息。但是一般情况下iOS系统只会用notify_register_dispatch函数来监听通知并通过block的方式进行处理,而macOS系统则所有的处理方式都可用。

二、通知消息的发送

当某个通知消息产生时,需要将通知消息发送给所有的监听者。通知消息的发送是通过函数notify_post来实现的:

  1. uint32_t notify_post(const char *name); 

函数的签名很简单,入参就是通知消息名称。系统通知函数中的通知不会附带任何的附加参数。
 

三、通知消息监听者的暂停、恢复、取消

当注册某个通知消息时,系统会返回一个token值来标识这个通知信息。同时系统还分别提供了对通知消息监听的暂停、恢复、和取消处理:
 

  1. //通知的暂停,设置后此token将暂时不会接受消息的通知。 
  2. uint32_t notify_suspend(int token) 
  3. //通知的恢复,设置后此token将恢复接受消息的通知。 
  4. uint32_t notify_resume(int token) 
  5. //通知的取消,设置后此token将不再接受消息的通知。 
  6. uint32_t notify_cancel(int token); 


四、通知消息发送检测

有的时候我们并不想注册某个通知消息处理器来对通知进行处理,而只是想检测某个通知消息是否已经被发送过,为此系统提供两个函数来实现这功能:


 
  1. //注册一个通知消息检测的token。 
  2.  uint32_t notify_register_check(const char *name, int *out_token); 
  3. //检测这个token所对应的通知消息是否被发送过。如果通知消息被发送过则check返回1,否则返回0。 
  4.  uint32_t notify_check(int token, int *check); 


五、通知消息的状态

对于通知消息的监听者来说,我们可以对返回的token绑定一个64位的状态数据。我们可以获取以及设置它。这个状态数据主要用来实现对通知监听者的扩展处理。

  1. uint32_t notify_set_state(int token, uint64_t state64) 
  2. uint32_t notify_get_state(int token, uint64_t *state64) 


六、系统预置的通知消息

操作系统底层支持了一些预置的通知消息,这些通知消息在头文件notify_keys.h中被声明。这些预置的消息有针对目录服务的、有针对磁盘空间和卷挂起的、有针对网络配置改变的、有针对写日志通知的、有针对系统时区和时间改变的。每种具体的通知消息可以看文件中的说明,比如下面的例子实现对了对磁盘空间不足,网络状态改变以及对调整了系统的时间进行的监听处理:


 
  1. #include <notify.h> 
  2. #include <notify_keys.h> 
  3.  
  4. void foo() 
  5.    int  token1, token2, token3; 
  6.     //注册监听网络状态改变的通知。 
  7.    notify_register_dispatch(kNotifySCNetworkChange, & token1, dispatch_get_main_queue(), ^(int token) { 
  8.         //... 
  9.     }); 
  10.      
  11.       
  12.     //注册监听系统磁盘空间不足的通知 
  13.     notify_register_dispatch(kNotifyVFSLowDiskSpaceRootFS, &token2, dispatch_get_main_queue(), ^(int token) { 
  14.         //.... 
  15.     }); 
  16.    
  17.      
  18.    //注册监听系统时间被改变的通知。 
  19.     notify_register_dispatch(kNotifyClockSet, &token3, dispatch_get_main_queue(), ^(int token) { 
  20.         //... 
  21.     }); 
  22.      

除了notify_keys.h文件中公开的通知消息外,还有一些未被公开的通知消息,我们可以通过这些未被公开的消息来获取更多关于系统状态的改变,下面的列表将列出所有的系统底层的通知消息,具体每个通知是什么意义就读者自行猜测和验证吧。


 
  1. "com.Apple.asl.remote" 
  2. "com.apple.system.timezone" 
  3. "com.apple.MCX._managementStatusChangedForDomains" 
  4. "com.apple.CFPreferences._domainsChangedExternally" 
  5. "com.apple.system.clock_set" 
  6. "com.apple.system.timezone" 
  7. "AppleNumberPreferencesChangedNotification" 
  8. "AppleTimePreferencesChangedNotification" 
  9. "AppleDatePreferencesChangedNotification" 
  10. "AppleLanguagePreferencesChangedNotification" 
  11. "AppleTextBehaviorPreferencesChangedNotification" 
  12. "com.apple.librarian.account-token-changed" 
  13. "com.apple.system.batterysavermode" 
  14. "com.apple.accessibility.cache.forcetouch.sensitivity.changed" 
  15. "com.apple.networkd.started" 
  16. "com.apple.neconfigurationchanged" 
  17. "com.apple.networkd.settings" 
  18. "com.apple.system.config.network_change" 
  19. "com.apple.CoreAnimation.CAwindowserver.DisplayChanged" 
  20. "com.apple.networkd.proxy_count" 
  21. "com.apple.iohideventsystem.available" 
  22. "com.apple.backboardd.rawOrientation" 
  23. "com.apple.springboard.hasBlankedScreen" 
  24. "UIBacklightLevelChangedNotification" 
  25. "com.apple.accessibility.wob.status" 
  26. "com.apple.backboardd.videosettingschanged" 
  27. "com.apple.mobile.keybagd.user_changed" 
  28. "com.apple.LaunchServices.database" 
  29. "com.apple.accessibility.cache.enhance.text.legibility" 
  30. "com.apple.frontboard.systemappservices.serverNotifyToken" 
  31. "com.apple.frontboard.workspace.serverNotifyToken" 
  32. "com.apple.accessibility.cache.captioning" 
  33. "com.apple.accessibility.cache.vot" 
  34. "com.apple.accessibility.cache.ax" 
  35. "com.apple.accessibility.cache.app.ax" 
  36. "com.apple.accessibility.status" 
  37. "com.apple.language.changed" 
  38. "com.apple.springboard.showingAlertItem" 
  39. "com.apple.mobile.keybagd.lock_status" 
  40. "NameLayerTree" 
  41. "ApplePreferredContentSizeCategoryChangedNotification" 
  42. "kKeepAppsUpToDateEnabledChangedNotification" 
  43. "com.apple.accessibility.cache.reduce.motion" 
  44. "UIKeyboardSpringBoardKeyboardShow" 
  45. "UIKeyboardSpringBoardKeyboardHide" 
  46. "com.apple.locationd.registration" 
  47. "kCTDaemonReadyNotification" 
  48. "com.apple.system.config.network_change" 
  49. "com.apple.system.timezone./var/db/timezone/zoneinfo/UTC" 
  50. "com.apple.system.info:/etc/hosts" 
  51. "com.apple.MSVLoggingConfigurationDidChange" 
  52. "com.apple.managedconfiguration.defaultsdidchange" 
  53. "com.apple.AppSupport.loggingDefaultsChanged" 
  54. "com.apple.mobileipod.MPMusicPlayerController.launched" 
  55. "com.apple.networkd.nat64.ifstate" 
  56. "com.apple.ManagedConfiguration.profileListChanged" 
  57. "com.apple.backboardd.unambiguousOrientation" 
  58. "com.apple.accessibility.cache.button.shapes.enabled" 
  59. "com.apple.accessibility.cache.use.single.system.color.enabled" 
  60. "com.apple.accessibility.cache.darken.system.colors.enabled" 
  61. "com.apple.coreui.statistics" 
  62. "com.apple.UIKit.UIScreenEdgeGestureMode" 
  63. "com.apple.managedconfiguration.restrictionchanged" 
  64. "com.apple.managedconfiguration.passcodechanged" 
  65. "PINPolicyChangedNotification" 
  66. "com.apple.managedconfiguration.settingschanged" 
  67. "com.apple.managedconfiguration.effectivesettingschanged" 
  68. "com.apple.managedconfiguration.appwhitelistdidchange" 
  69. "com.apple.managedconfiguration.defaultsdidchange" 
  70. "com.apple.managedconfiguration.keyboardsettingschanged" 
  71. "com.apple.managedconfiguration.clientrestrictionschanged" 
  72. "com.apple.managedconfiguration.webFilterUIActiveDidChange" 
  73. "com.apple.ManagedConfiguration.managedAppsChanged" 
  74. "MCManagedBooksChanged" 
  75. "com.apple.managedconfiguration.allowpasscodemodificationchanged" 
  76. "com.apple.mediaserverd.up" 
  77. "com.apple.hangtracer.prefchangednotification" 
  78. "com.apple.accessibility.cache.enhance.background.contrast" 
  79. "com.apple.system.thermalpressurelevel" 
  80. "com.apple.backboardd.backlight.changed" 
  81. "com.apple.accessibility.QuickSpeakEnabled" 
  82. "com.apple.accessibility.cache.quick.speak" 
  83. "com.apple.powerlog.state_changed" 
  84. "com.apple.powerlog.clientPermissionState" 


Tags:iOS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
应用锁一直是苹果用户的痛点,毕竟这功能隔壁安卓早就有了。 为什么苹果一直不给上应用锁的功能呢?之前记者也有提问过苹果的前设计师(首席声优)艾维,他说在苹果的逻辑里,手机密码...【详细内容】
2021-12-23  Tags: iOS  点击:(27)  评论:(0)  加入收藏
众所周知,由于今年iOS 15系统的更新幅度不大,导致不少果粉的升级欲望大大降低,iOS 15系统的安装率也远低于去年的iOS 14系列,今年的iOS 15这么拉跨,那么明年的iOS 16呢? 目前关于i...【详细内容】
2021-12-22  Tags: iOS  点击:(9)  评论:(0)  加入收藏
IT之家 12 月 20 日消息,百度网盘青春版 iOS 客户端今日晚间率先开启内测,安卓客户端将在稍后内测。使用苹果 iPhone 的IT之家小伙伴可以点此下载内测版,需要先下载 TestFlight...【详细内容】
2021-12-21  Tags: iOS  点击:(10)  评论:(0)  加入收藏
相信很多小伙伴都遇到过这种情况,一台iPhone放太久了,当初设置的锁屏密码是什么都自己忘了。 这时候我们只能通过连接电脑进入恢复模式再进行刷机或者用另一台iPhone(登录的是...【详细内容】
2021-12-21  Tags: iOS  点击:(16)  评论:(0)  加入收藏
近日苹果发布 iOS 15.2/iPadOS 15.2 正式版的更新,整合了此前测试版中所有新功能,因此更新内容不少,也有一些值得了解的实用功能。有没有必要更新 iOS 15.2 正式版?看完如下功能...【详细内容】
2021-12-17  Tags: iOS  点击:(24)  评论:(0)  加入收藏
虽然手机圈每隔几天就会有新机登场,但依旧有小伙伴表示内心毫无波澜&mdash;&mdash; 「你发任你发,我的小米 6 还能再战两年。」 就算是电池损耗了,按键不灵了,屏幕摔碎了,修一修...【详细内容】
2021-12-16  Tags: iOS  点击:(7)  评论:(0)  加入收藏
苹果昨日向 iPhone 和 iPad 用户推送了 iOS 15.2 / iPadOS 15.2 正式版更新,带来了多项新功能。据 9To5Mac 报道,iOS 15.2 / iPadOS 15.2 还有一项新功能,允许用户不借助 Mac...【详细内容】
2021-12-16  Tags: iOS  点击:(30)  评论:(0)  加入收藏
今天发了几个关于iOS15.2正式版的微头条,没想到引发了大家不小的讨论,看来大家对于新版本还是有不少期待的,不少人今天早上睡醒之后就选择了升级,还有一些小伙伴一直在纠结要不...【详细内容】
2021-12-15  Tags: iOS  点击:(21)  评论:(0)  加入收藏
在今天凌晨,苹果正式上线了 iOS 15.2 正式版 以及 watchOS 8.3 的新版本,这个正式版其实我是一直比较期待的,因为在此前的开发者测试版本中,就一直在内测APP 隐私报告,数字遗产以...【详细内容】
2021-12-15  Tags: iOS  点击:(22)  评论:(0)  加入收藏
【手机中国新闻】随着互联网进一步深入到我们的生活,我们已经与数字化脱不开关系了,同时在网络上拥有很多对于我们而言有价值的事物。因此,有不少网友在思考,自己故去以后,网络上...【详细内容】
2021-12-14  Tags: iOS  点击:(9)  评论:(0)  加入收藏
▌简易百科推荐
前言最近对 WebRTC iOS 端源码进行了下载和编译,网上针对 WebRTC iOS 端的编译文章基本都是几年前的,有些地方已经不适用于最新版的 WebRTC 的编译,简单记录下载&编译的过程,以...【详细内容】
2021-11-10  anyRTC云平台    Tags:WebRTC iOS   点击:(38)  评论:(0)  加入收藏
IT之家 10 月 20 日消息,据 9to5 Mac 报道,继 iOS 15.1 RC、macOS Monterey RC 和其他更新发布后,苹果也向开发者提供了 Xcode 13.1 RC(候选版)。最新版本的 Xcode 现在可以在苹...【详细内容】
2021-10-20    IT之家  Tags:Xcode   点击:(88)  评论:(0)  加入收藏
IT之家 8 月 12 日消 苹果今日发布了一款新的开发者工具,旨在强制那些运行 iOS 15 和 iPadOS 15 的设备在使用不安全的 WiFi 网络或 WiFi 速度较慢时优先使用 5G 连接而不是...【详细内容】
2021-08-12    IT之家  Tags: iOS   点击:(151)  评论:(0)  加入收藏
IT之家4月7日消息 去年底,苹果公司要求应用商店所有第三方软件都必须增加 “隐私标签”以进一步保护消费者隐私安全。之后,谷歌旗下大量 iOS 软件长时间停止更新。而到了今年...【详细内容】
2021-04-07    IT之家  Tags:苹果隐私标签   点击:(309)  评论:(0)  加入收藏
你们好,这里是Seek思科,为你寻找苹果最新资讯、苹果隐藏技巧、苹果良心APP以及苹果优质配件。如果你需要这些,不妨点个关注。苹果已经官宣今年全球开发者大会将在北京时间6月8...【详细内容】
2021-04-02  Seek思科  今日头条  Tags:iOS15系统   点击:(370)  评论:(0)  加入收藏
Sideloadly安装unc0ver越狱 今天推荐比Altstore更简单的安装工具,Sideloadly 在QQ群文件下载最新版本安装, 然后直接打开,演示是Mac版本 Win是一模一样的, 不会出现报错2或...【详细内容】
2021-03-30  CydiaInstaller  今日头条  Tags:iOS自签名   点击:(1279)  评论:(0)  加入收藏
就在昨日,苹果对《App Store 审核指南》进行了2021年的首次重大更新。而此次更新主要是为了方便开发者为即将发布的OS版本中的新功能提供支持,更好地保护用户,并帮助开发者的Ap...【详细内容】
2021-02-03      Tags:App Store   点击:(205)  评论:(0)  加入收藏
不用不上架、不越狱、不要企业证书、永不掉签 只需一个h5网站地址 就能创建属于您自己的苹果IOS APP_多啦咪资源网无需越狱 无需企业证书 不用上架appStore 界面全屏 无广告...【详细内容】
2020-12-11      Tags:APP   点击:(177)  评论:(0)  加入收藏
iOS14支持把小组件添加到桌面,不过我们之前推荐的都是一些工具类的或者是桌面美化类的小组件,今天我们来看看目前有哪些我们常用的App已经支持把小组件添加到桌面了。 网易云...【详细内容】
2020-11-26      Tags:iOS   点击:(185)  评论:(0)  加入收藏
简介: 在平时的面试中,经常问到的高频面试题大概做了一个总结,希望能帮到你!一、如何绘制UIView?绘制一个UIView最灵活的方法就是由它自己完成绘制。实际上你不是绘制一个UIView...【详细内容】
2020-11-13      Tags:iOS   点击:(146)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条