【问题标题】:Files with imported UTIs are greyed out in UIDocumentPickerViewControllerUIDocumentPickerViewController 中带有导入的 UTI 的文件显示为灰色
【发布时间】:2019-01-31 10:22:27
【问题描述】:

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

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

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

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

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

iCloud 文档已启用:

这是显示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 捕获的文档类型:

…和导入的尿路感染部分:

请注意,我为样式文件选择了任意标识符,因为我在 Internet 上找不到官方标识符。

这个问题让我发疯。我找不到任何问题。

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

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

对此案的任何想法将不胜感激。

【问题讨论】:

  • .sty 也被 LaTeX 等其他文件格式使用。 jour 客户可能有一个应用程序将 .sty 声明为另一个 UTI?
  • 感谢您的想法。事实上,我们发现另一个应用程序通过声明(可能)另一个用于 .sty 文件的 UTI 来干扰,尽管它也是一个可以加载样式文件的音乐应用程序。

标签: ios icloud uti uidocumentpickerviewcontroller


【解决方案1】:

事实证明,在我客户的 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。

似乎需要一个全球尿路感染登记处。 Apple has already created a collection 但仅涵盖最流行的类型。

【讨论】:

  • Cocanetics 链接是一个很好的资源。它有几个函数(在 Objective C 中,对我来说很幸运)用于检查现有的 UTI 定义以及哪些应用程序正在创建它们。我假设从原始开发人员的应用程序中复制专有定义是一个安全的选择。对于没有专有或标准化定义的文件类型,我发现我必须使用它符合的 UTI——例如,我使用 public.text 来定位 .chordpro 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
相关资源
最近更新 更多