有一种方式,但需要使用私有API。
有时候苹果会有例外,特别是如果你修复了一个bug。
让我们深入细节...
UIActivityViewController有一个名为"_availableActivitiesForItems:"的私有方法,该方法返回一个UISocialActivity对象数组。
UISocialActivity有一个有趣的属性,叫做"activityType",它返回一个域格式的活动类型。
经过一些测试,我成功地发现了提醒和笔记的活动类型:
- com.apple.reminders.RemindersEditorExtension
- com.apple.mobilenotes.SharingExtension
不幸的是,将这两个类型传递给".excludedActivityTypes"并没有任何区别。
"_availableActivitiesForItems:"拯救了一切!
旧的方法:
更新:我找到了一个更好的方法来实现它。
我发布的第一个解决方案在某些情况下不起作用,因此不应被认为是稳定的。
头文件:
#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];
[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
新方式:
标题:
@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
"非法",但它可以工作。
如果能够通过苹果验证就太好了。
.init(rawValue: "com.apple.reminders.sharingextension")
。 - James