我正在创建UIActivityViewController
并将String
和URL
传递给它。显然,这会将UIActivityViewController
配置为使用我要排除的一些项目(我的目标是分享有关我的应用的信息)。
我设法通过设置适当的excludedActivityTypes
排除了许多系统提供的活动(例如“添加到阅读列表”)。
但是,我无法排除提醒和Notes应用。有人可以建议一种方法吗?这些应用程序在列表中显示第3和第4个,因此除非用户滚动,否则Twitter和Facebook不可见。
答案 0 :(得分:47)
如果您不想继承UIActivityViewController
,则可以在创建.excludedActivityTypes
时将其加入UIActivityViewController
。
目标C:
UIActivityViewController *activityController = [[UIActivityViewController alloc]initWithActivityItems:sharingItems applicationActivities:nil];
activityController.excludedActivityTypes = @[
UIActivityTypeAssignToContact,
UIActivityTypePrint,
UIActivityTypeAddToReadingList,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeOpenInIBooks,
@"com.apple.mobilenotes.SharingExtension",
@"com.apple.reminders.RemindersEditorExtension"
];
[self presentViewController:activityController animated:YES completion:nil];
Swift 4.2:
let activityController = UIActivityViewController(activityItems: sharingItems, applicationActivities: nil)
activityController.excludedActivityTypes = [
UIActivity.ActivityType.assignToContact,
UIActivity.ActivityType.print,
UIActivity.ActivityType.addToReadingList,
UIActivity.ActivityType.saveToCameraRoll,
UIActivity.ActivityType.openInIBooks,
UIActivity.ActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension"),
UIActivity.ActivityType(rawValue: "com.apple.mobilenotes.SharingExtension")]
present(activityController, animated: true, completion: nil)
答案 1 :(得分:33)
Swift 2.2版本。在iOS9.3中测试过。的工作原理。
更新并获得App Store Review的批准。
import UIKit
class ActivityViewController: UIActivityViewController {
func _shouldExcludeActivityType(activity: UIActivity) -> Bool {
let activityTypesToExclude = [
"com.apple.reminders.RemindersEditorExtension",
"com.apple.mobilenotes.SharingExtension",
UIActivityTypeOpenInIBooks,
UIActivityTypePrint,
UIActivityTypeAssignToContact,
"com.google.Drive.ShareExtension"
]
if let actType = activity.activityType() {
if activityTypesToExclude.contains(actType) {
return true
}
else if super.excludedActivityTypes != nil {
return super.excludedActivityTypes!.contains(actType)
}
}
return false
}
}
也很有用
"com.apple.mobileslideshow.StreamShareService"
摆脱了“云”之一。
答案 2 :(得分:18)
有一种方法,但涉及私有API 。
有时Apple会例外,特别是如果您修复了错误。
让我们深入了解详情...
UIActivityViewController 有一个名为" _availableActivitiesForItems:"的私有方法,它返回 UISocialActivity 对象的数组。
UISocialActivity 有一个有趣的属性,名为" activityType",它返回一个域格式的活动类型。
经过一些测试,我设法发现了Reminder和Notes活动类型:
很遗憾,将这两种类型传递给" .excludedActivityTypes"并没有任何区别。
" _availableActivitiesForItems:"救援!
OLD WAY :
更新:我找到了更好的方法。
我发布的第一个解决方案在某些情况下不起作用,因此不应该被认为是稳定的。
头文件
#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
NEW WAY :
部首:
@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
&#34;非法&#34;,但它确实有效。
很高兴知道它是否真的通过了Apple验证。
答案 3 :(得分:6)
您无法排除这些,因为在Apple文档中未将Notes和提醒声明为UIActivities
。只有iOS9的问题,并希望Apple将提供此选项。直到这一刻宣布的UIActivities是:
UIActivityTypePostToFacebook,
UIActivityTypePostToTwitter,
UIActivityTypePostToWeibo,
UIActivityTypeMessage,
UIActivityTypeMail,
UIActivityTypePrint,
UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList,
UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo,
UIActivityTypePostToTencentWeibo,
UIActivityTypeAirDrop
答案 4 :(得分:2)
我找到的唯一方法是创建自己的自定义活动,直接将参数传递给它们(而不是通过活动表),然后通过活动表传递一些随机变量(不是String,URL,Image)。
MyCustomPinterestShareActivity* pinterest = [[MyCustomPinterestShareActivity alloc] init];
MyCustomFacebookGroupsActivity* facebook = [[MyCustomFacebookGroupsActivity alloc] init];
MyCustomInstagramActivity* instagram = [[MyCustomInstagramActivity alloc] init];
NSArray *activities = @[facebook,instagram,pinterest];
NSArray *activityItems = @[someVarThatCanBeWhateverTypeJustNotStringURLOrImg];
UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:activityItems
applicationActivities:activities];
但话又说回来,如果你不能使用任何功能,你为什么要首先使用ActivityViewController ...希望很快会有更好的解决方案
答案 5 :(得分:2)
谢谢你! 在xcode 8.1,swift 3上,我能够用来获得:
UIActivityType(rawValue:“com.apple.reminders.RemindersEditorExtension”), UIActivityType(rawValue:“com.apple.mobilenotes.SharingExtension”),
答案 6 :(得分:2)
对于Swift3 +,不需要任何私有API黑客攻击。只需在UIActivityViewController上使用公共“excludedTypes”数组即可。由于这些仍然没有UIActivityType(因为它们是Apple的内置扩展),您需要通过String引用它。您也可以将此格式用于任何第三方共享扩展程序。
e.g。
let avc = UIActivityViewController(activityItems: ["my item"], applicationActivities: nil)
avc.excludedActivityTypes = [ .copyToPasteboard,
UIActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension"),
UIActivityType(rawValue: "com.apple.mobilenotes.SharingExtension") ]
avc.completionWithItemsHandler = { (activity, success, items, error) in
print("AVC finished \(success) \(activity as Optional) \(items as Optional) \(error as Optional)")
}
present(avc, animated: true, completion: nil)
答案 7 :(得分:0)
任何人在2019年都会在这篇文章中跌跌撞撞。Reminders扩展的键在iOS 13上已更改,现在为:
(rawValue: "com.apple.reminders.sharingextension")