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 к другой.

Другие вопросы по тегам