Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

【iOS】Core Bluetooth が出力する WARNING のエラーコードの意味

はじめに

こんにちは、 Mobile Application Group で iOS アプリエンジニアをやっている多鹿です。
最近癒しを求めてベタという熱帯魚を飼い始めました。ゆらゆら漂う姿についつい見惚れてしまいますね。。

さて、去る 9/26(火) に弊社サービスの Eight がリニューアルを行いました。

jp.corp-sansan.com

本記事では、このリニューアルされた Eight の主要機能である「タッチ名刺交換」に使っている Core Bluetooth に関する内容を書いていきます。

ドキュメントにも記載されていない WARNING 出力との遭遇

「タッチ名刺交換」の機能では内部的に Bluetooth の通信を用いています。
iOS では Core Bluetooth というフレームワークを利用して開発を行いました。

開発を進めていると、 Core Bluetooth から下記のような WARNING が Xcode のデバッグエリアに表示されることがありました。

[CoreBluetooth] WARNING: Unknown error: 719

Bluetooth 自体や Core Bluetooth に詳しくない身としては Unknown error と言われ WARNING が何を表しているのかよく分からず、公式ドキュメントの記載も見つからなかったので非常に混乱していました。。
(おまけにコード上でハンドリングすることもできません。)

以降、本記事では上記 WARNING の 719 部分をエラーコードと呼ぶことにします。
上記の他にも WARNING 表示のフォーマットは同じでいくつか異なるエラーコードに遭遇したので、それらが何を意味するかをまとめていきます。

遭遇したエラーコード一覧とその意味

それでは早速、下記に筆者が遭遇したエラーコードとその意味をまとめます。

⚠️ 以下、公式的に言及されている情報は見つからず、筆者の推定も含まれます。
⚠️ また、本記事で紹介するものは筆者が開発中に実際に遭遇したエラーコードのみとなります。

エラーコード 意味 参考情報
708 GATT 接続のタイムアウト What do mean IOS Bluetooth disconn… | Apple Developer Forums
719 相手(remote)から GATT 接続の切断 What do mean IOS Bluetooth disconn… | Apple Developer Forums
722 自分(local)から GATT 接続の切断 BLE Device disconnection when call… | Apple Developer Forums
431 相手(remote)から L2CAP 接続の切断 L2CAP: Unknown error: 431 and 436 | Apple Developer Forums
436 自分(local)から L2CAP 接続の切断 L2CAP: Unknown error: 431 and 436 | Apple Developer Forums

Bluetooth Core Specification との一致

また、調べていくうちに、上記 7xx 系のエラーについては、 xx 部分を 16進数で表現することで Bluetooth の Core Specification1 に記載されているエラーコードと一致することに気づきました。

708 (CONNECTION TIMEOUT)

708 -> 8 -> 0x08

2.8 CONNECTION TIMEOUT (0x08)
The Connection Timeout error code indicates that either the link supervision timeout has expired for a given connection or that the synchronization timeout has expired for a given broadcast.

719 (REMOTE USER TERMINATED CONNECTION)

719 -> 19 -> 0x13

2.19 REMOTE USER TERMINATED CONNECTION (0x13)
The Remote User Terminated Connection error code indicates that the user on the remote device either terminated the connection or stopped broadcasting packets.

722 (CONNECTION TERMINATED BY LOCAL HOST)

722 -> 22 -> 0x16

2.22 CONNECTION TERMINATED BY LOCAL HOST (0x16)
The Connection Terminated By Local Host error code indicates that either the local device terminated the connection, terminated synchronization with a broadcaster, or terminated broadcasting packets.

本記事では私が遭遇した上記のエラーのみの紹介となっていますが、この規則性を知っていれば他のエラーコードに遭遇した場合でも Bluetooth Core Specification のエラーコードと照らし合わせてエラーの内容を調べることができます。

L2CAP 関連について

今回の「タッチ名刺交換」機能では Bluetooth の中でも L2CAP 通信も利用していたので L2CAP に関するエラーコードにも遭遇していました。
これらは 4xx として出てきていましたが、 L2CAP 関連のエラーコードに関しては上記のような仕様書の記載との一致を見つけることができず、フォーラムでの回答と動作ベースでの確認に留まりました。

エラーコードを知って良かったこと

これらのエラーコードの内容を調べてみて良かったことがいくつかあったので紹介します。

  • デバッグ情報として有益に利用できる
    • Core Bluetooth を用いた開発は物理デバイスに依存したデバッグを行うのでデバッグ作業が大変だが、この情報を元に「相手から切断されてたんだな」「意図していないけどこのタイミングで自分から切断しているから何かコードがおかしいかも」といった推測がしやすくなった
  • 精神的なモヤモヤが晴れた
    • Unknown error と表示されるので、非常にモヤモヤしていたのがスッキリした

おわりに

さて、筆者が遭遇した Core Bluetooth の WARNING について紹介しました。
WARNING 表示自体にも情報が少なく、Web 上にもあまり情報がなかったのでなかなか苦労しましたが、エラーコードの内容を知ることで一定デバッグに使える情報になったと思います。
改めてですが、公式的に言及されている情報が見つからなかったので、筆者の推測も含むことをご了承ください。

また、Core Bluetooth を使った「タッチ名刺交換」の開発に関わる記事としてこちらも併せて参照ください。

buildersbox.corp-sansan.com


  1. 今回は Core Specification 5.4 を参照

© Sansan, Inc.