ios - objective - 如何從UIActivityViewController中排除Notes和Reminders應用程序?




uiactivityviewcontroller objective c (6)

我正在創建一個 UIActivityViewController 並將 StringURL 傳遞給它。 顯然,這將 UIActivityViewController 配置為使用一些我想排除的項目(我的目標是共享有關我的應用程序的信息)。

通過設置適當的 excludedActivityTypes 我設法排除了許多系統提供的活動(如“添加到閱讀列表”)。

但是,我無法排除提醒和Notes應用程序。 有人可以建議這樣做嗎? 這些應用程序出現在列表的第3和第4位,因此除非用戶滾動,否則不顯示Twitter和Facebook。


Swift 2.2版本。 在iOS9.3中測試。 作品。

更新 並獲得App Store評論的批准。

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"

擺脫“雲”之一。


如果您不想 UIActivityViewController 子類,則可以在創建 UIActivityViewController 時將它們包括在 .excludedActivityTypes

目標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)

您不能排除這些,因為在Apple文檔中沒有將Notes和Reminders聲明為 UIActivities 。 從iOS9開始只有一個問題,希望蘋果會提供此選項。 到目前為止,已聲明的UIActivities為:

UIActivityTypePostToFacebook, 
UIActivityTypePostToTwitter, 
UIActivityTypePostToWeibo, 
UIActivityTypeMessage, 
UIActivityTypeMail, 
UIActivityTypePrint, 
UIActivityTypeCopyToPasteboard, 
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList,
UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo,
UIActivityTypePostToTencentWeibo,
UIActivityTypeAirDrop

我無法按照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];

 }

有一種方法,但是涉及 私有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];
}

@結束

非法 ”,但它可以工作。

非常高興知道它是否真的通過了蘋果的驗證。


這次真是萬分感謝! 在xcode 8.1上,swift 3,我能夠使用:

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





uiactivity