CAMEL BLOG

興味あること、達成したことについて書きます。

公共電波が要らないチャットアプリをリリースしてみた

興味があったので勉強がてらにチャットアプリをAppleストアにリリースしてみた。

その際に勉強したことを書きます。

 

リリースしたアプリ
iOS App

BLE Messenger Lite by Ohkubo Yuhei

BLE Messenger

BLE Messenger

  • Ohkubo Yuhei
  • Social Networking
  • Free

 


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アプリのみメッセージの他に画像、音声を送信可能* 非表示・ブロック機能を実装

 

開発環境について

このような開発環境で実装した。

  • Xcode 9.2iOS 10.2
  • iPhone5ciOS 11.2.5
  • iPhoneSEiOS 10.2
  • iPad mini(動作確認用に上記iOS端末を用意)

 

言語について

開発言語については本職のObjective-Cにしようか迷ったが、現在進行形の言語であるSwiftにした。Swift2.3からと、思えばかなり前から実装してたんだな。Swift4.0メジャーアップデート後の対応はビルドエラーの海だったが調べながら進め、無事解決した。

 

詰まりどころ

送信バイト数に上限があるのはなんとなくわかっていたが、それにしても少なすぎる。もともとデータ通信用ではないしそれを無理やり使っているので仕方ないか。

  • iOSのCoreBluetoothを使って送受信できるプロトコルのうち、自由に利用可能なのはGATTのみ。GATTは一度にemitできるデータ量は512Byteが上限。

単一で大きいファイルは送れないか、設計の段階で考えた。よくありがちな分割送信を思いつき実装したらうまくいった。

  • 画像などを通信したい場合はデータを分割して送信する実装にする必要がある。主に画像データはバイナリデータに変換してあげれば送受信できる。実装する際は一度あたりの送信データ量が制約を超えていないか確認しておく
  • 画像や長文テキストなどデータ量が上限を超える場合は、データを分割して送信し受信側で結合しデータを復元する。データは送信元で圧縮しそれを受け取った受信側で解凍する仕組み

 

ライブラリについて

ライブラリは一般的な最低限を利用している。

  1. libsqlite3.tbd : アドバタイズにて発生するユーザ、チャット送受信データを格納するため使用。ラッパーライブラリはFMDBを使用
  2. CoreBluetooth : このアプリでCoreBluetoothの通信を行う際に必要なライブラリ
  3. Toast : エラーメッセージをユーザに知らせるために使用

 

開発中に思ったこと

iOSbluetoothをキャッシュするため解放する必要があるが、bluetoothのON/OFFをデバイス操作から行う。これを実装で解決する方法を模索したが見つからず、今後の課題となっている。

 

実際に使ってみての感想

実用性を図るため海外に行った時に試してみたが、simを用意していないときに非常に役に立った。

 

 

所感

チャットアプリを作るいい経験になった。