iOS ANCS 通知服务

导语

智能BLE硬件设备需要实时获取Android和iOS端通知,那他们分别是怎么实现的呢?

一,探讨Android &iOS 区别
  • Android端手机是通过NotificationListenerService服务来获取通知栏上的信息,当然这个服务需要获取到对应的权限.通过服务获取到的具体消息,然后通过BLE或者传统蓝牙传输到智能硬件端.然后智能硬件显示该消息
  • iOS 端手机是通过ANCS服务来获取对应消息,该服务在开机后就启动啦,只等订阅设备来订阅。智能硬件端订阅ANCS服务成功后,一旦有新消息,比如来电或者其它App推送消息,苹果通知中心NotificationCenter就推送一份到订阅设备上,同时往通知中心上推送一份。
    总结如下结论:
    iOS端手表或手环设备获取到消息几乎是同时的。速度较快
    Android设备需要继承通过对应的服务,然后在通过自己的传输协议传到手表或手环端,速度上较iOS慢点。
二, 初见ANCS

ANCS(Apple Notification Center Service)意思是苹果通知中心服务,它是苹果提供给周边蓝牙设备(手环、手表等智能设备)通过BLE(低功耗蓝牙)访问iOS设备上的各类通知的一种机制.
ANCS协议中的通用属性协议(Generic Attribute Profile,GATT)协议实现的,它是GATT协议的一个子集。
在ANCS协议中,iOS设备作为server端,既数据提供者NP(Notification Provider),充当Peripheral端的角色.
周边设备如智能手表或者手环作为client端即数据消费者Notification Consumer (NC),充当Central,主要是用来连接和使用ANCS server提供的服务,如何从服务中获取对应的信息。
ANCS作为Perpheral暴露给外界设备的服务UUID是7905F431-B5CE-4E99-A40F-4B1E122D00D0,所以通过该service就能获取到对应的特征值,然后获取特征值里面的内容。
ANCS给我们提供了下面3种特征值(Characteristic)

  • Notification Source:
    UUID 9FBF120D-6301-42D9-8C58-25E699A21DBD(notifiable)
    基本通知源,通知一些计数的信息,可以通过notification 获取uuid,
  • Control Point:
    UUID 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9(writeablewithresponse)
    控制器,用于向ios设备写入控制信息,例如读取详情 ,接听来电,拒绝来电等
  • Data Source:
    UUID 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB(notifiable)
    数据源,用于提供详细数据,在控制信息写入后通过此characteristic返回

所以智能BLE设备需要订阅Notification Source 和 Control Point 来获取DataSource数据源信息,下面对上面Characteristic特征值进行详细解释.

1)Notification Source

Notification Source.png
  • EventID Values 如下Table

| EventID Values | 值 | 代表含义|
| ------------- |:-------------:|
| EventIDNotificationAdded | =0 | 消息是新来的|
| EventIDNotificationModified | =1 |消息是修改的 |
| EventIDNotificationRemoved | =2 |移除消息 |
| Reserved EventID values | = 3–255 | 其它|

  • EventFlags如下Table
EventFlags Values
EventFlagSilent = (1 << 0)
EventFlagImportant = (1 << 1)
EventFlagPreExisting = (1 << 2)
EventFlagPositiveAction = (1 << 3)
EventFlagNegativeAction = (1 << 4)
Reserved EventFlags = (= (1 << 5)–(1 << 7))
  • CategoryID 代表该消息的类型
CategoryID Values 代表含义
CategoryIDOther = 0 其他类别
CategoryIDIncomingCall = 1) 来电消息
CategoryIDMissedCall = 2 miss电话消息
CategoryIDVoicemail = 3 voice mail消息
CategoryIDSocial = 4 社交类消息 比如微信facebook等
CategoryIDSchedule =5 schedule消息
CategoryIDEmail =6 Email消息
CategoryIDNews =7 News消息
CategoryIDHealthAndFitness =8 健康类消息
CategoryIDBusinessAndFinance =9 财经类消息
CategoryIDLocation =10 location消息
CategoryIDEntertainment =11 娱乐类消息
Reserved CategoryID values = 12–255 其他类消息
  • CategoryCount:给定类型中活跃的通知的数量。例如,邮箱中有两封未读的邮件,这个时候又来了一封新的邮件,那么通知的邮件的数量将是3

  • NotificationUID:
    32byte 唯一标示该消息.后续Control Point需要用这个NotificationUID,可以获取到具体的信息datasource.

比如下面消息就是获取到一个

2)Control Point
NC设备需要更多信息,这个时候可以用Control Point获取通知属性命令使得NC可以得到某个特定通知的详细属性,比如短信的发送人,短信内容,时间,App name 等。

image.png
  • CommandID: 设为零 (CommandIDGetNotificationAttributes),0x00
  • NotificationUID: 想要获得的通知的uid,32位数字是通知的唯一标示。
  • AttributeIDs:NC想要获得的属性列表。有些属性可能需要后面接一个16位的的参数,0xff 0xff。

想要获取具体某条信息可以通过下面的方法

 public static byte[] getNotificationByUID(byte[] uid){
   byte appNameCapacity=100;//app name 最长容量
   byte  titleCapacity=50;//title 最长
   byte  subtitleCapactiy=100;//subtitle
   byte msgCapacity=248;//msg最大容量
   byte size=10;
   byte dateCapacity=10;
   ByteArrayOutputStream bout=new ByteArrayOutputStream();
   bout.write(0);//注意此处是commonID 一般情况是0
   bout.write(uid),//把notification uid 传过来
   bout.write(1);
   bout.write(titleCapacity);
   bout.write(0);
   bout.write(2);
   bout.write(subtitleCapactiy);
   bout.write(0);
   bout.write(3);
   bout.write(msgCapacity);
   bout.write(0);
   bout.write(4);
   bout.write(size);
   bout.write(0);
   bout.write(5);
   bout.write(dateCapacity);
   bout.write(0);
   bout.write(0);
   bout.write(appNameCapacity);
   byte[] req=bout.toByteArray();
   bout.reset();
   return req;
}

通过Control Point 传输上面的byte 流给iOS NSNotification center,iOS会根据传输过来的byte流,传回具体信息到设备订阅端,设备通过回调函数解析传过来的byte流。下面获取到byte流如下:

image.png

通过上面的byte数据结构可以写出对应的parse函数。获取具体的数据。通过1Byte AttritbuteID 知道是具体哪个NotificationAttributeID Values,2个byte AttributeLength 知道后面data有几位byte ,byte 数据 紧跟在AttributeLength后面.

NotificationAttributeID Values

NotificationAttributeIDAppIdentifier Values 代表含义
NotificationAttributeIDAppIdentifier = 0 其他类别
NotificationAttributeIDTitle =1 表示title
NotificationAttributeIDSubtitle =2 subtitle
NotificationAttributeIDMessage =3 具体Message
NotificationAttributeIDMessageSize =4 具体Message大小
NotificationAttributeIDDate =5 具体date
NotificationAttributeIDPositiveActionLabel =6
NotificationAttributeIDNegativeActionLabel =7
Reserved NotificationAttributeID values =8-255

Note NotificationAttributeIDDate 获取对应的数据格式是yyyyMMdd'T'HHmmSS,所以获取到对应的Date,要用这种格式来解析.

3)整体NP和NC交换流程

image.png

4)Notification Actions
从iOS8开始,NP发送的iOS通知起始可以间接的告诉NC可执行哪些动作。接着,NC就可以针对指定的iOS通知,请求NP执行一个动作。
通知源特征上生成的GATT通知包含一个叫做Eventflags的数据域,NC根据这个数据域就可得知对一条iOS通知可以执行哪些操作:

EventFlagPositiveAction:积极动作(Positive Action),与iOS通知相关。
EventFlagNegativeAction:消极动作(Negative Action),与iOS通知相关。

比如iPhone来电啦,接听来电可以用EventFlagPositiveAction action来
拒绝来电的时候用EventFlagNegativeAction action来.
通过下面代码就可以实现具体挂电话or接话等操作:

public static byte[] getActionCommend(byte[] uid,int actionId){
  ByteArrayOutputStream out=new ByteArrayOutputStream();
  out.write(2);
  out.write(uid);
  out.write(actionId);
  byte [] req=out.toByteArray();
  out.reset();
  return req;
}

ActionID Values :

ActionID Values
ActionIDPositive =0
ActionIDNegative =1
Reserved ActionID values =2-255
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容