如何在iOS 11中禁用"保存到文件"?

5
我有一个创建PDF的iOS应用程序,使用UIActivityViewController默认共享功能进行共享。我需要阻止一些共享设施,如Vimeo、Facebook、Twillio等,文件也不应存储在设备上。
随着新版iOS 11的推出,苹果提供了SaveToFiles选项,可与默认共享功能一起使用。我尝试使用excludedActivityTypes,并阻止“com.apple.CloudDocsUI.AddToiCloudDrive”选项,但没有成功。
有人能帮我通过Swift禁用SaveToFile选项吗?我正在使用Xcode 9.3和Swift 4。

似乎是一个已知的问题。删除“保存到文件”不是允许的UIActivityTypes之一。https://forums.developer.apple.com/thread/82750 - rbaldwin
可能是[共享表 - 排除在UIActivityType中未提供为类型属性的选项]的重复问题(https://dev59.com/c6bja4cB1Zd3GeqPd0n3)。 - rbaldwin
1个回答

1
目前,我们可能无法通过在activityViewController中添加excludedActivityTypes来禁用“保存到文件”或“添加到共享相册”。但是,当用户按下两个活动类型时,我们可以防止执行操作,而是显示警报。
首先,我们创建自定义的UIActivityItemProvider。
class ActivityItemProvider: UIActivityItemProvider {
  override func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
    // in here we'll check activityType = "com.apple.CloudDocsUI.AddToiCloudDrive" (Save to Files),
    // activityType = "com.apple.mobileslideshow.StreamShareService" (Shared Album)
    if(activityType.rawValue.contains("com.apple.CloudDocsUI.AddToiCloudDrive") || (activityType.rawValue.contains("com.apple.mobileslideshow.StreamShareService") {
      // dismiss activityViewController first
      activityViewController.dismiss(animated: true, completion: nil)
      // show alert controller, we can using UIApplication.shared.keyWindow?.rootViewController to present alert
      return nil
    }
    return self.placeholderItem
}


在我们调用UIActivityController的地方,让我们使用
let item = ActivityItemProvider.init(placeholderItem: {your item})
let activityViewController = UIActivityViewController.init(activityItems: item, applicationActivities: nil)

ObjectiveC版本

#import "BRActivityItemProvider.h"
#import "UIViewController+Additions.h"
@implementation BRActivityItemProvider

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType {
  [super activityViewController:activityViewController itemForActivityType:activityType];
  NSLog(@"itemForActivityType %@", activityType);
  if([activityType containsString:@"com.apple.CloudDocsUI.AddToiCloudDrive"] || [activityType containsString:@"com.apple.mobileslideshow.StreamShareService"]) {
    [activityViewController dismissViewControllerAnimated:true completion:^{
      UIViewController *rootController = [UIApplication sharedApplication].keyWindow.rootViewController;
      if(rootController != nil) {
        NSString *str = [activityType containsString:@"com.apple.CloudDocsUI.AddToiCloudDrive"]
        ? @"Cannot save file to iCloud Driver"
        : @"Cannot save file to Shared Album";
        dispatch_async(dispatch_get_main_queue(), ^{
// this's my custom show alert controller, you can change your own
          [rootController showAlertController:str action:^(UIAlertAction * _Nonnull action) {
          }];
        });
      }
    }];
    return nil;
  }
  return self.placeholderItem;
}


在哪里调用 UIActivityViewController
BRActivityItemProvider *itemProvider = [[BRActivityItemProvider alloc]initWithPlaceholderItem:item];
    UIActivityViewController *activityController = [[UIActivityViewController alloc]initWithActivityItems:itemProvider applicationActivities:nil];
    activityController.popoverPresentationController.sourceView = controller.view;
// your logic code
// ....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接