目次
はじめに
SwiftでMultipeer Connectivityを使用してUIImageを送信する方法をまとめました。
Multipeer Connectivityの基本的な使い方はこちらの記事を参考にしました。
→Multipeer ConnectivityでのP2P通信(Swift)
環境
- Xcode13.2.1
- Swift5
sendメソッドでUIImageを送信すると時間がかかる
MCSessionクラスのsendメソッドでUIImageの送信を行う場合は、文字列の送信と比較するとデータ量が大きい為、時間がかかります。
5枚のUIImageを一度に送信した場合には、送信が完了するまで30秒〜2分程度かかりました。
(文字列を送信した場合は1秒もかからず処理が完了します。)
sendメソッドはData型であれば文字列に限らず送信できますが、
UIImageを複数送信したい場合には、適切な方法ではなさそうです。
UIImage送信をスムーズに行う為の解決策
ここからはUIImageをスムーズに送信する為の方法について、私が試したものを記載します。
①sendResouceメソッドを使用する
Multipeer ConnectivityにはsendResourceというメソッドが用意されています。
こちらを使用すれば、多くの場合スムーズなUIImageの送信が可能になります。
特別な事情がない限りはこちらの方法がおすすめです。
※ただしこの方法の場合は、引数にresourceのurlを指定する必要があるので、
FileManagerを使ってアプリ内部のディレクトリに画像を配置する等、UIImageをURLに変換して管理する必要があります。 (FileManagerで管理する方法はこちらが参考になりました。)
②sendメソッドを複数回呼ぶ方法で実装する
UIImage複数を1つのDataとして送信するのではなく、UIImage1つにつき1回ずつsendメソッドを呼ぶと、送信速度が速くなりました。
(反対に、一度に送信するDataの量が大きすぎると、通信処理が途中で止まってしまうこともありました。)
私は画像をUIImageのまま管理したかったので、sendResouceメソッドは使用せずこちらの方法で実装しました。
この方法でも処理はまあまあ重くなってしまうので、インジケータを実装したり、処理をしつつユーザーを次のアクションに進ませる等の工夫が必要だと思います。
③OGP画像として送信する
OGP画像ならString型で画像を管理できデータが軽くなる為、送信しようとしているデータがOGP画像で代替できる機能を提供している場合は、この方法を検討しても良いかもしれません。
参考コード
sendメソッドを使用した場合の参考コードを載せておきます。
// UIImageの配列を用意する
let animalImageList = [UIImage(named: "cat"), UIImage(named: "dog"), UIImage(named: "monkey")]
// 配列をfor文で回す
for animalImage in animalImageList {
// UIImage型からData型に変換する
if let imageData try! NSKeyedArchiver.archivedData(withRootObject: animalImage, requiringSecureCoding: false) {
do {
// sendメソッドでData型にした画像を接続中の別端末に送信する。
try self.session.send(imageData, toPeers: self.session.connectedPeers, with: .unreliable)
} catch let error {
// 失敗した場合はこちらに入る
print("エラーだよ:\(error)")
}
}
}
さいごに
Multipeer Connectivityは端末同士のP2P通信でデータを送信できる便利なフレームワークです。
UIImageの送信については他にもっと良い方法があるかもしれませんが、私の書いた方法が少しでもお役に立てば幸いです。