57

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

通过设置适当的excludedActivityTypes.

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

4

9 回答 9

56

如果您不想子类化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];

斯威夫特 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)
于 2016-09-26T19:31:49.087 回答
35

斯威夫特 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"

摆脱“云”之一。

在此处输入图像描述

于 2016-05-13T19:13:42.480 回答
21

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

有时 Apple 会例外,尤其是当您修复错误时。

让我们深入了解细节...


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

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

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

  • 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];
}

@结尾

非法”,但它有效。

很高兴知道它是否真的通过了 Apple 验证。

于 2015-10-22T17:05:46.310 回答
7

任何人在 2019 年都在这篇文章中磕磕绊绊。Reminders 扩展的关键随着 iOS 13 的变化而变化,现在是:

(rawValue: "com.apple.reminders.sharingextension")
于 2019-12-03T07:16:16.407 回答
6

您不能排除这些,因为注释和提醒未UIActivities在 Apple 文档中声明。只是 iOS9 的一个问题,希望 Apple 会提供这个选项。到目前为止,声明的 UIActivity 是:

UIActivityTypePostToFacebook, 
UIActivityTypePostToTwitter, 
UIActivityTypePostToWeibo, 
UIActivityTypeMessage, 
UIActivityTypeMail, 
UIActivityTypePrint, 
UIActivityTypeCopyToPasteboard, 
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList,
UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo,
UIActivityTypePostToTencentWeibo,
UIActivityTypeAirDrop
于 2015-09-22T14:24:55.850 回答
2

这次真是万分感谢!在 xcode 8.1, swift 3 上,我可以用来获得:

UIActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension"), UIActivityType(rawValue: "com.apple.mobilenotes.SharingExtension"),

于 2016-11-26T20:45:45.170 回答
2

对于 Swift3+,不需要任何私有 API hack。只需使用 UIActivityViewController 上的公共“excludedTypes”数组。由于这些仍然没有 UIActivityType(因为它们是 Apple 的内置扩展),您需要通过 String 引用它。您也可以将此格式用于任何第三方共享扩展。

例如

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)
于 2017-09-05T08:22:19.717 回答
1

我发现的唯一方法是创建自己的自定义活动,直接将参数传递给它们(而不是通过活动表),然后通过活动表传递一些随机变量(不是字符串、URL、图像)。

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 ......希望很快会有更好的解决方案

于 2015-10-07T18:01:55.273 回答
1

我无法按照 Matteo Pacini 的建议将 _shouldExcludeActivityType 发送给 Super,但这就是我可以解决的方法:

@interface CustomActivityViewController()

- (BOOL)_shouldExcludeActivityType:(UIActivity *)activity;

@end

@implementation CustomActivityViewController

(...)

- (BOOL)_shouldExcludeActivityType:(UIActivity *)activity{

    if([[activity activityType]   isEqualToString:@"com.apple.reminders.RemindersEditorExtension"] || [[activity activityType] isEqualToString:@"com.apple.mobilenotes.SharingExtension"]){

    return YES;
}

    return [[super excludedActivityTypes]containsObject:activity.activityType];

 }
于 2015-11-23T13:23:12.387 回答