公共電波が要らないチャットアプリをリリースしてみた
興味があったので勉強がてらにチャットアプリをAppleストアにリリースしてみた。
その際に勉強したことを書きます。
リリースしたアプリ
iOS App
BLE Messenger Lite by Ohkubo Yuhei
Mac App
BLEMes by Ohkubo Yuhei
このアプリで何ができる?
災害が発生した場合にWi-Fiなどの公共電波が使えない状態になることを想定し、端末から発信するBluetoothだけで通信ができるアプリ。Mac版とiOS版の相互互換があり、メッセージに関しては異なる種類のデバイスに送信できる。
作った理由
そういえば圏外のときってスマホ使えないんだっけ?と疑問に思いBluetoothにたどり着いた。あまり見かけない通信方法だったが、
「iOS×BLE Core Bluetoothプログラミング」
この本を読んで応用できるんではないかと思ったのがきっかけ。
このアプリを使う上でのメリットは
- ネットワークが用意されていない環境でも通信ができる
- 友達申請が不要。近くにいるアプリ起動中の端末なら誰でもチャットができる
- GATTが使えるので、ロジックの実装に幅が出る。プログラムでできることなら、実装次第で色々できてしまう
デメリットは
- Wi-Fi、4Gなどの利用に慣れているユーザにとっては大量データの送受信の通信速度がパフォーマンスが悪く、MB単位を超える通信はキツい
機能について
機能はLINEに似ているが、個人で作っている分圧倒的に少ない。
- メッセージ送受信にCoreBluetoothを使って通信を行う。bluetoothをON、かつアプリを起動しているユーザに対してメッセージ送受信を行う
- トークリストに送信可能なユーザには圏内表示をし、選んだユーザに対してトーク画面にてメッセージを送信する
- バックグラウンドでのメッセージ受信に対応しており、アプリがフォアグラウンドにいなくても通信が可能
- 受信時のプッシュ通知を表示する。または通知受信可否、バイブレーションのON/OFF切り替え機能
- LINEに似たUIで実装
- アプリ内課金にて背景色を変更できるアイテムを実装
- iOSアプリのみメッセージの他に画像、音声を送信可能* 非表示・ブロック機能を実装
開発環境について
このような開発環境で実装した。
言語について
開発言語については本職のObjective-Cにしようか迷ったが、現在進行形の言語であるSwiftにした。Swift2.3からと、思えばかなり前から実装してたんだな。Swift4.0メジャーアップデート後の対応はビルドエラーの海だったが調べながら進め、無事解決した。
詰まりどころ
送信バイト数に上限があるのはなんとなくわかっていたが、それにしても少なすぎる。もともとデータ通信用ではないしそれを無理やり使っているので仕方ないか。
単一で大きいファイルは送れないか、設計の段階で考えた。よくありがちな分割送信を思いつき実装したらうまくいった。
- 画像などを通信したい場合はデータを分割して送信する実装にする必要がある。主に画像データはバイナリデータに変換してあげれば送受信できる。実装する際は一度あたりの送信データ量が制約を超えていないか確認しておく
- 画像や長文テキストなどデータ量が上限を超える場合は、データを分割して送信し受信側で結合しデータを復元する。データは送信元で圧縮しそれを受け取った受信側で解凍する仕組み
ライブラリについて
ライブラリは一般的な最低限を利用している。
- libsqlite3.tbd : アドバタイズにて発生するユーザ、チャット送受信データを格納するため使用。ラッパーライブラリはFMDBを使用
- CoreBluetooth : このアプリでCoreBluetoothの通信を行う際に必要なライブラリ
- Toast : エラーメッセージをユーザに知らせるために使用
開発中に思ったこと
iOSはbluetoothをキャッシュするため解放する必要があるが、bluetoothのON/OFFをデバイス操作から行う。これを実装で解決する方法を模索したが見つからず、今後の課題となっている。
実際に使ってみての感想
実用性を図るため海外に行った時に試してみたが、simを用意していないときに非常に役に立った。
所感
チャットアプリを作るいい経験になった。