我可以使用 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——这是欧洲科学界提出的协议