这里每天分享一个 iOS 的新知识,快来关注我吧
前言
在上一期的文章中,我们介绍了如何在 iOS 应用中添加一个分享扩展并读取用户分享的内容。这一次,我们将深入探讨 info.plist 配置文件的作用,并了解如何通过配置来限制可分享内容的格式。
如果你有相关的定制化需求,这些配置能够帮助你更好地控制分享扩展的行为,提高应用的用户体验。
往期内容:
iOS 分享扩展(一):如何让你的 App 出现在 iOS 系统的分享面板中
info.plist 配置文件详解
在任何 iOS 应用的开发过程中,info.plist 文件都扮演着至关重要的角色。对于分享扩展来说,它同样是不可或缺的配置文件。在上一篇文章中已经介绍过,创建分享扩展时,它会自动生成一个 info.plist 文件,我们需要在这里声明分享扩展的基本信息以及支持的内容类型。
首先,打开你的 Share Extension 的 info.plist 文件。你会看到类似以下的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<string>TRUEPREDICATE</string>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
</dict>
</plist>
关键配置项解析
-
NSExtensionActivationRule: 定义扩展激活的规则。在默认情况下,它的值是
TRUEPREDICATE,意味着在任何分享内容下都会激活。稍后我会教大家如何修改这个配置以限定分享内容的格式。 -
NSExtensionPointIdentifier: 这是扩展点的标识符。对于分享扩展来说,用它默认的就好,一般来说是
com.apple.share-services。 -
NSExtensionMainStoryboard: 指定分享扩展的主视图页面入口,通常为
MainInterface这个 storyboard 文件,如果你想自定义分享扩展的 UI 界面,可以在这里修改,关于这块儿内容,我们以后专门写文章来介绍。
限定分享内容格式
在分享扩展中,有时候我们可能希望只支持特定类型的内容,比如我的应用是一个图片分享社区,那可能只需要用户分享图片,其他的不需要支持,比如文本。为此,我们需要在 info.plist 中更改 NSExtensionActivationRule 的值。
支持特定内容类型
假设我们只希望分享扩展支持图片格式,我们可以将 NSExtensionActivationRule 修改为:
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<string>1</string>
</dict>
</dict>
通过这种配置,分享扩展只会在用户选择单张图片时被激活。类似地,如果你希望支持文本分享,可以使用 NSExtensionActivationSupportsText 键。
我们改完配置之后,再次运行程序,此时你会发现,当你在原来的网页上唤起分享面板时,找不到自己的 app 了,因为你此时分享的是链接,内容不匹配,所以不会展示你的 app。
相反,如果我们选中一张图片来分享,此时就可以看到自己的 app 了,因为此时分享的内容是图片,符合我们配置的规则。
此类相关的配置还有:
-
NSExtensionActivationSupportsImageWithMaxCount:支持分享图片的最大数量
-
NSExtensionActivationSupportsText:是否支持分享文本
-
NSExtensionActivationSupportsURLWithMaxCount:支持分享链接的最大数量
-
NSExtensionActivationSupportsFileWithMaxCount:支持分享文件的最大数量
-
NSExtensionActivationSupportsAttachmentsWithMinCount:支持分享附件的最小数量
-
NSExtensionActivationSupportsAttachmentsWithMaxCount:支持分享附件的最大数量
-
NSExtensionActivationSupportsMovieWithMaxCount:支持分享视频的最大数量
-
NSExtensionActivationSupportsWebPageWithMaxCount:支持分享网页的最大数量
-
NSExtensionActivationSupportsWebURLWithMaxCount:支持分享 HTTP URL 的最大数量
举个例子,如果你的 App 最多可支持十张图像、一部电影和一个网页 URL,您可以使用以下字典作为 NSExtensionAttributes 键的值:
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>10</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>
如果不支持某个数据类型,可以直接填 0,或从 NSExtensionActivationRule 字典中删除这个 key。
代码实现
在 ShareViewController.swift 中,我们可以通过以下代码读取并处理分享的图片内容:
override func viewDidLoad() {
super.viewDidLoad()
guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem,
let itemProvider = extensionItem.attachments?.first else {
return
}
if itemProvider.hasItemConformingToTypeIdentifier(UTType.image.identifier) {
itemProvider.loadItem(forTypeIdentifier: UTType.image.identifier) { (item, error) in
if let error {
print("Error: \(error.localizedDescription)")
return
}
if let imageURL = item as? URL, let data = try? Data(contentsOf: imageURL) {
// 处理图片...
self.contentImageView.image = UIImage(data: data)
}
}
}
}
与 NSExtensionAttributes 同级,还有几个不太常用的配置项,也可以了解下:
-
NSExtensionActionWantsFullScreenPresentation:是否全屏展示分享扩展。
-
NSExtensionOverridesHostUIAppearance:是否覆盖主应用的 UI 外观。
-
NSExtensionPrincipalClass:指定分享扩展的主类,通常为
ShareViewController这个类,如果你想自定义分享扩展的 UI 界面,可以在这里修改,关于这块儿内容,我们以后专门写文章来介绍。
结论
通过配置 info.plist 文件和编写相应的代码,我们可以有效地控制分享扩展的激活条件和支持的内容类型。这不仅可以优化用户体验,还可以确保应用的分享功能符合业务需求。
在接下来的文章中,我们将继续探索分享扩展的更多高级功能,比如自定义分享面板和与主应用共享数据。如果你对这些话题感兴趣,请继续关注我的系列文章。
希望这篇文章对你有所帮助!如有任何疑问或建议,欢迎在评论区留言与我交流。让我们共同进步,共同提升 iOS 开发技能。
这里每天分享一个 iOS 的新知识,快来关注我吧
本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!