具有导入的UTI的文件在UIDocumentPickerViewController中显示为灰色

问题描述 投票:3回答:1

在我的iOS应用程序中,我打开一个UIDocumentPickerViewController来导入.sty文件(MIDI样式)。为此,我在导入的UTI和文档类型中声明了一个自定义UTI。

问题是在我的客户的iPad Air 2上,这些文件在对话框中显示为灰色,因此无法导入它们。在我的iPad Air 2上,它们不会变灰,我可以成功导入它们。使用iCloud Drive和Dropbox作为文件提供程序时,我们都可以看到这一点。

我们的设备有什么不同?我的客户通过TestFlight将应用程序安装为内部测试人员。

此外,Import UTI中的文件扩展名是否区分大小写?我不这么认为。

然后我想知道是否应该添加文档类型图标。根据参考,不需要图标。

iCloud Documents已启用:enter image description here

以下是介绍UIDocumentPickerViewController的代码:

let utis = [String](PlaylistItem.utiToType.keys)
let viewController = UIDocumentPickerViewController(documentTypes: utis, in: .import)
viewController.delegate = self
viewController.modalPresentationStyle = .formSheet
if #available(iOS 11, *) {
    viewController.allowsMultipleSelection = true
}
self.present(viewController, animated: AppDelegate.isAnimationsEnabled, completion: nil)

PlaylistItem类中定义UTI:

enum FileType: Int {
    case other
    case mid
    case mp3
    case m4a
    case aiff // AIFF audio recording
    case wave
    case turboMidi // purchased MIDI file
    case style
}

static let kUTTypeStyleYamaha = "com.turboreini.style" // matches document types in Info.plist

static let utiToType: [String: FileType] = [
    kUTTypeMPEG4Audio as String: .m4a,
    kUTTypeMP3 as String: .mp3,
    kUTTypeMIDIAudio as String: .mid,
    PlaylistItem.kUTTypeStyleYamaha: .style
]

这是从Xcode 9:enter image description here捕获的文档类型

......和进口的UTI部分:enter image description here

请注意,我为样式文件选择了一个任意标识符,因为我在互联网上找不到正式的标识符。

这个问题让我抓狂。我找不到任何错误。

我想知道它是否依赖于其他安装的应用程序。

除了导入.sty文件外,该应用程序还会创建自己的自定义文件,并使用自己的扩展名。为此,我定义了一个导出的UTI。它工作正常,没有文件灰显。但导入.sty文件的解决方案不应该是将条目从导入的UTI移动到导出的UTI。我的应用程序只是.sty文件的“查看器”。

关于这个案子的任何想法都将非常感激。

ios icloud uti uidocumentpickerviewcontroller
1个回答
2
投票

事实证明,在我的客户的iPad上安装了另一个应用程序,可能也有自己的UTI用于.sty扩展。一旦我将它安装在我的iPad上,我就可以重现这个问题。

不幸的是,我还没有能够查看该应用程序的Info.plist进行确认。

但是,感谢Cocoanetics我发现了一个允许我查询系统的API:

let pathExt = "sty"
if let utiArray = UTTypeCreateAllIdentifiersForTag(kUTTagClassFilenameExtension, pathExt as NSString, nil)?.takeRetainedValue() as? [String] {
    print("Have UTIs for .\(pathExt):")
    for uti in utiArray {
        if let dict = UTTypeCopyDeclaration(uti as NSString)?.takeUnretainedValue() as? [String: Any] {
            print("\(uti) = \(dict)")
        }
    }
}

此代码将根据文件扩展名向我显示安装在iPad上的所有应用程序中声明的UTI。事实上,其他应用程序出现了。但我仍然无法看到它是否被声明为导出或导入的UTI。

解决方法是卸载冲突的应用程序。

对我来说,这是UTI系统的一个缺陷。我将尝试联系.sty文件(MIDI样式,而不是LaTeX文件)的制造商,要求他们提供适当的UTI,所有开发人员都应该遵守。

似乎需要UTI的全球登记。 Apple has already created a collection,但只涵盖最受欢迎的类型。

© www.soinside.com 2019 - 2024. All rights reserved.