技術書『iOS×BLE Core Bluetooth プログラミング』の紹介

konashi 開発者の松村礼央さんと iOS エンジニアの堤（私）の共著で、「iOS × BLE　Core Bluetooth プログラミング」という書籍を執筆させていただきました。

<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/"><img src="https://qiita-image-store.s3.amazonaws.com/0/3180/a9b6233b-3589-40f6-112f-583eff7bee79.jpeg" width="500"></a>
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/" name="amazletlink" target="_blank">iOS×BLE Core Bluetoothプログラミング</a>

タイトルの通り、<b>BLEを利用したiOSアプリ開発の解説書</b>です。

<b>480ページ</b>と、技術書としてもかなりのボリュームとなっております。


##書籍の概要と著者の紹介

大きく分けて２つのパートにわかれています。

###Part1. BLE編

最初のパート、第1章から第3章は、konashiの開発者である松村礼央さんによる執筆で、**BLEという通信規格そのものについての解説** となっています。

> 松村礼央
> 博士（工学）。karakuri products代表。東京大学先端研特任研究員。在学中は人型ロボットの開発・製造に従事、代表作は「robovie-mR2」。2012年にBLEを活用したツールキット「konashi」の企画、開発に従事。2013年に独立しkarakuri productsを設立。現在はセンサ・ネットワークから得た活動文脈を活用したインフラについて研究し、その成果展開を行っている。


###Part2. iOSプログラミング編

第2のパート、第4章から第12章は、（iOSエンジニアである）堤による執筆で、Core Bluetoothを中心に、**BLEを用いたiOSアプリ開発の解説** となっています。

> 堤修一
> 京都大学にて電気電子工学、京都大学大学院にて信号処理を学び、NTTデータにて音声処理、キヤノンにて画像処理を専門として研究開発に従事。カヤックにてiOSアプリ開発者として30本以上のアプリを開発しリリースする。その後シリコンバレーの500Startupsのインキュベーションプログラムに参画。現在はフリーランス。BLEを用いて外部ハードウェアと連携するiOSアプリを多く手がけている。カンヌ国際広告祭やAppStore Best of 2012等受賞多数。著書『iOSアプリ開発 達人のレシピ100』（秀和システム／2013年）


##本書の特徴

各章の詳細項目は後述するとして、<b>iOSにおける実装方法の解説だけじゃなくて、BLEの規格そのものについての解説もしっかり書いてある</b>のが本書のポイントのひとつで、そのあたりを堤が生半可な知識で書いても有用性が低いだろうということで、フィジカルなレイヤーから熟知されている松村さんとタッグを組ませていただいた、という経緯があります。

特筆すべきは松村さんが書かれた「3. BLEを理解する」で、なんと<b>この章だけで約150ページ</b>（！）もあります。Bluetooth SIGによるドキュメント "[Core Specification](https://www.bluetooth.org/ja-jp/specification/adopted-specifications)" は英語で約2700ページもあり、とても読める気はしないので、<b>iOSエンジニア向けに噛み砕いて解説してくれている</b>この章だけでも個人的には「買い」だと思っています。


###まえがき

その他の概要・特徴紹介代わりに、**「まえがき」**に書いた内容を載せてみます。


> 「BLEって何？」という質問に答えようとすると

> - 2.4GHz帯の電波を用いた–––
> - 超低消費電力を特徴とし–––

> などなど、色々と説明すべきことがあるのですが、筆者（堤）のようなアプリ開発者の視点から端的にいうと、 **「スマホアプリと外部デバイスをワイヤレスでつなげられる通信方式」** ということになります。

> BLEという通信規格自体への興味はさておき、「スマホアプリと外部デバイスを連携させる」という分野に興味のあるアプリエンジニアの方は結構多いのではないでしょうか。
> 筆者も例外ではなく、そもそもBLEとの馴れ初めを振り返ると、**「BLE」自体は意識せず、ただただ「iOSアプリと外部デバイスを連携させて何かやるのって楽しそう」という動機**でkonashiを購入したのが始まりでした。

> その後、次世代パーソナルモビリティ「[WHILL](http://whill.us/smartphone/)」、ウェアラブルなおもちゃ「[Moff](http://jp.moff.mobi/)」など、さまざまな案件にiOSアプリエンジニアとして関わらせていただくうちにBLEに関する知識も深まっていき、こうして書籍まで執筆させていただいているわけですが、ずっとベースにあったのは<b>「スマホアプリと外部デバイスと連携させるのは楽しい」</b>これに尽きます。

> 私個人のそういった経験もあり、**「楽しそう」「つくってみたい」から入って、だんだんBLEのしっかりした知識もつくように構成**したのが本書です。

> たとえば、私は当初「セントラル」「ペリフェラル」「キャラクタリスティック」「アドバタイズ」という専門用語を難しく感じた経験があったので、4章「Core Bluetooth 入門」の序盤では、「周辺のBLEデバイスを探索する」「接続する」といったように<b>なるべく専門用語を使わず説明</b>するようにしています。

> また、最初は「周辺のBLEをデバイス探索したい」だけなのに、そこでオプションの解説まで含めてしまうと、イベントディスパッチ用のキューの話やサービスによる絞り込みを行うかどうか、その場合バックグラウンドではどういった挙動になるか・・・といきなり**新しい事柄が一度にたくさん出てきてしまい混乱のもとになる**ので、**各項では新しく学ぶ事項を必要最小限に**とどめ、後からより詳細を知りたくなったときに関連ページに飛べるよう、各項に「関連項目」の欄を設けています。

> 本書では、こういった「楽しそう」「つくってみたい」という気持ちを削がないための工夫を随所にしています。


・・・Web記事にすると長いのでいったんここで切りますが、そんなわけで**入門者の方が入門しやすいように配慮**して書いております。


> 松村・堤という**実際にBLEプロダクトを開発した執筆陣**がその経験に基いて書いているので、実践的な内容になっているのも本書のポイントです。

> たとえば、「10. 開発ツール・ユーティリティ」で紹介しているツール群は、どれも筆者が日々の開発で使用しているものですし、「11. ハマりどころ逆引き辞典」は、筆者が実際に開発現場においてハマって大量の時間を食いつぶした汗と涙が凝縮されています。また本書の随所で、リファレンスなどからは汲み取りづらい注意点やポイントについて触れています。

> そして松村の執筆した3章「BLEを理解する」では、超濃厚なBLE仕様に関する解説が展開されています。実案件においてBLEの特色を活かしたプロダクト設計をする際に、あるいはアプリエンジニアがハードウェアエンジニアと意思疎通する際に、これらの知識が役立ちます。


そして既にある程度BLEに慣れている人にも役立つ実践的な内容や、Core Bluetoothよりももっと下位のレイヤーについても学べるようになっています。


##対象読者

本書は、**iOSアプリ開発には慣れていることを前提**としています。

したがって、Objective-C や Swift の言語そのものについてや、Xcode の一般的な操作方法、Gitやターミナルの基本的な扱い等々については解説を省略しています。UIKit や NSFoundation といった iOS SDK の一般的なフレームワークについても前提知識として取り扱っています。

逆に、**BLEについては、知識ゼロからでOK**です。

「BLEって何？」「何が嬉しいの？」という状態から読み進められるよう配慮し、構成してあります。

ゼロから入れるようにしつつも、かなり詳細な内容までカバーしているので、本書の内容をマスターすれば、実際に新規ハードウェア開発プロジェクトにiOSエンジニアとして入り、活躍することも可能かと思います。

###経験者向けの見どころ

<b>ある程度 BLE および Core Bluetooth の経験がある</b>人にとっても、BLEの規格自体について説明している3章（松村さん執筆）は相当学びがあると思われます。（＃僕は新しく勉強になることだらけでした。。）

また僕が執筆したiOSプログラミングのパートにも、何か新しい発見はあるかもしれません。「ペリフェラルへの再接続」「状態の保存と復元」など、Core Bluetooth では「**知らなくても大抵の実装ケースにおいて問題ないが、知らないと損**」なことが多くありますし、「Service Changed」サービスへの対応方法等、ググってもあまり具体的な実装方法が出てこない（2015年3月堤調べ）事項についても書いてあります。

<b>実案件でBLEさわりはじめてるけどまだあまり自信がない</b>、という方には11章「ハマりどころ逆引き辞典」が役立つと思います。**実際に堤が数々の実案件でハマりつつ書き溜めてきた**内容なので、かなりの時間短縮になるのでは、と思っています。




##書籍についてのFAQ

以下、本書について、よく聞かれる質問です。

###Swift？Objective-C？

Part 2 は、ほとんどの節についてダウンロードサンプルを用意しています。（今数えたら、Part 2 だけで Xcode プロジェクトの数が 52 個ありました。）

で、**セントラル・ペリフェラルの基本事項の解説にあたる4章・5章については ObjC・Swift 両方のサンプルを用意**し、掲載しています。

その後の章についてはObjCをベースに解説しています。


###konashiがないと読み進められない？

いくつかの例でkonashiを使ってますが、もちろん、お持ちでなくても**全然大丈夫**です。iPhone同士で通信する、Macと通信する、SensorTagを使う、といった諸々の代替方法も紹介しています。


![devices.png](https://qiita-image-store.s3.amazonaws.com/0/3180/320ca463-c58e-0a7b-dd32-ad999a438847.png)

（本書内の図版で使用している各種BLEデバイスの模式図）

###BLE、用語がややこしくて敬遠している

筆者も、**「ペリフェラル」とか「キャラクタリスティック」が難しそう**で、ずっと敬遠してました。Core Bluetooth編の最初の章（4章）序盤では、なるべくそういう用語を使わないように「周辺のデバイスを探す」「接続する」といった感じで解説しています。（このあたりの配慮については、上に載せた「まえがき」もご参照ください）


###BLE云々はよくわからないけどとにかく何かつくってみたい

いきなり12章のレシピからはじめてみるのも手です。**「心拍数モニタアプリ」「活動量計デバイスとアプリ」「ジェスチャ認識ウェアラブルデバイス＆アプリ」「すれちがい通信」**とiOS✕BLEの分野において人気のある題材を集めつつ、**本書の内容がまんべんなく復習できる**ようなサンプルにしてあります。関連項目もまとめてあるので、**つくりながら必要に応じて戻って学習する**、という学習スタイルも可能です。


###BLEデバイスを買わないと気分が出ない

たとえば12章の「レシピ1. 心拍数モニタアプリ」「レシピ2. 活動量計デバイスとアプリ」はデバイス側をiPhoneで代用するレシピにしているので、（気分は出ないかもしれませんが）**専用デバイス無しですぐに試してみる**ことができます。また「レシピ4. すれちがい通信」も、iPhone同士で試せるレシピです。


###「Bluetooth Low Energyをはじめよう」とどっちを買っていいかわからない

僕も買いました！原著も持ってましたが、和書も改めて。良書です。


<img src="https://qiita-image-store.s3.amazonaws.com/0/3180/d94e8033-cdcb-34c8-3da6-e1137145b3aa.jpeg" width="200">


それぞれのAmazonのカテゴリの違いが、書籍のベクトルの違い・棲み分けを表しているかと思います。

- Bluetooth Low Energyをはじめよう・・・カテゴリ：**自作パソコン**
- iOS×BLE Core Bluetoothプログラミング・・・カテゴリ：**モバイルプログラミング**


目次を見ても内容のかぶりはほとんどなく、ボリューム的にもだいぶ違いがあります（そのぶん価格帯もちがう）。

<img src="https://qiita-image-store.s3.amazonaws.com/0/3180/e73441c8-2f5f-2349-59cd-9af4b7b854a3.jpeg" width="300">


なので、個人的には両方購入しても損はないと思いますが、ざっくり、

- <b>BLE という技術全体の概要を把握したい方</b>・・・「〜をはじめよう」
- <b>BLEを使ったiOSアプリの実装に興味がある方</b>・・・本書

みたいな感じかなと。


###高い

すいません、価格はおさえたかったのですが。。なにぶんニッチな技術分野なもので、初回発行部数少なめなのと、ページ数やらの関係で、これぐらいになってしまうとのことです。このあたりは筆者側ではほとんどどうにもできない大人の世界のことなので、なにとぞ。。


##評判など

###[iOS x BLE Core Bluetooth プログラミング - maaash.jp](http://maaash.jp/2015/03/ios-ble/)

IRKit開発者による大塚さん（ @maaash ）によるレビュー記事。

> BLEを使いiPhoneと通信するハードウェアを開発しようとする時、
まず身につけるべきは、問題が起きた時の切り分け能力だと思う。

> iPhone側はアプリから見るとCoreBluetoothという抽象化したレイヤなので、
アプリ開発者は「scanFor…してるのに見つからないよ？」
デバイス側では「advertiseしてるよ？」
となった時にすぐパケットロガーを出せると話が早い。

> この辺もちゃんと10章,10-3,10-4で書いてあってすばらしい。
実戦をこなしている著者陣ならでは。

--

> ふわっとiOSアプリの作り方を解説するだけではなく、BLEについて詳しい3章があるのが心強い。
ハードウェアを作るならば、Bluetooth4の仕様を読むことになるだろう。
だが Core_V4.0.pdf は2302ページもあってしんどい。

> そんなときにまずこの3章を日本語で読んで挑めるとかなりスムーズになるだろう。 自分も仕様はところどころピックアップして読んだだけなので、3章はいざという時のためにあたためておきたい。



###[Amazonのレビュー](http://www.amazon.co.jp/review/R3UZGIMRS6APR6/ref=cm_cr_dp_title?ie=UTF8&ASIN=4883379736&channel=detail-glance&nodeID=465392&store=books)

> ##BLEを使うサービス開発に関わる人必読の1冊, 2015/3/22

> BLEをサービスに活用するにはどうすればいいのか?という一貫した視点で、BLEの通信規格とiOSのCoreBluetoothフレームワークの2つの基礎知識をしっかり解説しています。

> 開発対象がiOSではなくAndroidでも、またアプリやハードの直接の開発者でなくても、BLEを使った何かを考える方には、必読の1冊です。

> iOSアプリ開発では、開発方法だけではなく、トラブルに遭遇したときに、なぜそうなるのかありうる原因の逆引きが書かれています。分野をまたぐ開発では、なにかうまくいかない時に、通信を含む全てを知っていないと原因すら思いつけません。一方で、通信規格やSDKがしっかりしているので、開発者が陥りやすいトラブルは数える程度しかありません。筆者の開発実務経験があるから、逆引きを書かれたのだろうと思います。

> BLEを使ったいろいろなものを手がけられてきた方々の対談がAppendixとして収録されています。BLEを使ったサービスを考えるときに外せない考え方や原則みたいな、まだ構造化できない不定形の知識がこの対談にまとまっていると思いました。BLEを使うサービス開発は、どうしても形あるハードウェアに目を奪われます。ですが、Appendixと1章を何度か読み返していると、BLEはリモコンじゃないんだな、とか、なぜ1章でサービスという単語が度々使われているのかが、すっとわかる気がします。

> IoTという単語が話題になる2015年、"つながる"を強く主張する発表が続くと思います。しかし、IoTの強力な1手段でもあるBLEの本質は、つながることよりも、つなげない使い方や、つながったり切れたりする利用場面を思うことが重要なのだなと、読んでいて思いました。


##買えるところ

###[Amazon](http://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/)

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51XxjzdT%2BKL._SL160_.jpg" alt="iOS×BLE Core Bluetoothプログラミング" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/" name="amazletlink" target="_blank">iOS×BLE Core Bluetoothプログラミング</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 15.03.23</div></div><div class="amazlet-detail">堤 修一 松村 礼央 <br />ソシム <br />売り上げランキング: 898<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>


###リアル書店

下記リンクから、本書の**近隣のリアル店舗における在庫の有無**が調べられます。

https://takestock.jp/book/4883379736/search/

###（2013.3.31追記）電子書籍版

多くのお問い合わせをいただいていた、**電子書籍版（PDF）**も出ました！！！！達人出版会さんよりご購入いただけます。


<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://tatsu-zine.com/books/ios-ble-core-bluetooth-programming" name="amazletlink" target="_blank"><img src="http://tatsu-zine.com/images/books/502/cover_s.jpg" alt="iOS×BLE Core Bluetoothプログラミング" title="iOS×BLE Core Bluetoothプログラミング" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%;margin-bottom:10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://tatsu-zine.com/books/ios-ble-core-bluetooth-programming" name="amazletlink" target="_blank">iOS×BLE Core Bluetoothプログラミング【電子書籍】</a></div><div class="amazlet-detail">堤 修一, 松村 礼央<br />ソシム<br />発行日: 2015-03-23<br />対応フォーマット: PDF<br /></div><div class="amazlet-sub-info" style="float:left;"><div class="amazlet-link" style="margin-top:5px"><a href="http://tatsu-zine.com/books/ios-ble-core-bluetooth-programming" name="amazletlink" target="_blank">詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear:left"></div></div>


[こちら](http://tatsu-zine.com/books/ios-ble-core-bluetooth-programming/samplepage)からサンプルが読めます。


ちなみに、ソシムの本書の読者サポートページの<b>「正誤情報」から、該当ページだけ修正PDFがダウンロードできる</b>のですが、こちらも購入検討用サンプルとして見ていただくといいかもしれません。

- [読者サポート | iOS×BLE Core Bluetoothプログラミング | ソシム](http://www.socym.co.jp/support/s-973)



##各章の概要と目次

最後に、目次を載せておきます。各引用部分は章扉より。

###Part1. BLE編

Part 1 は、松村さんによる「BLEという通信規格そのもの」についての解説です。iOS云々は抜きにして、まずBLEってなんぞや？というところを知るためのパートです。

####1. はじめに

> BLE（Bluetooth Low Enery）は、
従来のBluetoothとはどう異なるのでしょうか？
本章ではBLEのイメージをざっくりつかんでいきます。

- 1-1. BLEとは何か


####2. BLEをとりあえず体験する

> BLEを使ったiPhoneとデバイスの通信を体験してみましょう。
本章ではツールキット「konashi」を使って、
まず用意されたアプリからkonashiを操作してみましょう。
後半では、konashi SDKを使って、自作アプリも作ってみます。

- 2-1. konashiでBLEを体験する
- 2-2. 初級編：konashiをとりあえず体験する
- 2-3. 中級編：konashiをiOS-SDKを利用して制御する

####3. BLEを理解する

> 本章では、BLEの規格をわかりやすく解説していきます。
iOSデベロッパーとしてどう仕様を読み解けばいいかも随所に明記していますので、
実装に役立てることができます。

- 3-1. BLEの概要
- 3-2. BLEの構造
  - 3-2-1. BLEのプロトコルスタック（アーキテクチャ）
  - 3-2-2. ATT（Attribute Protocol）
  - 3-2-3. GAP（Generic Access Profile）
  - 3-2-4. GATT（Generic Attribute Profile）
- 3-3. BLEのネットワークトポロジー
  - 3-3-1. ブロードキャスト型トポロジー
  - 3-3-2. 接続型トポロジー
- 3-4. BLEでのネットワークと通信の制御
  - 3-4-1. Bluetoothの無線仕様とPHY層（LE Physical）
  - 3-4-2. LL 層（Link Layer）
  - 3-4-3. LL 層における注意点
  - 3-4-4. Bluetooth Device Address
  - 3-4-5. AdvertisingとScanning
  - 3-4-6. Connection
- 3-5. L2CAP（Logical Link Control and Adaption Protocol）によるパケットの制御
  - 3-5-1. L2CAP層（Logical Link Control and Adaption Protocol）
- 3-6. BLEのパケットフォーマット
  - 3-6-1. Basic Packet Format
  - 3-6-2. Advertising Channel PDU
  - 3-6-3. Advertising PDU
  - 3-6-4. Scanning PDU
  - 3-6-5. Initiating PDU
  - 3-6-6. Data Channel PDU
  - 3-6-7. CRC（Cyclic Redundancy Check）
  - 3-6-8. L2CAP層でのパケットフォーマット
- 3-7. LL層における通信のやり取り
  - 3-7-1. Bluetooth Device Addressによるフィルタリング
  - 3-7-2. Advertising Channelにおける通信
  - 3-7-3. Data Channelにおける通信
- 3-8. GAP（Generic Access Profile）の詳細を知る
  - 3-8-1. GAPとは何か
  - 3-8-2. GAPによる「役割」の管理
  - 3-8-3. ModeとProcedure
  - 3-8-4. GAPによる「動作」の管理
  - 3-8-5. GAPによる「セキュリティ」の管理
- 3-9. ATT（Attribute Protocol）とGATT（Generic Attribute Profile）の詳細を知る
  - 3-9-1. ATTとは何か
  - 3-9-2. Attribute の構造
  - 3-9-3. ATTサーバ/クライアントの対応するメソッドとPDU
- 3-10. GATTとService
  - 3-10-1. Service の構造
  - 3-10-2. Characteristic の定義
  - 3-10-3. GATTによるService Changed、Characteristic
  - 3-10-4. GAPによるService、Characteristic
  - 3-10-5. GATT プロファイルのAttribute Type の一覧
  - 3-10-6. GATT プロファイルで利用できる機能
- 3-11. iOSエンジニアのBLEあんちょこ
  - 3-11-1. Bluetooth Accessory Design Guidelines for Apple Products
  - 3-11.2. BLEはなぜ低消費電力なのか
  - 3-11.3. Core Bluetoothにおける20octet が何を示すのか


###Part2. iOSプログラミング編

Part 2 は、（iOSエンジニアである）堤による「BLEを用いたiOSアプリ開発」の解説パートです。

####4. Core Bluetooth入門

> 本章から「iOSプログラミング編」として、Core Bluetoothの実装方法を解説していきます。
本章では、はじめの一歩目として、周辺のBLEデバイスを探索し、発見したデバイスに接続する、
そして接続したデバイスとデータのやりとりを行う、というBLEの通信の一連の流れを、
基本事項だけに絞って解説します。

- 4-1. 周辺のBLEデバイスを検索する
- 4-2. BLEデバイスに接続する
- 4-3. 接続したBLEデバイスのサービス・キャラクタリスティックを検索する
- 4-4. 接続したBLEデバイスからデータを読み出す（Read）
- 4-5. 接続したBLEデバイスへデータを書き込む（Write）
- 4-6. 接続したBLEデバイスからデータの更新通知を受け取る（Notify）


####5. ペリフェラルの実装

> 前章「Core Bluetooth入門」では、スキャン、接続、データのやり取りなど、
セントラルとしてふるまうアプリの基本的な項目について解説しました。
本章では、ペリフェラルとしてふるまうアプリの実装方法、
すなわちiOSデバイスをペリフェラルとする方法について解説します。

- 5-1. セントラルから発見されるようにする（アドバタイズの開始）
- 5-2. サービスを追加する
- 5-3. サービスをアドバタイズする
- 5-4. セントラルからのReadリクエストに応答する
- 5-5. セントラルからのWriteリクエストに応答する
- 5-6. セントラルへデータの更新を通知する（Notify）


####6. 電力消費量、パフォーマンスの改善

> 本章では、Apple の「Core Bluetooth プログラミングガイド」の
「ベストプラクティス」について書かれているパートをベースにしつつ、
関連事項や注意点などを加えながら、
「低消費電力」「パフォーマンス向上」につながる実装方法を解説していきます。

- 6-1. スキャンの最適化
  - 6-1-1. スキャンを明示的に停止する
  - 6-1-2. 特定のサービスを指定してスキャンする
  - 6-1-3. できるだけスキャンの検出イベントをまとめる
- 6-2. ペリフェラルとの通信の最適化
  - 6-2-1. 必要なサービスのみ探索する
  - 6-2-2. 必要なキャラクタリスティックのみ探索する
- 6-3. ペリフェラルとの接続の最適化
  - 6-3-1. 接続の必要がなくなり次第すぐに切断する／ペンディングされている接続要求をキャンセルする
  - 6-3-2. ペリフェラルに再接続する
- 6-4. イベントディスパッチ用のキューを変更する（セントラル）
- 6-5. アドバタイズの最適化
- 6-6. イベントディスパッチ用のキューを変更する（ペリフェラル）


####7. バックグラウンド実行モード

> 本章では、Core Bluetoothで実装したBLEの機能をバックグラウンドで動作させる方法と、
バックグラウンドにおける制約（できること／できないこと）について解説します。
また「状態の保存と復元」という、非常に強力な機能についても詳細に解説します。

- 7-1. バックグラウンド実行モードへの対応方法
  - 7-1-1. 対応方法1：Capalities パネルを利用
  - 7-1-2. 対応方法2：info.plistを直接編集
- 7-2. バックグラウンド実行モードの挙動
  - 7-2-1. バックグラウンド実行モードでできること
  - 7-2-2. バックグラウンドにおける制約（ペリフェラル・セントラル共通）
  - 7-2-3. バックグラウンドにおける制約（セントラル）
  - 7-2-4. バックグラウンドにおける制約（ペリフェラル）
- 7-3. アプリが停止しても、代わりにタスクを実行するようシステムに要求する（状態の保存と復元）
  - 7-3-1. バックグラウンド実行モードだけでは問題となるケース
  - 7-3-2. 「状態の保存と復元」機能でできること
  - 7-3-3. 実装にあたっての注意点
  - 7-3-4. セントラルにおける「状態の保存と復元」機能の実装方法
  - 7-3-5. ペリフェラルにおける「状態の保存と復元」機能の実装方法
- 7-4. バックグラウンド実行モードを使用せず、バックグラウンドでのイベント発生をアラート表示する


####8. Core Bluetoothその他の機能

> 本章では、これまでの章では説明していないさまざまなAPI や、
それを利用した実装方法について解説していきます。
「その他」といっても、ペリフェラルへ再接続する方法や、
UUIDやアドバタイズメントデータの詳細、サービス変更を検知する方法など、
BLEを利用したアプリ開発をしていると避けては通れない重要事項が多くありますので、
ひととおりおさえておくことをおすすめします。

- 8-1. ペリフェラルに再接続する
  - 8-1-1. 既知のペリフェラルへの再接続
  - 8-1-2. 接続済みのペリフェラルに再接続する
  - 8-1-3. 再接続処理のフロー
- 8-2. Bluetoothがオフの場合にユーザーにアラートを表示する
- 8-3. UUID 詳解
  - 8-3-1. CBUUIDの生成
  - 8-3-2. 16ビット短縮表現
  - 8-3-3. CBUUIDの比較
  - 8-3-4. ペリフェラルのUUIDについて
- 8-4. アドバタイズメントデータ詳解
  - 8-4-1. アドバタイズメント・データの辞書で使用されるキー
  - 8-4-2. アドバタイズメントデータの制約
- 8-5. CBPeripheralのnameが示す「デバイス名」について
- 8-6. 静的な値を持つキャラクタリスティック
- 8-7. サービスに他のサービスを組み込む～「プライマリサービス」と「セカンダリサービス」
  - 8-7-1. セカンダリサービスとは？
- 8-8. サービスの変更を検知する


####9. Core Bluetooth以外のBLE関連機能

> iOSでは、Core Bluetooth以外にも、さまざまな機能やフレームワークでBLEが用いられています。
ANCSやiBeaconなど、いずれもiOSアプリの可能性を広げる重要な機能ばかりです。
本章では、それらの「iOSにおけるCore Bluetooth以外のBLE関連機能」について解説します。

- 9-1. iOSの電話着信やメール受信の通知を外部デバイスから取得する（ANCS）
  - 9-1-1. ANCSとは？
  - 9-1-2. ANCS のGATT
  - 9-1-3. ANCS の実装方法
- 9-2. iBeaconとBLE
  - 9-2-1. ビーコン＝アドバタイズ専用デバイス
  - 9-2-2. iBeaconのアドバタイズメントパケット
  - 9-2-3. Core Bluetoothに対するiBeaconのアドバンテージ
  - 9-2-4. BLEの知見をiBeacon利用アプリの開発に活かす
- 9-3. MIDI 信号をBLEで送受信する（MIDI over Bluetooth LE）
  - 9-3-1. CoreAudioKit
- 9-4. BLEが利用可能なiOSデバイスのみインストールできるようにする
  - 9-4-1. Required device capabilities
  - 9-4-2. これまでに販売されたiOSデバイスのBLE 対応状況一覧


####10. 開発ツール・ユーティリティ

> 本章では、BLEを利用したiOSアプリ開発に役立つ開発ツールや、
コマンドラインユーティリティを紹介していきます。

- 10-1. 128ビットUUIDを生成するコマンド「uuidgen」
- 10-2. 開発に便利なiOSアプリ「LightBlue」
- 10-3. Apple 製開発用ツール「Bluetooth Explorer」
- 10-4. 「PacketLogger」でBLEのパケットを見る

####11. ハマりどころ逆引き辞典

> iOSでBLEを利用するアプリを開発していると、
「スキャンで見つからない」「つながらない」といった場面はよく出てきます。
通信相手が新規開発デバイスだとそちらを疑いたくなることもありますが、
iOS側でのよくある実装ミスや勘違いというのも多くあります。
また、原因の判断方法や対処法を知っていれば一瞬で解決できるところを、
それらを知らずに、さまざまな検証やコードの修正のトライ＆エラーで
時間を費やしてしまう、といったこともよくあります。
本章では、そんなiOS×BLE開発におけるよくあるトラブルと、
その解決のためのチェックポイントについて解説します。

- トラブル1：スキャンに失敗する
- トラブル2：接続に失敗する
- トラブル3：サービスまたはキャラクタリスティックが見つからない
- トラブル4：Writeで失敗する
- トラブル5：キャラクタリスティックの値がおかしい
- トラブル6：バックグラウンドでのスキャンが動作しない
- トラブル7：バックグラウンドのペリフェラルが見つからない
- トラブル8：セントラルの「状態の保存と復元」に失敗する
- トラブル9：ペリフェラルの「状態の保存と復元」に失敗する
- トラブル10：iBeaconが見つからない

####12. BLEを使用するiOSアプリ レシピ集

> これまでの章では、何らかのAPI や機能を説明するための単機能サンプルを提示してきましたが、
ここではそれらの機能を横断的に扱うアプリのレシピを提示し、その実装のポイントを解説します。
4つのレシピはiOS×BLEの分野において人気のある題材を集めつつ、
本書の内容がまんべんなく復習できるような内容にしてあります。

- レシピ1：心拍数モニタアプリ
- レシピ2：活動量計デバイスとアプリ
- レシピ3：ジェスチャ認識ウェアラブルデバイス&アプリ
- レシピ4：すれちがい通信アプリ

**Appendix. BLEを使ったサービスを開発するということ**