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

And*_*huk 53 cocoa-touch ios uiactivity uiactivityviewcontroller

我创建UIActivityViewController并通过StringURL它.这显然是配置UIActivityViewController使用我想要排除的一些项目(我的目标是分享有关我的应用程序的信息).

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

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

Dan*_*orm 50

如果您不想要子类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];
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

  • 在iOS 10.3上对我很有用. (4认同)
  • 适用于ios 11.这应该是现在接受的答案. (4认同)
  • 对于 iOS 13,请使用 `.init(rawValue: "com.apple.reminders.sharingextension")` (2认同)

gui*_*ido 35

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
    }

}
Run Code Online (Sandbox Code Playgroud)

也很有用

 "com.apple.mobileslideshow.StreamShareService"
Run Code Online (Sandbox Code Playgroud)

摆脱"云"之一.

在此输入图像描述

  • Apple Review刚刚批准了我的应用程序 (2认同)
  • 老实说,我不记得了,但是我想象您将actType打印到控制台,它将为您显示的应用程序提供所有字符串。 (2认同)

Mat*_*ini 19

有一种方法,但涉及私有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
Run Code Online (Sandbox Code Playgroud)

执行:

@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
Run Code Online (Sandbox Code Playgroud)

新方式:

标题:

@interface UIActivityViewController (Private)

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

@end

@interface ActivityViewController : UIActivityViewController

@end
Run Code Online (Sandbox Code Playgroud)

执行:

@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];
}
Run Code Online (Sandbox Code Playgroud)

@结束

"非法",但它的确有效.

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

  • @Paulo我的应用程序刚刚使用此批准. (5认同)
  • 非常感谢!我会尝试一下,如果它通过验证会让你知道! (2认同)
  • @AndriyGordiychuk我想知道你是否已经通过Apple的验证是否已经得到答案.:) (2认同)
  • 更新:Swift 3打破了它。 (2认同)

Tim*_*mLR 7

任何人都在 2019 年在这篇文章中跌跌撞撞。提醒扩展的关键在 iOS 13 中发生了变化,现在是:

(rawValue: "com.apple.reminders.sharingextension")
Run Code Online (Sandbox Code Playgroud)


小智 6

您不能排除这些,因为未UIActivities在Apple文档中声明Notes和Reminders .只有iOS9的问题,并希望Apple将提供此选项.直到这一刻宣布的UIActivities是:

UIActivityTypePostToFacebook, 
UIActivityTypePostToTwitter, 
UIActivityTypePostToWeibo, 
UIActivityTypeMessage, 
UIActivityTypeMail, 
UIActivityTypePrint, 
UIActivityTypeCopyToPasteboard, 
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList,
UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo,
UIActivityTypePostToTencentWeibo,
UIActivityTypeAirDrop
Run Code Online (Sandbox Code Playgroud)