我正在使用UIActivityViewController
和几个自定义UIActivityProviders。我的提供商返回NSString
,UIImage
和自定义数据对象。我通过设置UIActivityViewController excludedActivityTypes
和Apple的内置活动类型来排除我不想分享的活动。
我不喜欢的是在呈现的UIActivityViewController上出现的不是活动类型的应用程序。我假设这些出现是因为应用已通知iOS 8他们可以处理文本和图像数据。例如Flickr,Evernote和FaceBook的共享扩展。这些活动有自己的活动URL类型,我不想硬编码。
我不想在我的活动共享中使用这些应用程序的原因是大多数都无法正常工作,最终给我的用户带来了糟糕的体验,并可能因为执行不当而责怪我的应用程序。现实情况是,这些应用程序无法处理他们声称的数据。例如,Evernote总是只显示一个空的帖子对话框。有些像Facebook的共享扩展甚至记录错误,如果他们无法处理数据类型(真的吗?)。
是否可以阻止所有第三方共享扩展程序?
如果答案是否定的,我似乎只有两个选择:
困难来自initWithPlaceholderItem:(id)placeholderItem
。我传回一个通用的NSString或UIImage,这些扩展说他们可以处理,但通常不会或在发布时记录错误。这将是检测共享扩展的一个可怕的地方。
我想为我的用户提供最灵活的分享体验,但不会以糟糕的第三方实施为代价。
我知道我们喜欢在SO上显示代码,但不能想到任何不仅仅是样板UIActivityController
饲料。
答案 0 :(得分:0)
不确定这样做是否明智,但您可以设置受信任活动提供商的“白名单”。然后将UIActivityItemProvider与UIActivityItemSource协议一起使用。你会接到电话:
- (id)activityViewController:(UIActivityViewController *)activityViewController
itemForActivityType:(NSString *)activityType
检查activityType
。如果它位于可信提供商的白名单中,则返回数据项。如果无法识别activityType
,则返回nil(或返回一些绝对的“安全”数据元素)。
不受信任的活动可能仍会显示在“活动”表中,但不会获取导致您的应用出现问题的数据。
答案 1 :(得分:-1)
是否可以阻止所有第三方共享扩展程序?
是的,可能。但是通过私有API。 我无法告诉你细节,但这是可能的。