XExtensionItem 0.9.5

XExtensionItem 0.9.5

测试已测试
Lang语言 Obj-CObjective C
许可证 Apache-2.0
发布最后发布2024年4月

由Bryan Irace,Brian Michel,Matthew Bischoff,Taichi Matsumoto,Adriana Elizondo维护。Bryan IraceBrian MichelMatthew BischoffTaichi MatsumotoAdriana Elizondo



  • 作者:
  • Bryan Irace

XExtensionItem

Build Status Version Platform License Carthage compatibile

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];

除了NSURLNSStringUIImage之外,附加数组还可以包括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

联系方式

Bryan Irace

感谢

感谢Ari Weinstein为塑造XExtensionItem API做出的贡献,以及Matt BischoffOisín PrendivillePadraig Kennedy宝贵的反馈。

许可协议

版权所有 2014 Tumblr, Inc.

遵循 Apache 许可协议版本 2.0(“许可协议”);除非适用法律要求或经书面同意,否则不得使用此文件,但需遵守许可协议。您可以在apache.org/licenses/LICENSE-2.0获取许可协议副本。

除非适用法律要求或书面同意,否则在本许可协议下分发的软件按“现状”分发,不提供任何明示或暗示的保证或条件。具体许可协议的内容请参阅许可协议。