构建 iOS 8 的分享扩展:一个包含问题、示例代码和变通方案的 GitHub 库

  • Sergio De Simone
  • 丛一

2014 年 10 月 8 日

话题:iOS语言 & 开发架构

Tumblr 的 iOS 开发者Bryan Irace认为苹果在 iOS 8 中引入的分享扩展(Share extension)“为各种类型的应用开发者提供了一个令人激动的机会,能够以一种前所未有的方式将应用与用户的设备整合”。构建 iOS 分享扩展的道路不仅充满乐趣,同时也伴随挫折,不过这是尝试新技术时常有的事。

实际上,正如 Bryan 在讲述他创建 Tumblr 的应用分享扩展的经验时所提到的,“我们碰到了许多问题,最终只能用变通的方案解决。”已经发现的这些问题中,一部分可能是真正的问题,正在等待修复,另一部分则完全是当前 iOS 8 扩展的体系架构的限制。下面是对 Bryan 记录的所有问题的一个简要回顾:

  • 后台文件上传不能正常工作

    虽然根据苹果官方文档的描述,扩展可以通过NSURLSessionUploadTask上传保存在与主应用程序(Container App)共享的容器中的文件,Tumblr 的工程师们目前还没有找到能够让这个功能正常工作的方法。因为一旦分享扩展的进程被销毁,后台的上传好像也会随之终止。

  • 必须先打开主应用程序,分享扩展才能生效

    这个问题实际上只会对要安装新扩展的应用更新产生影响:应用的数据已经存在于共享容器之外的某个位置,而且只有主应用程序能够在第一次启动时迁移这些数据。如果在使用分享扩展之前没有完成这个步骤,用户将很可能无法完成他想要做的事情,因为扩展无法获取到任何用户数据(用户默认值、钥匙串、数据库、通过 NSCoding 序列化的文件等。)

  • NSFileCoordinator不能正常工作

    WWDC 大会的 Session 217所介绍,NSFileCoordinator被视为 NSUserDefaults 和 SQLite 的替代品,用于扩展和其主应用程序之间的定制数据持久化。

  • 分享扩展无法设置状态栏颜色

    分享扩展总是与主应用程序状态栏的显示风格一致。这可能会导致视觉颜色冲突而且没有变通方案。

  • 开发者无法从应用的 Activity控制器中排除自己的分享扩展

    这是一个小问题,只影响那些即为其他应用提供分享扩展又提供个性化分享功能的应用。在这种情况下,开发者可能希望可以将自己的分享扩展从主应用程序的 Activity 控制器中排除,不过目前还无法实现。

  • 只有显式支持主应用程序提供的所有 Activity项目,分享扩展才能够显示出来

    据 Bryan 介绍,这是他们发现的最严重的问题。为了理解这个问题,假设我们创建了一个支持图像URL文本数据的分享扩展。那么,这个扩展只会在同时支持图像URL文本的主应用程序中显示出来。

正如 Bryan 所说,不是每个构建分享扩展的开发者都一定会遇到上述这些限制,为了帮助其他开发者,他创建了一个github 页面,详细说明了他们已经发现的所有问题,包括示例代码、相应的 Radar 问题编号、以及可用的变通方案。任何开发者如果发现了新的限制或找到已知限制的变通方案都可以发起一个 Pull 请求。

查看英文原文:Building iOS 8 Share Extensions: A GitHub Repo with Issues, Sample Code, and Workarounds

iOS语言 & 开发架构