[Swift 3.0] iOSアプリ間でファイルの送受信を行う

2016年10月14日(更新: 2016年10月18日)

iOSでは、あるアプリから写真や動画などのファイルを他のアプリに移動したり、逆にストレージアプリからファイルを受信したりといったことが可能です。

今回はファイルの送受信の機能をアプリに実装する方法について紹介します。

ファイルを他のアプリに送信する

ファイルを送信するには、クラス UIDocumentInteractionController を使用します。

UIDocumentInteractionController – UIKit | Apple Developer Documentation

このクラスは、Safariやストレージ系アプリにある「共有ボタン」を押した時の処理を行ってくれます。

iOSの共有ボタン

サンプルコード

Documentディレクトリにある画像ファイル(test.jpg)を他のアプリに送るサンプルコードです。

// Documentディレクトリ
let documentDir = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, .userDomainMask, true).last!

// 送信するファイル名
let filename = "test.jpg"

// 送信ファイルのパス
let targetDirPath = "\(documentDir)/\(filename)"

let documentInteraction = UIDocumentInteractionController(url: URL(fileURLWithPath: targetDirPath))

if !documentInteraction.presentOpenInMenu(from: self.view.frame, in: self.view, animated: true) {
  // 送信できるアプリが見つからなかった時の処理
  let alert = UIAlertController(title: "送信失敗", message: "ファイルを送れるアプリが見つかりません", preferredStyle: .alert)
  alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
  self.present(alert, animated: true, completion: nil)
}

実行例

実行すると、以下のようなファイルの送信先を選ぶ画面が表示されます。指定した形式のファイルを受け取れるアプリがない場合はアラートを出して警告します。

アプリからファイルを送信するサンプル

ファイルを他のアプリから受信する

ファイルを受け取る場合、プロジェクトでファイルを受け取るための設定が必要になります。それは、受信するファイルの形式を UTIs (Uniform Type Identifiers) の形式で登録することです。

TARGET > Info > Document Types を開き、受信したいファイルの形式を登録します。

例えば、JPEG形式の画像を受け取るには、Typespublic.jpeg を登録します。

Name は自分がわかればどんな名前でもOKです。また、アイコン画像は指定しなければアプリアイコンになるため、特にこだわりがなければ指定しなくても問題ありません。

Document Types の追加例

受け取りたいファイル形式によって、Types に書き込む値が違います。詳しくは以下のページを御覧ください。このページの表の Identifier (Constant) の文字列を Types に入力すると、それに対応するファイルの受信が可能になります。

System-Declared Uniform Type Identifiers

また、この Document Types はプロジェクトの Info.plist からも直接編集することができます。

Info.plist で Document Types を編集

他のプロジェクトでも同じファイル対応設定を使いたいという場合は、Info.plistの値をコピーすると簡単です。

保存場所や方法に指定がない場合は、特にコードを書かなくても、以上の設定でファイルの受け取りができます。この場合、受け取ったファイルの保存場所は以下のディレクトリになります。

~/Document/Inbox/

Inbox というディレクトリが Document の中に自動的に作られます。

実行例

Dropbox から画像ファイル(profile.png)を受け取る例です。受け取りたいファイルを Dropbox で「エクスポート」すると、以下の画面が表示されます。

iOSアプリでのファイルの受信例

ここで「別のアプリで開く…」を選ぶと、上記の設定を行ったアプリが項目に現れます。(この例では FolderSystem というアプリ名になっています)

ファイルが受け取れるアプリの候補

これを選択すると、画像がアプリ内のドキュメントディレクトリに保存されます。実機では以下のようなパスになります。

/var/mobile/Containers/Data/Application/EAAFE4C3-4A40-47E3-AB96-05AD15ACF4C3/Documents/Inbox/profile.png

以上のように別のアプリにファイルを移動させたり、ファイルを受け取ることが可能です。

コメントを残す

メールアドレスが公開されることはありません。