如何从UIActivityViewController中排除Notes和提醒应用程序? [英] How to exclude Notes and Reminders apps from the UIActivityViewController?
问题描述
我创建了一个 UIActivityViewController
并传递 String
和 URL
到它。这显然配置 UIActivityViewController
使用一些我想排除的项目(我的目标是分享我的应用程序的信息)。
通过设置相应的 excludedActivityTypes
,我已经排除了大量系统提供的活动(如添加到阅读列表)。
$ b
但是,我无法排除提醒和Notes应用程序。有人可以建议一种做法吗?这些应用程序在列表中显示为第3和第4,因此除非用户滚动,否则Twitter和Facebook不可见。
,但涉及私人API 。
有时苹果会出现异常,特别是如果您修复了错误。
让我们深入细节...
UIActivityViewController 方法称为_availableActivitiesForItems:,它返回一个 UISocialActivity 对象的数组。
UISocialActivity ,称为activityType,它返回一个域格式的活动类型。
经过一些测试,我设法发现了提醒和Notes活动类型:
- com.apple.reminders.RemindersEditor扩展
- com.apple.mobilenotes.SharingExtension
很遗憾,将这两种类型传递到.excludedActivityTypes没有任何区别。
_ availableActivitiesForItems:救援!
老方式:
更新:I发现了一个更好的方法。
我发布的第一个解决方案在某些情况下不工作,因此不应该被认为是稳定的。 p>
标题:
#import< UIKit / UIKit.h>
@interface UISocialActivity:NSObject
- (id)activityType;
@end
@interface UIActivityViewController(Private)
- (id)_availableActivitiesForItems:(id)arg1;
@end
@interface ActivityViewController:UIActivityViewController
@end
实现:
@implementation ActivityViewController
- (id)_availableActivitiesForItems:(id)arg1
{
id activities = [super _availableActivitiesForItems:arg1];
NSMutableArray * filteredActivities = [NSMutableArray array];
[活动enumerateObjectsUsingBlock:^(UISocialActivity * _Nonnull obj,NSUInteger idx,BOOL * _Nonnull stop){
if(![[obj activityType] isEqualToString:@com。 apple.reminders.RemindersEditorExtension]&&
![[obj activityType] isEqualToString:@com.apple.mobilenotes.SharingExtension]){
[filteredActivities addObject:obj];
}
}];
return [NSArray arrayWithArray:filteredActivities];
}
@end
$ b
新办法:
标题:
@interface UIActivityViewController(Private)
- (BOOL)_shouldExcludeActivityType:(UIActivity *)activity;
@end
@interface ActivityViewController:UIActivityViewController
@end
实现:
@implementation ActivityViewController
- (BOOL)_shouldExcludeActivityType:(UIActivity *)activity
{
if([[activity activityType] isEqualToString:@com.apple.reminders.RemindersEditorExtension] ||
[[activity activityType] isEqualToString:@com.apple.mobilenotes.SharingExtension]){
return YES;
}
return [super _shouldExcludeActivityType:activity];
}
@end
Illegal,但它的工作原理。
很高兴知道它是否真的通过苹果验证。
I am creating a UIActivityViewController
and pass String
and URL
to it. This, obviously, configures the UIActivityViewController
to use some items which I want to exclude (my objective is to share the info about my app).
I have managed to exclude lots of system provided activities (like 'Add to Reading list') by setting the appropriate excludedActivityTypes
.
However, I am unable to exclude Reminders and Notes apps. Can someone suggest a way of doing it? These apps appear 3rd and 4th on the list and therefore make Twitter and Facebook not visible unless user scrolls.
There is a way, but involves private API.
Sometimes Apple makes exceptions, especially if you fix a bug.
Let's dive into details...
UIActivityViewController has got a private method called "_availableActivitiesForItems:", which returns an array of UISocialActivity objects.
UISocialActivity has got an interesting property, called "activityType", which returns a domain-formatted activity type.
After some tests, I managed to discover the Reminder and Notes activity types:
- com.apple.reminders.RemindersEditorExtension
- com.apple.mobilenotes.SharingExtension
Unfortunately, passing those two types into ".excludedActivityTypes" didn't make any difference.
"_availableActivitiesForItems:" to the rescue!
OLD WAY:
Update: I've found a better way to do it.
The first solution I've posted doesn't work in some cases, thus shouldn't be considered stable.
Header:
#import <UIKit/UIKit.h>
@interface UISocialActivity : NSObject
- (id)activityType;
@end
@interface UIActivityViewController (Private)
- (id)_availableActivitiesForItems:(id)arg1;
@end
@interface ActivityViewController : UIActivityViewController
@end
Implementation:
@implementation ActivityViewController
- (id)_availableActivitiesForItems:(id)arg1
{
id activities = [super _availableActivitiesForItems:arg1];
NSMutableArray *filteredActivities = [NSMutableArray array];
[activities enumerateObjectsUsingBlock:^(UISocialActivity* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (![[obj activityType] isEqualToString:@"com.apple.reminders.RemindersEditorExtension"] &&
![[obj activityType] isEqualToString:@"com.apple.mobilenotes.SharingExtension"]) {
[filteredActivities addObject:obj];
}
}];
return [NSArray arrayWithArray:filteredActivities];
}
@end
NEW WAY:
Header:
@interface UIActivityViewController (Private)
- (BOOL)_shouldExcludeActivityType:(UIActivity*)activity;
@end
@interface ActivityViewController : UIActivityViewController
@end
Implementation:
@implementation ActivityViewController
- (BOOL)_shouldExcludeActivityType:(UIActivity *)activity
{
if ([[activity activityType] isEqualToString:@"com.apple.reminders.RemindersEditorExtension"] ||
[[activity activityType] isEqualToString:@"com.apple.mobilenotes.SharingExtension"]) {
return YES;
}
return [super _shouldExcludeActivityType:activity];
}
@end
"Illegal", but it works.
It would be great to know if it actually passes Apple validation.
这篇关于如何从UIActivityViewController中排除Notes和提醒应用程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!