ios - 限制 UIActivityViewController 共享扩展事件

标签 ios objective-c uiactivityviewcontroller uiactivity

我将 UIActivityViewController 与多个自定义 UIActivityProvider 一起使用。我的提供商返回 NSStringUIImage 和自定义数据对象。我通过设置 UIActivityViewController excludedActivityTypes 和 Apple 的内置事件类型来排除不想共享的事件。

我不喜欢出现在呈现的 UIActivityViewController 上的应用程序不是内置事件类型。我假设这些出现是因为应用程序已通知 iOS 8 它们可以处理文本和图像数据。例如 Flickr、Evernote 和 FaceBook 的共享扩展。这些事件有自己的事件 URL 类型,我不想对其进行硬编码。

我不希望这些应用出现在我的事件分享中的原因是大多数应用无法正常工作,最终给我的用户带来糟糕的体验,并可能将实现不当归咎于我的应用。事实上,这些应用程序并没有处理他们声称可以处理的数据。例如,Evernote 总是只显示一个空的帖子对话框。有些,例如 Facebook 的共享扩展,如果无法处理数据类型(真的吗?),甚至会记录错误。

是否可以阻止所有第 3 方共享扩展?

如果答案是否定的,看来我只有两个选择:

  • 仅与 Apple 的内置事件和我的自定义事件共享
  • 允许 3 方扩展来搞砸手
  • 将我所有的内容包装在一个自定义类中,这样它就无法被扩展程序识别。这会生成来自 Facebook 的记录错误

困难来自initWithPlaceholderItem:(id)placeholderItem。我传回了一个通用的 NSString 或 UIImage ,扩展程序说它们可以处理但通常不会处理,或者在发布时记录错误。这将是一个检测共享扩展的糟糕地方。

我想为我的用户提供最灵活的共享体验,但又不想以糟糕的第 3 方实现为代价。

我知道我们喜欢在 SO 上显示代码,但想不出任何不仅仅是样板 UIActivityController 饲料。

最佳答案

不确定这样做是否明智,但您可以设置受信任事件提供者的“白名单”。然后使用 UIActivityItemProvider 和 UIActivityItemSource 协议(protocol)。您会接到以下电话:

- (id)activityViewController:(UIActivityViewController *)activityViewController
     itemForActivityType:(NSString *)activityType

检查activityType。如果它在您的可信提供者白名单中,请返回该数据项。如果 activityType 未被识别,则返回 nil(或返回一些已绝育的“安全”数据元素)。

不受信任的事件可能仍会显示在事件表中,但它们不会获取会导致您的应用出现问题的数据。

关于ios - 限制 UIActivityViewController 共享扩展事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27489149/

相关文章:

iphone - 暂停 CCAction cocos2d

ios - CocoaPods 因错误停止安装 Firebase/Analytics

ios - Storyboard 不允许我在 UIViewController 中选择项目

ios - 按下完成按钮后使 AVPlayerViewController 继续播放

'Storage and iCloud Usage' 的 iOS 9 应用启动 URL

SwiftUI - 半模态?

ios - 如何在不绘制自己的情况下更改 UIPopoverPresentationController 箭头颜色

ios - UIActivityViewController 仅适用于 Facebook、Twitter 和 Instagram

ios - 从UIActivityController中排除Facebook Messenger,Instagram和Whats App

ios - 检查数组是否可以在给定索引处有元素的快速方法?