UIActivityViewController
を作成し、String
とURL
を渡します。これは、明らかに、除外したいアイテムを使用するようにUIActivityViewController
を構成します(私の目的は、アプリに関する情報を共有することです)。
適切なexcludedActivityTypes
を設定することにより、多くのシステム提供アクティビティ(「読書リストに追加」など)を除外できました。
ただし、リマインダーとメモアプリを除外することはできません。誰かがそれを行う方法を提案できますか?これらのアプリはリストの3番目と4番目に表示されるため、ユーザーがスクロールしない限りTwitterとFacebookは表示されません。
方法はありますが、プライベートAPIが含まれます。
時々Appleは、特にバグを修正する場合、例外を作成します。
詳細を見てみましょう...
IActivityViewControllerには「_availableActivitiesForItems:」というプライベートメソッドがあり、これはISocialActivityオブジェクトの配列を返します。
ISocialActivityには、「activityType」という興味深いプロパティがあり、ドメイン形式のアクティビティタイプを返します。
いくつかのテストの後、リマインダーとメモのアクティビティタイプを見つけることができました。
残念ながら、これらの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検証に合格したかどうかを知ることは素晴らしいことです。
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)
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"
「クラウド」を取り除きます。
ノートとリマインダーはAppleドキュメントでUIActivities
として宣言されていないため、これらを除外することはできません。iOS9以降の問題のみで、できればApple =はこのオプションを提供します。現時点までに宣言されているUIActivitiesは次のとおりです。
UIActivityTypePostToFacebook,
UIActivityTypePostToTwitter,
UIActivityTypePostToWeibo,
UIActivityTypeMessage,
UIActivityTypeMail,
UIActivityTypePrint,
UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList,
UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo,
UIActivityTypePostToTencentWeibo,
UIActivityTypeAirDrop
私が見つけた唯一の方法は、独自のカスタムアクティビティを作成し、それらにパラメータを直接(アクティビティシート経由ではなく)渡してから、ランダム変数(文字列、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を使用したいのですが...すぐにもっと良い解決策があることを願っています
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)
これありがとう! xcode 8.1では、Swift 3、次を取得するために使用できました:
UIActivityType(rawValue: "com.Apple.reminders.RemindersEditorExtension")、UIActivityType(rawValue: "com.Apple.mobilenotes.SharingExtension")、
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];
}