XExtensionItem
XExtensionItem是一个小型的库,它允许iOS应用程序和共享扩展之间更轻松地共享结构化数据。它针对共享扩展以及显示UIActivityViewController
的应用程序开发者。
我们很乐意听取您对如何使XExtensionItem更具实用性的想法。此库的价值在于其对各种形状和大小的应用程序和扩展的实用性。
为什么?
多个附件
目前,iOS存在一个不幸的限制,这导致只有明确接受所有提供活动项目类型的分享扩展才会显示在UIActivityViewController
中。这使得如果没有扩展能够灵活地处理允许的输入,那么应用就没有办法分享多个数据。以下是一个例子:
- 一个开发者希望他们的应用用户能够分享URL以及一些与之相关的文本(比如网页的标题或摘录)。一个阅读后的服务扩展(如Instapaper或Pocket)可能只保存URL,但一个社交网络(如Tumblr或Twitter)扩展可能可以同时支持这两种。
- 应用显示一个
UIActivityViewController
,并将一个NSURL
和一个NSString
放入其活动项目数组中。 - 只有那些明确定义为接受URL和字符串的扩展才会显示在活动控制器中。在上面的例子中,Tumblr/Twitter会显示在活动控制器中,但Instapaper/Pocket不会。
与其传递多个活动项目并让不灵活的扩展不再显示,不如使用一个封装多个附件的单一NSExtensionItem
。但这可能很难做到精确,XExtensionItem通过在这些复杂的API上提供抽象层,处理其所有复杂性,让你无需担心。
元数据参数
将元数据参数传递给分享扩展非常有用,但iOS SDK目前没有提供一种通用的方法。个别开发者需要制定一个契约,这样扩展就知道如何反序列化并解析应用程序传递给它的参数。
XExtensionItem 定义了这个通用契约,使得应用可以轻松地传递扩展可以轻松读取的元数据,而无需担心握手另一端的实现细节。它甚至为扩展开发者提供了用于自定义元数据参数的挂钩。
入门指南
XExtensionItem可以通过你选择的Objective-C包管理器使用。
CocoaPods
只需简单地将以下内容添加到您的Podfile
pod 'XExtensionItem'
Carthage
只需简单地将以下内容添加到您的Cartfile
github "tumblr/XExtensionItem"
使用方法
此存储库包括一个示例项目,它应该有助于解释如何使用库。它包括对共享扩展和应用的标记;您可以使用后者作为宿主应用来运行前者,并看到应用中的数据通过扩展传递。
应用
您可能目前正以这种方式初始化您的UIActivityViewController
实例
[[UIActivityViewController alloc] initWithActivityItems:@[URL, string, image]
applicationActivities:nil];
如上所述,这是一个问题,因为您的用户将只能看到明确接受URL的扩展、字符串和图像。XExtensionItem提供了一个更好的方式。
XExtensionItemSource *itemSource = [[XExtensionItemSource alloc] initWithURL:URL];
itemSource.additionalAttachments = @[string, image];
[[UIActivityViewController alloc] initWithActivityItems:@[itemSource]
applicationActivities:nil];
XExtensionItemSource
需要使用一个主要附件(上述示例中的NSURL
)进行初始化。主要附件的类型将决定向用户展示哪些系统活动和扩展。在这种情况下,将显示至少接受URL的所有扩展和系统活动,但所有三个附件都将传递给用户选择的那个。
除了URL之外,XExtensionItemSource
实例还可以使用以下内容进行初始化
- 一个
NSString
- 一个
UIImage
- 包含类型标识的
NSData
- 一个占位符项和一个块,以懒加载实际项(选择活动后)
高级附件
包含的XExtensionItemSource
类别提供了用于懒加载URL、字符串、图像或数据的其他便利标识符
XExtensionItemSource *itemSource =
[[XExtensionItemSource alloc] initWithImageProvider:^UIImage *(NSString *activityType) {
if (activityType == UIActivityTypePostToTwitter) {
return twitterImage;
}
else {
return defaultImage;
}
}];
可以为所有活动类型提供额外附件
itemSource.additionalAttachments = @[string, image];
以及基于每个活动类型
[itemSource setAdditionalAttachments:@[tweetLengthString, image]
forActivityType:UIActivityTypePostToTwitter];
除了NSURL
、NSString
和UIImage
之外,附加数组还可以包括NSItemProvider
实例,这为应用程序在懒加载项方面提供了更多的灵活性。有关详细信息,请参阅NSItemProvider
类参考。
通用的元数据参数
除了多个附件,XExtensionItem还允许应用传递通用元数据参数给扩展。
目前支持以下参数(关于每个参数的更多信息可以在XExtensionItemSource
头文件文档中找到)
- 标题(也用作邮件和消息等系统活动的主题)
- 注解文本内容(也可以根据活动类型指定)
- 缩略图图像
- 标签
- 源URL
- 引用信息
- 应用名称
- 应用商店ID(iTunes和Google Play)
- 网页上可以链接到共享内容的位置,或是在iOS和Android上原生深度链接
一些内置活动(例如UIActivityTypePostToTwitter
)将消耗注解文本内容字段(如果已填充),而其他活动(例如“复制”或“添加到阅读列表”)只知道如何接受单个附件。XExtensionItem足够智能,可以为您处理这些。
如果您有关于可广泛应用的参数的想法(即不特定于任何特定的共享扩展或服务),请创建问题或提交拉取请求。
自定义元数据参数
通用参数很好,因为它允许应用程序和共享扩展交互操作,而无需了解对方的具体实现方式。但XExtensionItem也使扩展开发者添加对自定义参数的支持变得非常简单。
扩展开发者可以创建一个符合XExtensionItemCustomParameters
的类,然后应用程序开发者将会填充这些类。以下是一个Tumblr特定的示例
XExtensionItemSource *itemSource = [[XExtensionItemSource alloc] initWithURL:URL];
itemSource.additionalAttachments = @[string, image];
itemSource.tags = @[@"lol", @"haha"];
// Provided by Tumblr’s developers. If you’re an extension developer, you can provide your own!
XExtensionItemTumblrParameters *tumblrParameters =
[[XExtensionItemTumblrParameters alloc] initWithCustomURLPathComponent:@"best-post-ever"
consumerKey:nil];
[itemSource addCustomParameters:tumblrParameters];
默认情况下,将所有自定义参数类包含在拉取XExtensionItem到您的应用程序时。如果您想更细粒度地控制包含的内容,我们已经通过subspec(CocoaPods)和submodule(Carthage)提供了这种支持。
如果您是扩展开发者,并且想在XExtensionItem中为扩展添加自定义参数,请参阅自定义参数指南。
请参阅使用XExtensionItem的应用程序部分,了解如何与特定扩展集成的更多信息。
扩展
将来自扩展上下文的NSExtensionItem
实例转换为XExtensionItem
对象
for (NSExtensionItem *inputItem in self.extensionContext.inputItems) {
XExtensionItem *extensionItem = [[XExtensionItem alloc] initWithExtensionItem:inputItem];
NSString *title = extensionItem.title;
NSAttributedString *contentText = extensionItem.attributedContentText;
NSArray *tags = extensionItem.tags;
NSString *tumblrCustomURLPathComponent = extensionItem.tumblrParameters.customURLPathComponent;
}
使用XExtensionItem的应用程序
如果您在您的应用程序或扩展程序中使用了XExtensionItem,请创建一个拉取请求来添加您自己。
应用程序
以下应用程序使用XExtensionItem将灵活的数据传递给扩展程序
扩展程序
以下共享扩展程序使用XExtensionItem来解析传入的数据
贡献
有关如何帮助的更多信息,请参阅CONTRIBUTING.md。
联系方式
感谢
感谢Ari Weinstein为塑造XExtensionItem API做出的贡献,以及Matt Bischoff、Oisín Prendiville和Padraig Kennedy宝贵的反馈。
许可协议
版权所有 2014 Tumblr, Inc.
遵循 Apache 许可协议版本 2.0(“许可协议”);除非适用法律要求或经书面同意,否则不得使用此文件,但需遵守许可协议。您可以在apache.org/licenses/LICENSE-2.0获取许可协议副本。
除非适用法律要求或书面同意,否则在本许可协议下分发的软件按“现状”分发,不提供任何明示或暗示的保证或条件。具体许可协议的内容请参阅许可协议。