在我的iOS应用中,我正在打开UIDocumentPickerViewController
来导入.sty文件(MIDI样式)。为此,我在导入的UTI和文档类型中声明了自定义UTI。
问题是,在我客户的iPad Air 2上,这些文件在对话框中显示为灰色,因此他无法导入它们。在我的iPad Air 2上,它们没有变灰,我可以成功导入它们。当使用iCloud Drive和Dropbox作为文件提供程序时,我们都可以看到这一点。
我们的设备可能有什么不同?我的客户通过TestFlight将应用安装为内部测试仪。
此外,“导入UTI”中的文件扩展名是否区分大小写?我不会这样。
然后我想知道是否应该添加文档类型图标。根据参考,该图标不是必需的。
以下是显示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
]
请注意,我为样式文件选择了一个任意标识符,因为我无法在互联网上找到正式的标识符。
这个问题使我发疯。我找不到任何错误。
我想知道这是否取决于其他已安装的应用程序。
除了导入.sty文件外,该应用程序还创建带有扩展名的自定义文件。为此,我定义了一个导出的UTI。它工作正常,没有文件变灰。但是,导入.sty文件的解决方案不应是将条目从“已导入”到“已导出” UTI。我的应用程序只是.sty文件的“查看者”。
对此案的任何想法将不胜感激。
答案 0 :(得分:2)
事实证明,在我客户的iPad上安装了另一个应用程序,该应用程序也可能具有针对.sty扩展名的自己的UTI。将其安装在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,但仅涵盖最受欢迎的类型。