【iOS】データの送信〜Bluetooth?AirDrop?あなたが使うべきは…

【iOS】データの送信〜Bluetooth?AirDrop?あなたが使うべきは…

iOSにおいて、データの送信と言えば…
以前は、Bluetooth
今は、AirDropが主に使われております。

でも、実際は、AirDropもBluetoothで端末同士を接続させてからWi-fiでデータの送信を行っているようなんです。

AirDropはデバイス間の接続確立にBluetoothを利用し、その後のファイル転送にWi-Fiを使用します。具体的には、Bluetoothはデバイス間で互いを検出し、接続を確立するために使用されます。一度デバイス同士が接続されると、ファイルの実際の転送はWi-Fiを介して行われ、これにより高速で効率的なファイル転送が可能になります。

ChatGPTさんとの会話より抜粋

今回は、そんなデータを送信する際に活用する
✅Bluetooth
✅AirDrop
について、もっともシンプルなコード例とメリット・デメリットについてお話します。

結論から言うと…
【AirDrop】しか勝たん!」という事です。

では、早速解説していきましょう。

【iOS】データを送信するには…AirDropとBluetooth

今回、検証したのは、
環境
・MacOS : Sonoma 14.1.2
・Xcode : Version 15.0.1
となっています。

では、早速ですが…
それぞれの機能のもっともシンプルなコード例を紹介しましょう。

【iOS】AirDropでデータを送信するコード例

import SwiftUI

// ActivityViewControllerをラップする
struct ActivityView: UIViewControllerRepresentable {
    var activityItems: [Any]
    var applicationActivities: [UIActivity]? = nil

    func makeUIViewController(context: Context) -> UIActivityViewController {
        let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)
        return controller
    }
    
    func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {}
}

送るデータによって、カスタマイズが必要ですが…
基本的には、このコードだけで、AirDropを起動させ、データを送信することができます!

ただし、ファイルを送信する場合は、そのファイルへのパスまたはURLをactivityItems配列に含める必要があります。例えば、アプリのドキュメントディレクトリにあるファイルを共有する場合、ファイルのURLをactivityItemsに追加します。

たとえばこんな感じ↓

import SwiftUI

struct ContentView: View {
    var body: some View {
        Button("ファイルを送信") {
            // 送信したいファイルのURLを設定
            if let fileURL = Bundle.main.url(forResource: "example", withExtension: "pdf") {
                // 共有シートを表示
                let av = ActivityView(activityItems: [fileURL])
                UIApplication.shared.windows.first?.rootViewController?.present(av, animated: true, completion: nil)
            }
        }
    }
}

めちゃくちゃ簡単ですネ。
では、Bluetoothはどうでしょうか。

【iOS】Bluetoothでデータを送信するには…

このBluetoothが意外と複雑なんです。
とは言っても、説明が困難なので、またまたChatGPTさんに登場して頂きましょう。

import CoreBluetooth

class BluetoothManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
    var centralManager: CBCentralManager!
    var connectedPeripheral: CBPeripheral?
    
    // ここにあなたが書き込みたいサービスとキャラクタリスティックのUUIDを設定してください
    let serviceUUID = CBUUID(string: "YOUR_SERVICE_UUID")
    let characteristicUUID = CBUUID(string: "YOUR_CHARACTERISTIC_UUID")
    
    override init() {
        super.init()
        centralManager = CBCentralManager(delegate: self, queue: nil)
    }
    
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            // デバイスのスキャンを開始
            centralManager.scanForPeripherals(withServices: [serviceUUID], options: nil)
        }
    }
    
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        // デバイスを見つけたら接続
        centralManager.stopScan()
        connectedPeripheral = peripheral
        centralManager.connect(peripheral, options: nil)
    }
    
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        // サービスの探索を開始
        peripheral.delegate = self
        peripheral.discoverServices([serviceUUID])
    }
    
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        guard let services = peripheral.services else { return }
        for service in services {
            // キャラクタリスティックの探索を開始
            peripheral.discoverCharacteristics([characteristicUUID], for: service)
        }
    }
    
    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        guard let characteristics = service.characteristics else { return }
        for characteristic in characteristics where characteristic.uuid == characteristicUUID {
            // データをキャラクタリスティックに書き込む
            let dataToWrite = "Hello, BLE!".data(using: .utf8)!
            peripheral.writeValue(dataToWrite, for: characteristic, type: .withResponse)
        }
    }
}

はい。
理解する気ありますか?
もちろん、それぞれのアプリに合わせて、コードのカスタマイズが必要ですが…
同じように、Bluetoothで端末同士を接続しているのに、これだけコードが複雑になるんです。

どっちを利用したいと思いましたか?

さらに…

【iOS】データの送信〜AirDropとBluetoothのメリット・デメリット

注目して欲しいのが、コードよりもメリット・デメリットなんです。
これだけコードが複雑だと、Bluetoothの方がメリットが多い、って思いますよね?

実は、逆なんです(苦笑)。
※あくまで、iOS端末間での比較なので、AndroidではAirDropは使えない、という事は除外します。

機能メリットデメリット
AirDrop・大きなファイルも迅速に転送可能
・エンドツーエンドの暗号化を使用しているので、転送中のファイルのセキュリティが確保されている
・効果的な転送範囲が比較的短いため、デバイスが近くにないと使用できない
Bluetooth・Bluetooth Low Energy(BLE)は非常に省エネルギーであり、バッテリー寿命への影響が少ない
・ペアリング後は、デバイス間で安定した接続を保つことが可能
・Bluetoothの転送速度はAirDropに比べて遅く、大きなファイルの共有には時間がかかる
・ペアリングプロセスが必要であり、初めてのデバイス同士の接続設定には手間がかかることがある

ぱっと見、どうですか?
あくまで、iOS間でのデータ共有が前提なので…
これを見る限り、AirDropでデータ共有させた方がイイ、って思いませんか。

私は、そう感じました!

あとは、それぞれのアプリ、データの特性、型に応じて、カスタマイズするだけ。
是非、参考にしてみてくださいm(_ _)m

最後に…iOS間のデータ共有〜SMSアプリが一番?

最後に…
LINEなどでデータを送れるようになっているので、最終的には、そういうアプリを利用するのがもっとも簡単なんですけどね。
でも、そういう話ではないんです。

あくまで、開発側の話。
別端末の同一アプリ内だけでデータの共有をさせたい場合がありますよね。
って、実は今作っているアプリが、そういうアプリなので、記録を残すために、記事にしたんですけどね(笑)。

是非、そういうアプリを開発することになったら、参考にしてみてください。
では。

<追伸>
今回紹介したコードは、ChatGPT-4(有料プラン)にて、作成して頂きました。
個人で働いている人の必需サービスだと思うんです。
まだ、契約していないあなた!
これを利用しない選択があるのでしょうか。

ホリエモンもこう言ってますしね(笑)。
では。

web17
https://web17.biz

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です