11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swiftでの外部サービス連携したファイル添付(iCloud、Googleドライブ、Dropbox等)

Last updated at Posted at 2017-04-18

はじめに

こちらは Xcode8.3.1 Swift3.0 で開発したものになります。

今回開発中に、「いろんな添付ファイルをアップロードしたい。」という要望がありました。そこで、どのようなものがいいかなと考えていたら、slackみたいな添付ファイルアップロードシステムを作りたいと思い、調べはじめしました。実装とハマったことを記載します。
ゴールの完成イメージが画像は、下記の画像になります!

Image uploaded from iOS (8).jpg

今回の実装

今回は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つのはまりポイント

  1. icloudの許可をしてあげないとクラッシュする
  2. 添付ファイルの形式を指定してあげないといけない

1.icloudの許可をしてあげないとクラッシュする

Xcode側で許可しないとアプリでクラッシュしてしまいます。その対応は、下記になります。現在、icloudがOFFになっている人は、ONに変更してください。そうすれば問題なく開くようになるはずです!

icloud.png

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

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?