Совместное использование файлов с использованием UIActivityViewController / UIDocumentInteractionController не работает - [невозможно поделиться через AirDrop, Whatapp, iMessage, Mail и т. Д.]

При попытке поделиться файлом .mp3, который я загрузил в свое приложение, с помощью функции общего доступа устройства, я могу получить файл из каталога документов, но не могу поделиться им.

Когда я пытаюсь поделиться им через Whatsapp, я получаю сообщение об ошибке:

Этим элементом нельзя поделиться. Пожалуйста, выберите другой элемент.

Если я делюсь через AirDrop, отображается просто сообщение Failed (красным), а совместное использование с помощью других параметров приводит к пустому сообщению (например, новое электронное письмо без прикрепленного файла или новое сообщение, в котором ничего нет)

Вот варианты кода, которые я пробовал до сих пор:

Вариант 1. Использование UIActivityViewController

let fileURL = NSURL(fileURLWithPath: FileURLFromDocumentsDirectory)

var filesToShare = [Any]()

filesToShare.append(fileURL)

let activityViewController = UIActivityViewController(activityItems: filesToShare, applicationActivities: nil)

self.present(activityViewController, animated: true, completion: nil)

Вариант 2 - Использование UIDocumentInteractionController

let docController : UIDocumentInteractionController?
docController = UIDocumentInteractionController(url: URL(string: fileToSharePath)!)
docController?.delegate = self
docController?.presentOptionsMenu(from: self.view.frame, in:self.view, animated:true)

В обоих вариантах я получаю файл, но не могу поделиться им. Телефон распознает общий ресурс как аудиофайл, но я ничего не могу с ним сделать.

Пример URL:

файл: ///Users/UserName/Library/Developer/CoreSimulator/Devices/C8B09E62-091F-4E61-BA6C-3D9EC23LKC01/data/Containers/Data/Application/EF2CKKJF-AB35-55G5-B778-439812EFGGG

Совместное использование работает для текста, но не для аудиофайлов.

Нужно ли мне также включать некоторые функции или добавлять код в AppDelegate?

Ценю любую помощь. Спасибо.

Обновление №1: код с предложениями от @dfd [все еще не работает]

let shareAction = UIContextualAction(style: .normal, title: "Share") { (action, view, completionHandler) in
            
    let fileURL = NSURL(fileURLWithPath: (downloadedFile?.documentDirectoryURL)!)

    let activityViewController = UIActivityViewController(activityItems: [fileURL], applicationActivities: nil)

    self.present(activityViewController, animated: true, completion: nil)
                
}

Кроме того, для всех этих опций я получаю аудиофайл (mp3) как «Аудиозапись» на листе общего доступа.


comment
В какой строке вы добавляете аудиофайл в filesToShare?   -  person El Tomato    schedule 04.01.2021
comment
Итак, вот последовательность: файлы, загруженные и сохраненные на диск ›пользователь загружает их в tableView› смахивает, чтобы увидеть и щелкнуть действие «Поделиться» - приведенный выше код вызывается в методе делегата «leadSwipeActionsConfigurationForRowAt», где я сначала вызываю объект, чтобы получить URL-адрес. аудио, а затем передайте его в коде выше. Я пропустил шаг? (Я получаю аудиофайл в общем листе, просто не могу передать его оттуда в другие приложения или AirDrop)   -  person zaam    schedule 04.01.2021
comment
Это только предположение, но пробовали ли вы более конкретный код? Чтобы использовать UIActivityViewController с определенными типами файлов и / или типами действий, вам может потребоваться (а) не делать ваши файлы [Any] и (б) удалить их из исключенных типов действий.   -  person dfd    schedule 04.01.2021
comment
Спасибо, я попробовал это еще раз, убедившись, что я не преобразую файлы в какие-либо, а просто передаю URL-адрес файла непосредственно в activityController, но это все еще не работает. Файл, который я получаю в shareSheet, распознается как «аудиозапись» - это правильный тип для mp3? Код с вашими предложениями см. В обновленном посте (может, я что-то делаю не так?) - также я не включил никаких исключенных типов для любого из вариантов.   -  person zaam    schedule 04.01.2021


Ответы (1)


Вместо того, чтобы делиться исходным файлом, можете ли вы попробовать создать его копию во временном каталоге и поделиться этой копией. После завершения совместного использования вы можете удалить или оставить его на усмотрение системы.

Примерно так (вы можете добавить дополнительную проверку существования файла и каталога):

let fileManager = FileManager.default
let tempDirectory = fileManager.temporaryDirectory
let tempPath = tempDirectory.path + "/" + fileToSharePath.lastPathComponent
let tempURL = URL(fileURLWithPath: tempPath)
try? fileManager.copyItem(atPath:fileToSharePath.path , toPath: tempPath)


let docController : UIDocumentInteractionController?
docController = UIDocumentInteractionController(url: URL(string: tempURL)!)
docController?.delegate = self
docController?.presentOptionsMenu(from: self.view.frame, in:self.view, animated:true)
person Manish Punia    schedule 06.01.2021
comment
Спасибо. Это был творческий подход, но, к сожалению, не сработал. Похоже, столкнулся с той же проблемой - нельзя делиться по каким-либо каналам. TempURL, который я получил при совместном использовании, был file: ///private/var/mobile/Containers/Data/Application/56C0AA16-BAE5-497B-AD21-57C6DFL5C137/tmp/audio.mp3 - соответствует исходному методу, но все еще не Работа. Кроме того, я исправил третью последнюю строку и передал tempURL напрямую, поскольку он уже был преобразован как URL (а не строка) - на случай, если кто-то другой попробует это. - person zaam; 06.01.2021
comment
Мне интересно, нужно ли нам делать какие-то записи в файле plist или включать некоторые возможности, чтобы разрешить совместное использование ... не могу понять, хотя ... - person zaam; 06.01.2021
comment
Интересно, что для этого не нужно ничего добавлять в plist. Вы видите какие-либо ошибки в консоли при совместном использовании? Вы сталкиваетесь с проблемой только с аудиофайлами или другими файлами? - person Manish Punia; 07.01.2021
comment
Никаких ошибок. На данный момент только аудиофайлы. Я могу поделиться текстом без проблем. - person zaam; 07.01.2021