iOSDC Japan 2016で発表しました

iOSDC Japan 2016 でアクセサリを使用するiOSアプリ開発について発表しました。

speakerdeck.com

内容は主に次のようなものです。

  • アクセサリ種類増えてきていろいろなものがiOSバイスとつながるようになってきた。Pokemon Go Plusでアクセサリを使うアプリがいよいよマスにもヒットしそう。
  • アクセサリの接続方法やフレームワークiOSの進化に合わせて種類が増えていて、アクセサリを使うアプリ開発をする場合は、どのフレームワークを使っていくのか、慎重に検討する必要がある。
  • App Store ReviewやiOSのバグなど、つきもののトラブル付き合っていくにはどうすればいいか、実例を紹介。

カンファレンスについて 第1回とは思えないレベルの高い運営に驚きました。発表の機会を用意していただいた、スタッフの皆さまに感謝します。ありがとうございました。

次回は是非、若い人たちの参加を期待したいです。コミュニティの若さを保つためにも、学生さんの発表や参加がたくさん見られるとうれしいですよね。開発だけでなく、教育現場でモバイルデバイスをどう使っているか?とかも聞いてみたいですね。

(自分もWWDCに学生枠で招待してもらってこの世界に入ってきたので、後に続く人たちにも同じような機会を作れるといいなと思っています!)

あと、発表時の写真、持ってる人がいればください!

「Swift+Core DataによるiOSアプリプログラミング」レビュー

「Swift+Core DataによるiOSアプリプログラミング」の読者モニターに当選したので、内容の紹介と感想について。

iOSアプリ開発の中でも難解なデータ保存のためのフレームワーク、Core Dataを使用するアプリ開発のための解説書です。

Core Dataに関する情報は数が限られていて、Objective-C時代のものがメインでした。正直もうCore Dataに関する書籍は出てこないだろうと思っていた矢先に登場したのでちょっとびっくりしました。書籍の構成としては、チュートリアル形式でCore Dataを使用したベーシックなアプリを作成しながら、フレームワークの知識を取得していく形式となっています。

最低限アプリ開発に必要なUIKitなどの基礎も触れられているので、突き放される感じがないのはよいです。Core Dataを扱った他の書籍ではこの辺りを完全に省略してしまっているものが多いので、丁寧だと感じました。

サンプルコードで使用しているSwiftのコードも、奇をてらったものではなく、鉄板のような感じで、安心して勧めることができると思います。Objective-CからSwiftに乗り換えようとしている人にも読みやすいコードだと感じます。

逆に、Swiftで取り入れられている、Protocol Extension, Value Typeを使ったプログラミングスタイルについては触れられていないので、そのような知識がほしい方には物足りないかもしれません。たとえば: Let's Play '巨大ビューコントローラをリファクタリングしよう!' with Andy Matuschak - Realm is a mobile database: a replacement for SQLite & Core Data

後半の章では最新のiOSで追加されたCore Dataの機能が登場します。非同期フェッチやiCloudとの連携など、iOSのアップデートとともに登場した新しい機能がフォローされているので、iOSの黎明期からCore Dataに触れられている方にも新しい発見があるでしょう。

おまけ

-アイロンビーズの表紙かわいい :)

iCloudの不調(解決済み)

iCloudSafariのブックマーク同期ができなくなってしまった。 現象としては、 Mac側でブックマークを編集しても編集前の状態に戻ってしまう。 iPhone側で行ったブックマークの変更がサーバに送信されない。

Appleのサポート担当の方に助けてもらい、最終的にOS再インストールまで進めたが結局問題は解決せず、エンジニアリング分門へのエスカレーションとなった。今の所同様の問題が確認できていて、修正を急いでいるとのこと。

iCloudでデータ不整合が起こると、ユーザ側から手出しが一切できなくなってしまう。バックアップを取った上でサーバ上のDBをクリアするような機能がほしい...

追記 やはりサーバ側でDBをリセットすることになった。

追記その2 対処してもらったものの、改善せず。原因はサポート側で引き続き調査中。

追記その3 OS Xを10.11.4 に更新したところ同期が復活。OS Xの不具合だったのか、アップデートのプロセスで問題あるデータが消されたのかはわからないがとりあえず解決。

Bluetooth Low Energy Advent Calendar 2015 12/24 tvOSでCoreBluetoothを使用する

qiita.com

tvOSでは従来のiOSに存在するフレームワークから多くのものが削られていますが、CoreBluetoothは残されていました。

ただし、従来のiOSで実装されていたすべての機能が使えるわけではありません。確認できた中では、以下の制限が加わっています。

  • CBCentralManagerは使えるが、CBPeripheralManagerを使うことはできない。
  • 同時に接続できるPeripheralは2台以下に制限される。
  • Background-Runnning状態でCoreBluetoothを使うことはできない。

この制限の下であれば、既存のCoreBluetoothのコードを生かして、Peripheralとのやりとりを行うことができます。 例えば、定番のハートレートモニターに接続することもできますし、iPhoneiPad上でCBPeripheralManagerを使用すれば tvOS <-> iPhoneの通信も可能です。アクセストークンを渡して認証に使用したり、続きをiPhoneで見る、のようなこともできそうです。

参考資料 https://speakerdeck.com/nolili/tvoswokuo-zhang-suru

ハートレートモニターに接続するサンプルコード https://github.com/nolili/BluetoothExampleTV

Macbook Pro Retina Display 15inch (2015)でBootCampドライバのインストールに失敗した。→回避方法

Macbook Pro Retina Display 15inch(2015)でBoot Campを使用して、Windows 8.1 Pro(日本語版)をインストールしたところ、Windowsのセットアップ完了後、Boot Campに必要なドライバのインストールが失敗してしまった。(❌のダイアログが表示され、インストールが中断された)

いつもWindowsで困ったら試している、システムを英語にすることで解消した。

以下手順

  • システムの言語を英語にする。 windows.microsoft.com

の手順に従い、en-usの言語を追加する。

  • 「主に使用する言語に設定する」選択して、システム言語を変更する。

  • サインアウトし、再度サインインする。

  • Boot Campアシスタントで作成したUSBメモリ内のBootcamp/setup.exeを実行し、Boot Camp関 連ソフトウェアのインストールを行う。

デモ・展示会場の無線LAN設営メモ

急ぎで動作デモの無線LAN構築をしたので、これまでのノウハウをまとめておく。

  • 11a(5GHz)を使う。

.11bgn(2.4GHz)は使い物にならないことが多い。リハでは問題がない場合でも、人が集まる会場はポータブルルータなどの持ち込みが増え、通信品質はさらに悪くなる。

  • 5GHzは、W52を使用する。

W53, W56は通信がストップ、またはチャンネル変更が行われることがある。

  • オートチャンネルセレクトをオフにする。必要がなければ、デュアルチャネルもOFFにする。

  • ルーター・スイッチの空きポートはテープなどで塞ぐ。

お客さんや会場のスタッフが誤って抜いてしまったとき、ループするなどの事故を回避する。

市販のWi-FiルータDHCPでリースできる台数が少ないものがある。多数デモ機を接続するときは要確認。

特定の時刻になるとスループットが落ちる機種があるので注意。

  • SSIDをハックする。

名前順でソートした時に先頭に出るようなSSIDにする。あとはわかるな。

CoreBluetooth CBPeripheralを発見する3つの方法

iOSのCoreBluetoothを使ってPeriphralに接続するには、Peripheralのインスタンス、CBPeripheralを取得する必要があります。 一般には、CBCentralManagerのscanForPeripheralを使用して、Advertisement Packetを送信しているPeripheralをスキャンする方法がとられます。 しかし、そのほかにもマイナーな方法があるので、紹介します。

CBCentralManager -scanForPeripheralWithServices: options:を使用して、周囲のPeripheralをスキャンする。

CBCentralManagerを使用してPeripheralに接続する際、よく使われる方法です。 Peripheralを発見すると、CBCentralManagerDelegateの- centralManager: didDiscoverPeripheral: advertisementData: RSSI:が呼び出されるので、このメソッドの引数からCBPeripheralを取得できます。詳細は割愛します。

CBCentralManager -retrievePeripheralsWithIdentifiers: を使用して、Identifierに対応したCBPeripheralを取得する。

以前接続したことがあるPeripheralのIdentifier(NSUUID)を指定して、CBPeripheralを取得します。該当するPeripheralがあれば、CBPeripheralのインスタンスが格納されたNSArrayが返されます。以前接続したことがあるCBPeripheralのIdentifierをNSUserDefaultsなどに保存しておき、次回接続する、などの使い方ができます。ただし、CBPeripheralのIdentifierは同じPeripheralでも、iOSデバイスごとに違うIdentifierを返すことに気をつけて下さい。iOSデバイスAでPeriphralから取得したUUIDを使用して、iOSデバイスBで使用する、といった使い方はできません。

CBCentralManager -retrieveConnectedPeripheralsWithServices: を使用して、すでにiOSデバイスに接続されているCBPeripheralを取得する。

iOSデバイスとすでに接続されているPeripheralを取得します。例えば、ほかのアプリがすでにPeripheralを探索し接続した状態では、上記のscanForPeripheralWithServices: options:を使用しても、デバイスを発見することができません。すでにCentral(iOSデバイス)と接続されているPeripheralは、Advertisement Packetを送信しない状態になっているためです。そこで、iOSのシステムに対して、すでに接続済みのデバイスで、指定したServiceを持っているデバイスがないか問い合わせを行います。該当するPeripheralがあれば、CBPeripheralのインスタンスが格納されたNSArrayが返されます。

特定の条件下にあるPeripheral(Apple Notification Center Service, Current Time ServiceをSubsclibeしているGATTCを持っている、等)は、iOSが自動的に接続を行ってしまうため、この方法をとる必要があります。