如何从UIActivityViewController中排除Notes和提醒应用程序? [英] How to exclude Notes and Reminders apps from the UIActivityViewController?

查看:696
本文介绍了如何从UIActivityViewController中排除Notes和提醒应用程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个 UIActivityViewController 并传递 String URL 到它。这显然配置 UIActivityViewController 使用一些我想排除的项目(我的目标是分享我的应用程序的信息)。



通过设置相应的 excludedActivityTypes ,我已经排除了大量系统提供的活动(如添加到阅读列表)。

b
$ b

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

解决方案

,但涉及私人API



有时苹果会出现异常,特别是如果您修复了错误。



让我们深入细节...






UIActivityViewController 方法称为_availableActivitiesForItems:,它返回一个 UISocialActivity 对象的数组。



UISocialActivity ,称为activityType,它返回一个域格式的活动类型。



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




  • com.apple.reminders.RemindersEditor扩展

  • com.apple.mobilenotes.SharingExtension



很遗憾,将这两种类型传递到.excludedActivityTypes没有任何区别。





_ availableActivitiesForItems:救援!





老方式



更新:I发现了一个更好的方法。



我发布的第一个解决方案在某些情况下不工作,因此不应该被认为是稳定的。 p>


标题:

  #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];

[活动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


$ b

新办法



标题:

  @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



Illegal,但它的工作原理。



很高兴知道它是否真的通过苹果验证。


I am creating a UIActivityViewController and pass String and URL to it. This, obviously, configures the UIActivityViewController to use some items which I want to exclude (my objective is to share the info about my app).

I have managed to exclude lots of system provided activities (like 'Add to Reading list') by setting the appropriate excludedActivityTypes.

However, I am unable to exclude Reminders and Notes apps. Can someone suggest a way of doing it? These apps appear 3rd and 4th on the list and therefore make Twitter and Facebook not visible unless user scrolls.

解决方案

There is a way, but involves private API.

Sometimes Apple makes exceptions, especially if you fix a bug.

Let's dive into details...


UIActivityViewController has got a private method called "_availableActivitiesForItems:", which returns an array of UISocialActivity objects.

UISocialActivity has got an interesting property, called "activityType", which returns a domain-formatted activity type.

After some tests, I managed to discover the Reminder and Notes activity types:

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

Unfortunately, passing those two types into ".excludedActivityTypes" didn't make any difference.

"_availableActivitiesForItems:" to the rescue!

OLD WAY:

Update: I've found a better way to do it.

The first solution I've posted doesn't work in some cases, thus shouldn't be considered stable.

Header:

#import <UIKit/UIKit.h>

@interface UISocialActivity : NSObject

- (id)activityType;

@end

@interface UIActivityViewController (Private)

- (id)_availableActivitiesForItems:(id)arg1;

@end

@interface ActivityViewController : UIActivityViewController

@end

Implementation:

@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:

Header:

@interface UIActivityViewController (Private)

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

@end

@interface ActivityViewController : UIActivityViewController

@end

Implementation:

@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

"Illegal", but it works.

It would be great to know if it actually passes Apple validation.

这篇关于如何从UIActivityViewController中排除Notes和提醒应用程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆