Как отключить сохранение в файлы в iOS 11?

У меня есть приложение для iOS, которое создает PDF-файл и используется совместно с помощью UIActivityViewController с использованием функции общего доступа по умолчанию. Мне пришлось заблокировать несколько средств обмена, таких как Vimeo, Facebook, Twillio и т. д., а также файл не должен храниться на устройстве.

В новой версии iOS 11 Apple предоставила опцию SaveToFiles с функцией общего доступа по умолчанию. Я пытался использовать excludeActivityTypes и блокировать опцию «com.apple.CloudDocsUI.AddToiCloudDrive», но безуспешно.

Может ли кто-нибудь помочь мне отключить опцию SaveToFile через Swift? Я использую Xcode 9.3 и Swift 4.


person BlackPearl12    schedule 02.05.2018    source источник
comment
Кажется, это известная проблема. Удаление «Сохранить в файлы» не является одним из разрешенных UIActivityTypes forums.developer.apple.com/thread/ 82750   -  person rbaldwin    schedule 02.05.2018
comment


Ответы (1)


В настоящее время мы, вероятно, не можем отключить Save to Files или Add to Shared Album, добавив excludedActivityTypes в activityViewController. Но мы можем предотвратить, когда пользователь нажмет два типа активности, не будет выполнять действие, вместо этого мы покажем предупреждение.

Сначала мы создаем собственные 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
// ....
person Giang    schedule 17.02.2020