如何从UIActivityViewController中排除Notes和Reminders应用程序?

时间:2015-08-03 16:38:52

标签: ios cocoa-touch uiactivityviewcontroller uiactivity

我正在创建UIActivityViewController并将StringURL传递给它。显然,这会将UIActivityViewController配置为使用我要排除的一些项目(我的目标是分享有关我的应用的信息)。

我设法通过设置适当的excludedActivityTypes排除了许多系统提供的活动(例如“添加到阅读列表”)。

但是,我无法排除提醒和Notes应用。有人可以建议一种方法吗?这些应用程序在列表中显示第3和第4个,因此除非用户滚动,否则Twitter和Facebook不可见。

8 个答案:

答案 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"

摆脱了“云”之一。

enter image description here

答案 2 :(得分:18)

有一种方法,但涉及私有API

有时Apple会例外,特别是如果您修复了错误。

让我们深入了解详情...

UIActivityViewController 有一个名为" _availableActivitiesForItems:"的私有方法,它返回 UISocialActivity 对象的数组。

UISocialActivity 有一个有趣的属性,名为" activityType",它返回一个域格式的活动类型。

经过一些测试,我设法发现了Reminder和Notes活动类型:

  • com.apple.reminders.RemindersEditorExtension
  • com.apple.mobilenotes.SharingExtension

很遗憾,将这两种类型传递给" .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")