web-dev-qa-db-ja.com

UIActivityViewControllerからNotesアプリとRemindersアプリを除外する方法は?

UIActivityViewControllerを作成し、StringURLを渡します。これは、明らかに、除外したいアイテムを使用するようにUIActivityViewControllerを構成します(私の目的は、アプリに関する情報を共有することです)。

適切なexcludedActivityTypesを設定することにより、多くのシステム提供アクティビティ(「読書リストに追加」など)を除外できました。

ただし、リマインダーとメモアプリを除外することはできません。誰かがそれを行う方法を提案できますか?これらのアプリはリストの3番目と4番目に表示されるため、ユーザーがスクロールしない限りTwitterとFacebookは表示されません。

52

方法はありますが、プライベートAPIが含まれます。

時々Appleは、特にバグを修正する場合、例外を作成します。

詳細を見てみましょう...


IActivityViewControllerには「_availableActivitiesForItems:」というプライベートメソッドがあり、これはISocialActivityオブジェクトの配列を返します。

ISocialActivityには、「activityType」という興味深いプロパティがあり、ドメイン形式のアクティビティタイプを返します。

いくつかのテストの後、リマインダーとメモのアクティビティタイプを見つけることができました。

  • com.Apple.reminders.RemindersEditorExtension
  • com.Apple.mobilenotes.SharingExtension

残念ながら、これらの2つのタイプを ".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];
}

@終わり

"Illegal"ですが、動作します。

実際にApple検証に合格したかどうかを知ることは素晴らしいことです。

18
Matteo Pacini

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)
48
Daniel Storm

Swift 2.2バージョン。 iOS9.3でテスト済み。動作します。

[〜#〜] update [〜#〜]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

34
guido

ノートとリマインダーはAppleドキュメントでUIActivitiesとして宣言されていないため、これらを除外することはできません。iOS9以降の問題のみで、できればApple =はこのオプションを提供します。現時点までに宣言されているUIActivitiesは次のとおりです。

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

私が見つけた唯一の方法は、独自のカスタムアクティビティを作成し、それらにパラメータを直接(アクティビティシート経由ではなく)渡してから、ランダム変数(文字列、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を使用したいのですが...すぐにもっと良い解決策があることを願っています

2
eirik

Swift3 +の場合、プライベートAPIハックは必要ありません。 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)
2
mm282

これありがとう! xcode 8.1では、Swift 3、次を取得するために使用できました:

UIActivityType(rawValue: "com.Apple.reminders.RemindersEditorExtension")、UIActivityType(rawValue: "com.Apple.mobilenotes.SharingExtension")、

2
test ing

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

 }
1