限制 UIActivityViewController 共享扩展活动
Posted
技术标签:
【中文标题】限制 UIActivityViewController 共享扩展活动【英文标题】:Limiting UIActivityViewController share extension activities 【发布时间】:2014-12-15 16:59:22 【问题描述】:我将UIActivityViewController
与几个自定义 UIActivityProviders 一起使用。我的提供者返回 NSString
、UIImage
和自定义数据对象。我通过设置 UIActivityViewController excludedActivityTypes
和 Apple 的内置活动类型来排除我不想分享的活动。
我不喜欢出现在所呈现的 UIActivityViewController 上的应用程序,这些应用程序不是构建在活动类型中的。我假设这些出现是因为应用程序已经通知 ios 8 他们可以处理文本和图像数据。例如 Flickr、Evernote 和 FaceBook 的共享扩展。这些活动有自己的活动 URL 类型,我不想硬编码。
我不希望在我的活动共享中使用这些应用程序的原因是大多数应用程序无法正常运行,最终给我的用户带来糟糕的体验,并且可能会指责我的应用程序实施不善。现实情况是,这些应用程序无法处理他们声称可以处理的数据。例如,Evernote 总是只显示一个空的帖子对话框。有些,比如 Facebook 的分享扩展,如果他们无法处理数据类型(真的吗?),甚至会记录错误。
是否可以阻止所有第 3 方共享扩展程序?
如果答案是否定的,看来我只有两个选择:
仅与 Apple 的内置活动和我的自定义活动共享 允许 3 方扩展程序搞砸了 将我的所有内容包装在一个自定义类中,使其无法被扩展识别。这会从 Facebook 生成一个记录错误难度来自initWithPlaceholderItem:(id)placeholderItem
。我传回了一个通用的 NSString 或 UIImage ,扩展程序说它们可以处理,但通常不会或在发布时记录错误。这将是一个检测共享扩展的可怕地方。
我想为我的用户提供最灵活的共享体验,但不以糟糕的 3 方实施为代价。
我知道我们喜欢在 SO 上显示代码,但想不出任何不仅仅是样板文件 UIActivityController
素材。
【问题讨论】:
【参考方案1】:不确定这样做是否明智,但您可以设置受信任活动提供者的“白名单”。然后使用 UIActivityItemProvider 和 UIActivityItemSource 协议。你会接到电话:
- (id)activityViewController:(UIActivityViewController *)activityViewController
itemForActivityType:(NSString *)activityType
检查activityType
。如果它在您的受信任提供商白名单上,请返回数据项。如果 activityType
未被识别,则返回 nil(或返回一些中性的“安全”数据元素)。
不受信任的活动可能仍会显示在活动表中,但它们不会获取导致应用出现问题的数据。
【讨论】:
【参考方案2】:是否可以阻止所有第 3 方共享扩展程序?
是的,可能。但是通过私有API。 我不能告诉你细节,但这是可能的。
【讨论】:
以上是关于限制 UIActivityViewController 共享扩展活动的主要内容,如果未能解决你的问题,请参考以下文章