はじめに
こちらは Xcode8.3.1 Swift3.0 で開発したものになります。
今回開発中に、「いろんな添付ファイルをアップロードしたい。」という要望がありました。そこで、どのようなものがいいかなと考えていたら、slackみたいな添付ファイルアップロードシステムを作りたいと思い、調べはじめしました。実装とハマったことを記載します。
ゴールの完成イメージが画像は、下記の画像になります!
今回の実装
今回はappleで基準の UIDocumentMenuViewController
を使って作成しました。
それに加えて、photoLibraryにもアクセスできるようにした。
下記が実装のソースコードです!
let importMenu = UIDocumentMenuViewController(documentTypes: ["public.image", "public.audio", "public.movie", "public.text", "public.item", "public.content", "public.source-code", "public.data"], in: .import)
importMenu.delegate = self
importMenu.addOption(withTitle: "Choose From Library", image: UIImage(named: "picture")!, order: .first, handler: {
let status = ALAssetsLibrary.authorizationStatus()
if status == ALAuthorizationStatus.restricted || status == ALAuthorizationStatus.denied {
// アクセス許可されていない
// ユーザー自身にカメラへのアクセスが許可されていない
self.showErrorAlert(msg: NSLocalizedString("cameraRollNonSet", comment: "cameraRollNonSet"))
} else {
// アクセス許可あり
// ユーザーがアクセス確認をしていない
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
let controller = UIImagePickerController()
controller.delegate = self
controller.sourceType = UIImagePickerControllerSourceType.photoLibrary
self.present(controller, animated: true, completion: nil)
}
}
})
// iPad対応
importMenu.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
importMenu.popoverPresentationController?.sourceView = self.view
importMenu.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.size.width / 2.0, y: self.view.bounds.size.height / 2.0, width: 1.0, height: 1.0)
self.present(importMenu, animated: true, completion: nil)
2つのはまりポイント
- icloudの許可をしてあげないとクラッシュする
- 添付ファイルの形式を指定してあげないといけない
1.icloudの許可をしてあげないとクラッシュする
Xcode側で許可しないとアプリでクラッシュしてしまいます。その対応は、下記になります。現在、icloudがOFFになっている人は、ONに変更してください。そうすれば問題なく開くようになるはずです!
2.添付ファイルの形式を指定してあげないといけない
このdocumentTypesで、アップロードできる形式を決めるように見えます。(確かなことを言ってる気がしない。。)
今回は、画像やテキスト等を全て選択できるようにしています。これを設定されていないと、icloudを開いても、特定のファイルが選択できなくようになってしまうので注意してください。
documentTypes: ["public.image", "public.audio", "public.movie", "public.text", "public.item", "public.content", "public.source-code", "public.data"]
添付したタイミングでの情報取得方法
メソットであります、添付する時に、端末に保存して内部URLを返してくれます。ここで形式を判定してあげるのもいいかもしれないです。ソースコードは、下記になります。
public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) { }
最後に
ぜひとも参考していただると嬉しいです。何か間違え等あったら教えてくださいmm