iOS импортирует файлы в мое приложение
Я создаю приложение для iOS, с помощью которого пользователи могут распечатывать файлы на своем устройстве. Из моего приложения я могу получить доступ к файлам на устройстве, хотя DocumentPicker
предоставлены другими приложениями, такими как iCloud Drive, Dropbox и т. д.
Теперь я хочу добавить функциональность, где пользователь может поделиться файлом с моим приложением через другое приложение. Я создал Action Extension
для этого. Например, если я выберу изображение в приложении "Фотографии" и выберу Share
Я получаю свое расширение в листе "Поделиться", и когда я его выбираю, я также получаю URL-адрес файла. Затем я создаю zip-файл этого файла, чтобы отправить его на мой сервер. Но проблема в том, что почтовый файл всегда пуст. Код, который я использую, как показано ниже:
В расширении Action viewDidLoad()
if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) {
itemProvider.loadItemForTypeIdentifier(kUTTypeImage as String, options: nil,
completionHandler: { (image, error) in
NSOperationQueue.mainQueue().addOperationWithBlock {
print("Image: \(image.debugDescription)")
//Image: Optional(file:///Users/guestUser/Library/Developer/CoreSimulator/Devices/00B81632-041E-47B1-BACD-2F15F114AA2D/data/Media/DCIM/100APPLE/IMG_0004.JPG)
print("Image class: \(image.dynamicType)")
//Image class: Optional<NSSecureCoding>
self.filePaths.append(image.debugDescription)
let zipPath = self.createZip(filePaths)
print("Zip: \(zipPath)")
}
})
}
И мой createZip
Функция выглядит следующим образом:
func createZipWithFiles(filePaths: [AnyObject]) -> String {
let zipPath = createZipPath() //Creates an unique zip file name
let success = SSZipArchive.createZipFileAtPath(zipPath, withFilesAtPaths: filePaths)
if success {
return zipPath
}
else {
return "zip prepation failed"
}
}
Есть ли способ, которым я могу создать почтовый индекс общих файлов?
1 ответ
Ваша основная проблема заключается в том, что вы добавляете вслепую image.debugDescription
к массиву, который ожидает путь к файлу. Выход из image.debugDescription
совсем не правильный путь к файлу. Вам нужно использовать правильную функцию на image
чтобы получить фактический путь к файлу.
Но image
объявлено, чтобы иметь тип NSSecureCoding
, На основании результатов image.debugDescription
, Кажется, что image
действительно типа NSURL
, Так что вам нужно конвертировать image
для NSURL
используя строку вроде:
if let photoURL = image as? NSURL {
}
Когда у вас есть NSURL
, вы можете использовать path
свойство, чтобы получить актуально необходимый путь.
Итак, ваш код становится:
if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) {
itemProvider.loadItemForTypeIdentifier(kUTTypeImage as String, options: nil,
completionHandler: { (image, error) in
if let photoURL = image as? NSURL {
NSOperationQueue.mainQueue().addOperationWithBlock {
let photoPath = photoURL.path
print("photoPath: \(photoPath)")
self.filePaths.append(photoPath)
let zipPath = self.createZip(filePaths)
print("Zip: \(zipPath)")
}
}
})
}
Подсказка: никогда не используйте debugDescription
за что-то кроме print
заявление. Его вывод - это просто строка, которая может содержать практически любую информацию, и этот вывод может меняться от одной версии iOS к другой.