iOS UIDocumentInteractionControl
基础操作
let document = UIDocumentInteractionController()
// UIDocumentInteractionControllerDelegate
document.delegate = self
//音乐
let path = Bundle.main.path(forResource: "music", ofType: "mp3")
//视频
//let path = Bundle.main.path(forResource: "video", ofType: "mp4")
//文件
//let path = Bundle.main.path(forResource: "file", ofType: "pdf")
//图片
//let path = Bundle.main.path(forResource: "image", ofType: "jpg")
document.url = URL(fileURLWithPath: path!)
//预览。需要实现代理 `documentInteractionControllerViewControllerForPreview` 方法
document.presentPreview(animated: true)
func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
return self
}
预览打开的文件样式
image.png点击预览页面中的分享按钮弹出此页面
image.png打开第三方App里面的文档
如果我们需要打开第三方app分享过来的文档时,需要在 Info.plist
中添加如下内容:
-
Document Type Name
:类型名 -
Document Content Type Identifiers
:所关联的uti格式,一个类型名可以对应多个uti,更多查看 https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html -
Handler rank
:是不是app所拥有的类型,Default
:不是,Owner
:是
Info.plist
文件的 Source Code
格式:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>fileName</string>
<key>CFBundleTypeIconFiles</key>
<array>
<string>image.png</string>
</array>
<key>LSItemContentTypes</key>
<array>
<string>public.mp3</string>
<string>public.mpeg-4</string>
<string>com.adobe.pdf</string>
<string>public.jpeg</string>
</array>
<key>LSHandlerRank</key>
<string>Owner</string>
</dict>
</array>
新建 test
工程,在 Info.plist
文件中添加以上内容,那么在第三方打开文件时,列表中就会出现 test
工程app
image.png即:在自己的项目中添加了
Info.plist
文件中的内容以后,那么其它应用程序中的文档在使用第三方打开的时候,就可以看到自己的项目了。
在 test
工程的 SceneDelegate.swift
文件中添加如下代码:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let context = URLContexts.first else { return }
// file:///Users/swiftprimer/Library/Developer/CoreSimulator/Devices/9EE0F225-F3CF-4B8C-BC55-333CBFF41CEB/data/Containers/Data/Application/BB257E41-BE96-4F13-A71A-0DDAC99A9871/Documents/Inbox/music.mp3
print(context.url)
// <UISceneOpenURLOptions: 0x6000016ce100; sourceApp: (null); annotation: (null); openInPlace: NO>
print(context.options)
}
如果不存在 SceneDelegate.swift
则使用 AppDelegate.swift
的方法
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
print(url)
return true
}
当第三方app使用 test
app打开文档时,就会调用以上方法,其中 url
就是该文档的位置,打开的文档都会存在 /Documents/Inbox/
目录下
每次执行此操作,都会复制一份到 /Documents/Inbox/
目录下,相同的文件也不会替换原来文件,所以记得移动文档到合适的位置,并删除掉 /Documents/Inbox/
目录下的原文件。