我可以使用 Apple 和 Google 的接触者追踪规范吗?
Can I use Apple and Google's Contact Tracing Spec?
我想使用 Apple 和 Google 的新 API 来支持 Covid 接触者追踪,如本文 API document 中所述。但是当我尝试在 XCode 中使用这些 API 时,找不到 类:
let request = CTSelfTracingInfoRequest()
如何启用这些 API?
iOS 的 API 受到限制。 虽然您可以使用 XCode 11.5 和 iOS 13.5,即使在没有 Apple 授予您具有 com.apple.developer.exposure-notification
权利的配置文件的模拟器中,您也无法 运行 代码。并且 Apple 仅在手动批准流程后将此权利授予与政府卫生机构相关的开发人员。
以下是有关无需 Apple 特别许可即可执行的操作的更多信息。
iOS 13.5 之前的版本不允许在规范中传输暴露通知服务信标蓝牙广告格式。从 13.5 开始,广告只能通过操作系统进行——如果不使用更高级别的 APIs,第 3 方应用程序无法发出该广告。
从 iOS 13.5 开始,Apple 还阻止第三方应用程序直接检测此信标格式,迫使它们使用更高级别的 APIs。 iOS 的早期版本允许检测此信标格式。
Android,不过,就是另外一回事了。
虽然 Google 在 Google Play 服务中对这些 API 的使用类似地限制为具有 Google 授予的特殊权限的 API 密钥,Android 版本 5.0+ 允许第 3 方应用发送和检测 the bluetooth specification 设想的曝光通知服务信标广告:
使用免费和开源的 Android Beacon Library 2.17+,您可以像这样传输此信标:
String uuidString = "01020304-0506-0708-090a-0b0c0d0e0f10";
Beacon beacon = new Beacon.Builder()
.setId1(uuidString)
.build();
// This beacon layout is for the Exposure Notification Service Bluetooth Spec
BeaconParser contactDetectionBeaconParser = new BeaconParser()
.setBeaconLayout("s:0-1=fd6f,p:-:-59,i:2-17");
BeaconTransmitter beaconTransmitter = new
BeaconTransmitter(getApplicationContext(), contactDetectionBeaconParser);
beaconTransmitter.startAdvertising(beacon
然后像这样扫描它:
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("s:0-1=fd6f,p:-:-59,i:2-17"));
...
beaconManager.startRangingBeaconsInRegion(new Region("All Exposure Notification Service beacons", null));
...
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
for (Beacon beacon: beacons) {
Log.i(TAG, "I see an Exposure Notification Service beacon with rolling proximity identifier "+beacon.getId1());
}
}
在Android上,即使在后台也可以进行上述传输和检测。有关详细信息,请参阅库文档。
传输和接收暴露通知服务信标的能力内置于 BeaconScope Android 应用程序中。您可以将其用作帮助测试您构建的任何应用程序的工具。
您可以在我的博客中阅读更多内容post which shows you how to build your own app to do this.
至于 iOS,虽然在撰写本文时无法传输,但您可以在 iOS 13.4.x 和更早版本上使用如下代码扫描这些信标:
let exposureNotificationServiceUuid = CBUUID(string: "FD6F")
centralManager?.scanForPeripherals(withServices: [exposureNotificationServiceUuid], options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
...
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
if let advDatas = advertisementData[CBAdvertisementDataServiceDataKey] as? NSDictionary {
if let advData = advDatas.object(forKey: CBUUID(string: "FD6F")) as? Data {
let hexString = advData.map { String(format: "%02hhx", [=12=]) }.joined()
let proximityId = String(hexString.prefix(32))
let metadata = hexString.suffix(8)
NSLog("Discovered Exposure Notification Service Beacon with Proximity ID\(proximityId), metadata \(metadata) and RSSI \(RSSI)")
}
}
}
但是请注意,从 iOS 13.5 beta 2 开始,Apple 阻止了它的工作。上面的 didDiscover
方法永远不会为带有曝光通知服务 UUID 的广告调用。
完全披露:我是 Android Beacon Library 开源项目的首席开发人员,也是基于该库构建的 BeaconScope 应用程序的作者。
编辑 2020 年 4 月 26 日:将上面的答案更新为 link 暴露通知服务蓝牙规范的修订版 1.1 版本,以根据该更改更新命名约定,并修改代码示例以显示元数据。
编辑 2020 年 4 月 30 日:更新的答案基于 Apple 发布的 iOS 13.5 beta 2 和 XCode 11.5 beta,以及 Apple现在阻止第 3 方应用程序检测曝光通知服务信标。
编辑 2020 年 6 月 2 日:更新的答案基于 Apple 的最终版本 iOS 13.5 和 Google 的 Google 版本播放服务。
您还可以使用其他开源接触者追踪协议,例如 Apple/Google。
比如OpenCovidTrace – it is an open source implementation of the Google/Apple protocol with minor changes, or DP-3T——这是欧洲科学界提出的协议
我想使用 Apple 和 Google 的新 API 来支持 Covid 接触者追踪,如本文 API document 中所述。但是当我尝试在 XCode 中使用这些 API 时,找不到 类:
let request = CTSelfTracingInfoRequest()
如何启用这些 API?
iOS 的 API 受到限制。 虽然您可以使用 XCode 11.5 和 iOS 13.5,即使在没有 Apple 授予您具有 com.apple.developer.exposure-notification
权利的配置文件的模拟器中,您也无法 运行 代码。并且 Apple 仅在手动批准流程后将此权利授予与政府卫生机构相关的开发人员。
以下是有关无需 Apple 特别许可即可执行的操作的更多信息。
iOS 13.5 之前的版本不允许在规范中传输暴露通知服务信标蓝牙广告格式。从 13.5 开始,广告只能通过操作系统进行——如果不使用更高级别的 APIs,第 3 方应用程序无法发出该广告。
从 iOS 13.5 开始,Apple 还阻止第三方应用程序直接检测此信标格式,迫使它们使用更高级别的 APIs。 iOS 的早期版本允许检测此信标格式。
Android,不过,就是另外一回事了。
虽然 Google 在 Google Play 服务中对这些 API 的使用类似地限制为具有 Google 授予的特殊权限的 API 密钥,Android 版本 5.0+ 允许第 3 方应用发送和检测 the bluetooth specification 设想的曝光通知服务信标广告:
使用免费和开源的 Android Beacon Library 2.17+,您可以像这样传输此信标:
String uuidString = "01020304-0506-0708-090a-0b0c0d0e0f10";
Beacon beacon = new Beacon.Builder()
.setId1(uuidString)
.build();
// This beacon layout is for the Exposure Notification Service Bluetooth Spec
BeaconParser contactDetectionBeaconParser = new BeaconParser()
.setBeaconLayout("s:0-1=fd6f,p:-:-59,i:2-17");
BeaconTransmitter beaconTransmitter = new
BeaconTransmitter(getApplicationContext(), contactDetectionBeaconParser);
beaconTransmitter.startAdvertising(beacon
然后像这样扫描它:
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("s:0-1=fd6f,p:-:-59,i:2-17"));
...
beaconManager.startRangingBeaconsInRegion(new Region("All Exposure Notification Service beacons", null));
...
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
for (Beacon beacon: beacons) {
Log.i(TAG, "I see an Exposure Notification Service beacon with rolling proximity identifier "+beacon.getId1());
}
}
在Android上,即使在后台也可以进行上述传输和检测。有关详细信息,请参阅库文档。
传输和接收暴露通知服务信标的能力内置于 BeaconScope Android 应用程序中。您可以将其用作帮助测试您构建的任何应用程序的工具。
您可以在我的博客中阅读更多内容post which shows you how to build your own app to do this.
至于 iOS,虽然在撰写本文时无法传输,但您可以在 iOS 13.4.x 和更早版本上使用如下代码扫描这些信标:
let exposureNotificationServiceUuid = CBUUID(string: "FD6F")
centralManager?.scanForPeripherals(withServices: [exposureNotificationServiceUuid], options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
...
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
if let advDatas = advertisementData[CBAdvertisementDataServiceDataKey] as? NSDictionary {
if let advData = advDatas.object(forKey: CBUUID(string: "FD6F")) as? Data {
let hexString = advData.map { String(format: "%02hhx", [=12=]) }.joined()
let proximityId = String(hexString.prefix(32))
let metadata = hexString.suffix(8)
NSLog("Discovered Exposure Notification Service Beacon with Proximity ID\(proximityId), metadata \(metadata) and RSSI \(RSSI)")
}
}
}
但是请注意,从 iOS 13.5 beta 2 开始,Apple 阻止了它的工作。上面的 didDiscover
方法永远不会为带有曝光通知服务 UUID 的广告调用。
完全披露:我是 Android Beacon Library 开源项目的首席开发人员,也是基于该库构建的 BeaconScope 应用程序的作者。
编辑 2020 年 4 月 26 日:将上面的答案更新为 link 暴露通知服务蓝牙规范的修订版 1.1 版本,以根据该更改更新命名约定,并修改代码示例以显示元数据。
编辑 2020 年 4 月 30 日:更新的答案基于 Apple 发布的 iOS 13.5 beta 2 和 XCode 11.5 beta,以及 Apple现在阻止第 3 方应用程序检测曝光通知服务信标。
编辑 2020 年 6 月 2 日:更新的答案基于 Apple 的最终版本 iOS 13.5 和 Google 的 Google 版本播放服务。
您还可以使用其他开源接触者追踪协议,例如 Apple/Google。
比如OpenCovidTrace – it is an open source implementation of the Google/Apple protocol with minor changes, or DP-3T——这是欧洲科学界提出的协议