UIDocumentPickerViewController initWithDocumentTypes 中的 iOS 自定义 UTI
Posted
技术标签:
【中文标题】UIDocumentPickerViewController initWithDocumentTypes 中的 iOS 自定义 UTI【英文标题】:iOS custom UTI in UIDocumentPickerViewController initWithDocumentTypes 【发布时间】:2017-06-26 18:40:11 【问题描述】:我正在尝试在我的应用程序中从 iCloud 驱动器打开 .obj 文件,抛出 UIDocumentPickerViewController。我找不到 .obj 文件的标准 UTi。所以,使用这个https://developer.apple.com/library/content/qa/qa1587/_index.html,我尝试为我的应用添加对这个文件扩展名的支持。
有 info.plist 部分:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>arrow1</string>
</array>
<key>CFBundleTypeName</key>
<string>OBJ model</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.giena.Interface.obj</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>OBJ model</string>
<key>UTTypeIdentifier</key>
<string>com.giena.Interface.obj</string>
<key>UTTypeSize320IconFile</key>
<string>arrow1</string>
<key>UTTypeSize64IconFile</key>
<string>arrow1</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>obj</string>
</array>
</dict>
</dict>
</array>
还有 UIDocumentPickerViewController 调用:
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"public.text"] inMode:UIDocumentPickerModeOpen];
documentPicker.delegate = self;
documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentViewController:documentPicker animated:YES completion:nil];
当我运行应用程序时,我看到用于文件选择的弹出视图,但 .obj 文件是灰色的且不可选择。我做错了什么?
【问题讨论】:
它看起来像一个错误......今天我尝试使用虚拟文件扩展名 .tst 和 .xxxx 执行此操作,并且它工作正常。但是使用 .obj 扩展名我遇到了问题。 您正在尝试选择 .obj 文件,但您在文档类型中提到了“public.text”。如果你解决了这个问题,你能告诉我自定义扩展的确切含义吗? 【参考方案1】:您应该在文档类型列表中使用您的自定义 UTI:
UIDocumentPickerViewController *documentPicker =[[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"com.giena.Interface.obj"] inMode:UIDocumentPickerModeOpen];
【讨论】:
【参考方案2】:你必须这样写:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array/>
<key>CFBundleTypeName</key>
<string>OBJ model</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>obj</string>
</array>
</dict>
</array>
<key>CFBundleTypeIconFiles</key>
<array/>
<key>CFBundleTypeName</key>
<string>Obj file</string>
<key>LSItemContentTypes</key>
<array>
<string>com.giena.Interface.document.obj</string>
</array>
</dict>
</array>
和
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>OBJ model</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>com.giena.Interface.document.obj</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>obj</string>
</array>
</dict>
</dict>
<dict/>
</array>
在你的控制器中你也必须这样写:
let documentPicker = UIDocumentPickerViewController(documentTypes: ["com.giena.Interface.document.obj"], in: .import)
它应该可以工作
【讨论】:
以上是关于UIDocumentPickerViewController initWithDocumentTypes 中的 iOS 自定义 UTI的主要内容,如果未能解决你的问题,请参考以下文章