這是一個(gè)對(duì)于Apple開發(fā)者文檔的翻譯,基于自己的知識(shí)經(jīng)驗(yàn)和有道詞典,希望能為需要的同仁提供一些幫助。水平有限,不足之處還望指出,好做更正,避免誤導(dǎo)他人。
先貼上原文鏈接](https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Introduction/Introduction.html#//apple_ref/doc/uid/TP40013460)
介紹
ANCS的目的是給藍(lán)牙外設(shè)(指通過BLE與iOS設(shè)備建立連接的設(shè)備)一種簡(jiǎn)單方便的方式去接收各種各樣的產(chǎn)生于iOS設(shè)備上的通知。
ANCS的設(shè)計(jì)遵循三個(gè)原則:簡(jiǎn)單的,高效的,可擴(kuò)展的。基于此,不管是簡(jiǎn)單的led設(shè)備,還是大型的能源設(shè)備都能在一定范圍內(nèi)有效發(fā)現(xiàn)這個(gè)服務(wù)。
依賴
除了遵循標(biāo)注GATT的子程序,ANCS沒有什么依賴。一個(gè)作為GATT客戶端的設(shè)備在使用ANCS的同時(shí)可以使用其他的服務(wù)與iOS設(shè)備通信。這里說明藍(lán)牙設(shè)備在與iOS設(shè)備透過其它服務(wù)通信的同時(shí)可以使用ANCS服務(wù)。
字節(jié)與編碼
除非特別說明,所有ANCS通道數(shù)值采用小端字節(jié)序
除非特別說明,所有ANCS通道的字符串才有UTF-8編碼
術(shù)語
蘋果通知中心服務(wù)被簡(jiǎn)稱為ANCS
ANCS服務(wù)發(fā)行端(iOS設(shè)備)被稱為通知提供者(NP)
ANCS服務(wù)客戶端(外圍設(shè)備)被稱為通知消費(fèi)者(NC)
出現(xiàn)在iOS設(shè)備的通知中心的通知稱為iOS通知
通過GATT特征作為異步信息發(fā)送的通知稱為GATT通知
蘋果通知中心服務(wù)
蘋果通知中心服務(wù)是一項(xiàng)基礎(chǔ)服務(wù),服務(wù)UUID是7905F431-B5CE-4E99-A40F-4B1E122D00D0.
在一個(gè)NP上同時(shí)只允許一個(gè)ANCS實(shí)例存在。由于iOS的特性,ANCS實(shí)例并不總是存在,基于這個(gè)結(jié)果,為了能夠監(jiān)聽到ANCS隨時(shí)不定發(fā)送的通知,NC隨時(shí)需要尋找并訂閱ANCS服務(wù)改變的GATT特征。
服務(wù)特征
從基本要素上看,ANCS暴露了3個(gè)特征
通知源 :UUID 9FBF120D-6301-42D9-8C58-25E699A21DBD (notifiable)
控制點(diǎn):UUID 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9 (writeable with response)
數(shù)據(jù)源: UUID 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB (notifiable)
所有這些特征都需要授權(quán)使用。
通知源特征的支持是強(qiáng)制的,然而控制點(diǎn)和數(shù)據(jù)源的特征支持是可選的。
Note:ANCS擁有除了上面說的三種之外的特征,也就是說,一個(gè)NC可以忽略任何他不能識(shí)別的特征。
通知源
通知源特征是基于NC接收到下述消息之上的特征:
NP上新的iOS通知的到達(dá)
NP上iOS通知的修正
NP上iOS通知的移除
GATT通知在NC訂閱通知源特征的時(shí)候就送達(dá)了。因此,NC在訂閱通知源特征之前需要保持一個(gè)可以正確接受并使用這些消息的狀態(tài)。
一段通過通知源特證送達(dá)的GATT通知的格式如圖2-1所示。
(圖省略了,用[]來表示了)
[EventID 1Byte][EventFlags 1Byte][CategoryID 1Byte][CategoryCount 1Byte][NotificationUID 4Bytes]
一段通過通知源特征送達(dá)的GATT通知包含了以下信息:
EventID:這個(gè)字段告訴配件發(fā)過來的iOS通知是添加、修改還是刪除,EventID values這個(gè)枚舉值幫助定義這個(gè)字段 EventIDNotificationAdded = 0,
EventIDNotificationModified = 1,
EventIDNotificationRemoved = 2,
Reserved EventID values = 3–255
EventFlags:一個(gè)用來告知NC這條iOS通知的特殊性.舉個(gè)例子,如果一個(gè)iOS通知被認(rèn)為是“重要的”,NC可能需要在供給用戶接口(在UI上展示)來確保這條消息提醒到了用戶.EventFlags這個(gè)枚舉幫助定義這個(gè)字段
EventFlagSilent = (1 << 0),
EventFlagImportant = (1 << 1),
EventFlagPreExisting = (1 << 2),
EventFlagPositiveAction = (1 << 3),
EventFlagNegativeAction = (1 << 4),
Reserved EventFlags = (1 << 5)–(1 << 7)
CategoryID:一個(gè)數(shù)值編成的類別用于對(duì)iOS通知分類,NP盡可能對(duì)每一條iOS通知進(jìn)行精確的分類。CategoryID Values這個(gè)枚舉幫助定義這個(gè)字段
CategoryIDOther = 0,
CategoryIDIncomingCall = 1,
CategoryIDMissedCall = 2,
CategoryIDVoicemail = 3,
CategoryIDSocial = 4,
CategoryIDSchedule = 5,
CategoryIDEmail = 6,
CategoryIDNews = 7,
CategoryIDHealthAndFitness = 8,
CategoryIDBusinessAndFinance = 9,
CategoryIDLocation = 10,
CategoryIDEntertainment = 11,
Reserved CategoryID values = 12–255
CategoryCount:這個(gè)分類當(dāng)前活躍的iOS通知的個(gè)數(shù)。舉個(gè)例子,如果現(xiàn)在用戶的郵箱里有兩條未讀郵件,這個(gè)時(shí)候一條新的郵件推送過來了,那么這個(gè)CategoryCount的值將是3。
NotificationUID:一個(gè)作為iOS通知的唯一識(shí)別符的32位(32-bit)數(shù)。這個(gè)數(shù)可以被用作一個(gè)發(fā)送給控制點(diǎn)特征(Control Point characteristic)的命令句柄與iOS通知交互。
一個(gè)iOS通知的生命周期隱約可以通過NP生成的通知源GATT通知的序列推理出來,如下圖
控制點(diǎn)和數(shù)據(jù)源
一個(gè)NC可能需要和iOS通知相互作用,它可能想要獲取更多關(guān)于iOS通知的信息,包括它的內(nèi)容,或者是想要在通知上執(zhí)行些什么。這些屬性檢索的執(zhí)行貫穿整個(gè)控制點(diǎn)和數(shù)據(jù)源特征。
NC可以通過發(fā)送特定命令給控制點(diǎn)特征用于接受更多關(guān)于iOS通知的信息。如果寫成功了,NP會(huì)立即作出反應(yīng),通過數(shù)據(jù)源特征返回一條GATT通知的數(shù)據(jù)流。
通過寫命令到控制點(diǎn)特征上NC可以在iOS通知上執(zhí)行預(yù)設(shè)動(dòng)作,更多關(guān)于行為和iOS通知的信息在 Perform Notification Action(執(zhí)行通知行為).
獲取通知屬性
獲取通知屬性命令允許NC獲得特定iOS通知的屬性。獲取通知屬性的命令格式如下:
[CommandID 1byte][NotificationUID 4bytes][AttributeID1 1byte][AttributeID2 1byte][Attribute2 max length 2bytes][…]
一條取通知屬性命令包含如下信息:
? CommandID :應(yīng)該寫0(CommandIDGetNotificationAttributes)
? NotificationUID :32位的數(shù)值表示客戶端想要信息的iOS通知的唯一ID(UID)
? AttributeIDs:NC想要獲取的屬性列表.一些屬性會(huì)跟一個(gè)16位(2bytes)的參數(shù)指定該屬性的最大字節(jié)數(shù)。
獲取通知屬性命令的返回值(Response)的格式如下:
[CommandID 1byte][NotificationUID 4bytes][AttributeID1 1byte][AttributeID1 length 2bytes][…Attribute1…][AttributeID2 1byte][Attribute2 length 2bytes][…Attribute2…][…]
一條取通知屬性命令的返回值包含如下信息:
? CommandID :應(yīng)該寫0(CommandIDGetNotificationAttributes)
? NotificationUID :32位的數(shù)值表示這些屬性對(duì)應(yīng)的iOS通知的唯一ID(UID)
? AttributeList:一個(gè)(屬性ID/16位長(zhǎng)度說明/屬性元組)列表.屬性是一條長(zhǎng)度被元組提供的字符串,但是不以NULL結(jié)尾.如果一條被請(qǐng)求的iOS通知屬性是空的或者丟失了,它的長(zhǎng)度將被置為0.
如果一條返回值長(zhǎng)度超過了GATT的長(zhǎng)度上限,它將被NP分包處理.NC則必須要重新組包.每條請(qǐng)求的返回值消息完成時(shí)都會(huì)有完成元組被接收到.
獲取應(yīng)用屬性(Get App Attributes)
獲取應(yīng)用屬性的命令允許NC獲取NP上已安裝的制定App的的屬性。命令格式標(biāo)準(zhǔn)如下:
[CommandID 1byte][…App Identifier…][AttributeID1][AttributeID2][…]
獲取應(yīng)用屬性的命令包含以下信息:
? CommandID :應(yīng)該寫1(CommandIDGetAppAttributes)
? AppIdentifier :NC想要獲取信息的對(duì)象App的字符串標(biāo)示.這個(gè)字符串必須是Null結(jié)尾.
? AttributeIDs:NC想要獲取的屬性列表
獲取應(yīng)用屬性命令的返回值的格式如下
[CommandID 1byte][…App Identifier…][AttributeID1 1byte][AttributeID1 length 2bytes][…Attribute1…][AttributeID2 1byte][Attribute2 length 2bytes][…Attribute2…][…]
獲取應(yīng)用屬性命令的返回值包含以下信息:
? CommandID :應(yīng)該寫1(CommandIDGetAppAttributes)
? NotificationUID :跟隨的屬性對(duì)應(yīng)的App的字符串標(biāo)示.這個(gè)字符串必須是Null結(jié)尾.
? AttributeList:一個(gè)(屬性ID/16位長(zhǎng)度說明/屬性元組)列表.屬性是一條長(zhǎng)度被元組提供的字符串,但是不以NULL結(jié)尾.如果一條被請(qǐng)求的iOS通知屬性是空的或者丟失了,它的長(zhǎng)度將被置為0.
和獲取通知屬性的返回值一樣,如果一條獲取應(yīng)用通知的返回值長(zhǎng)度超過了GATT的長(zhǎng)度上限,它將被NP分包處理.NC則必須要重新組包.每條請(qǐng)求的返回值消息完成時(shí)都會(huì)有完成元組被接收到.
執(zhí)行通知行為
這個(gè)命令允許客戶端真對(duì)特定iOS通知執(zhí)行一條預(yù)設(shè)任務(wù).一條執(zhí)行通知行為的命令包含以下幾個(gè)部分:
Bytes? ? Name? Description
1 ? CommandID 設(shè)為2 (CommandIDPerformNotificationAction).
2-5 ? NotificationUID 客戶端想執(zhí)行行為的對(duì)應(yīng)iOS通知的32位(4bytes)唯一ID;
6 ? ActionId NC想在這條iOS通知上執(zhí)行的行為
當(dāng)這條命令錯(cuò)誤是數(shù)據(jù)源特征上不會(huì)有數(shù)據(jù)產(chǎn)生,不管命令發(fā)送成功或者失敗。
通知行為
從iOS8.0開始,NP可以通知NC和iOS通知關(guān)聯(lián)的潛在行為.出于用戶考慮,NC可以請(qǐng)求NP完成一個(gè)特定iOS通知關(guān)聯(lián)的行為.
NC被通知源特特征通過檢索事件標(biāo)記位的存在來驗(yàn)證iOS通知上可執(zhí)行行為的需要而生成的GATT通知通知.(The NC is informed of the existence of performable actions on an iOS notification by detecting the presence of set flags in the EventFlags field of the GATT notifications generated by the Notification Source characteristic:
通知源特征? ? ? ? 生成的GATT通知? ? 堅(jiān)定事件標(biāo)記位的存在? ? iOS通知上的可執(zhí)行行為的存在? 通知 NC)
? EventFlagPositiveAction: 與iOS通知關(guān)聯(lián)的一個(gè)正向行為的存在
? EventFlagNegativeAction: 與iOS通知關(guān)聯(lián)的一個(gè)負(fù)向行為的存在
實(shí)際上NP代表NC執(zhí)行的行為的不同取決于它依靠的iOS通知類型。舉個(gè)例子,在來電通知里執(zhí)行一條正向行為代表接聽,執(zhí)行反響行為代表掛斷。
NC不能假設(shè)或預(yù)判在iOS通知上行為的準(zhǔn)確執(zhí)行,因?yàn)檫@些行為建立在不能被他利用的信息之上,如同NP實(shí)現(xiàn)的ANCS版本的其他影響因素一樣。NP保證這些正向或者負(fù)向的行為導(dǎo)致的結(jié)果不會(huì)嚇到用戶。
如果被一條iOS通知提出,正向或負(fù)向的行為必須要展示給用戶,通過核實(shí)標(biāo)記(check marks)、X marks、感謝和免責(zé)的通用顏色(就像綠色和紅色).
在iOS8.0,NC可以檢索標(biāo)簽來簡(jiǎn)潔描述介紹在收到新的iOS通知屬性后的實(shí)際行為
?NotificationAttributeIDPositiveActionLabel: 這個(gè)標(biāo)簽用于描述正向的行為
?NotificationAttributeIDNegativeActionLabel: 這個(gè)標(biāo)簽用于描述負(fù)向的行為
會(huì)話(Sessions)
一個(gè)ANCS會(huì)話開始于NC通過通知源特征向NP訂閱,結(jié)束于NC在同一特征上取消訂閱或者NC與NP斷開連接。因?yàn)锳NCS沒有被設(shè)計(jì)成完整的同時(shí)性服務(wù),所以它不保存整個(gè)會(huì)話的狀態(tài)軌跡.基于此,NP和NC之間交換的所有標(biāo)示(例如通知唯一表示和應(yīng)用標(biāo)示字符串)和數(shù)據(jù)都只在特定會(huì)話內(nèi)有效。
當(dāng)一個(gè)會(huì)話結(jié)束時(shí),NC應(yīng)該清理掉在這個(gè)會(huì)話里接受到和保存的所有標(biāo)示和數(shù)據(jù).當(dāng)一個(gè)新的session開始時(shí),NP盡可能通知NC所有存在與系統(tǒng)的iOS通知.NC可以用這些信息建模以便在接下來的會(huì)話中使用.
屬性抓取和緩存(Attribute Fetching and Caching)
強(qiáng)烈建議NC只在需要和可能的用戶行為的返回值時(shí)才抓取屬性.舉個(gè)例子,NC選擇顯示iOS通知在一個(gè)簡(jiǎn)單列表里,并且在用戶選擇時(shí)展示特定iOS通知的詳情,那么檢索這些通知屬性的行為就可以被懶加載.
在一個(gè)會(huì)話里,強(qiáng)烈建議NC為它遇到的每一個(gè)App屬性的每一個(gè)標(biāo)示建立緩存.這些緩存可以幫助NC過濾相同App屬性的多次接受—-省時(shí)省電.
錯(cuò)誤碼
在寫控制點(diǎn)特征命令時(shí),NC可能會(huì)收到以下特定錯(cuò)誤碼:
?Unknown command (0xA0): NP 不承認(rèn)這個(gè)命令
?Invalid command (0xA1): 命令格式不正確
?Invalid parameter (0xA2): 參數(shù)中(eg:the NotificationUID)沒有關(guān)系到NP上已存在對(duì)象.
?Action failed (0xA3): 這個(gè)行為不被允許.
如果NP的回復(fù)包含了error,它就不會(huì)在數(shù)據(jù)源特征上生成一條相關(guān)命令的GATT通知。
示例圖表
圖表在原文最后,用兩個(gè)例子描述下NP與NC的工作流程。這里就不貼了