0
Help us understand the problem. What are the problem?

posted at

updated at

SwiftでMultipeer Connectivityを使ってUIImageを送信する

目次

はじめに

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の送信については他にもっと良い方法があるかもしれませんが、私の書いた方法が少しでもお役に立てば幸いです。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?