iOS 分享扩展(二):info.plist 文件配置全解析

1,490 阅读5分钟

这里每天分享一个 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新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!