swift - 如何在 iOS 11 中禁用“保存到文件”?
问题描述
我有一个 iOS 应用程序,它创建一个 PDF 并使用 UIActivityViewController 使用默认共享功能进行共享。我不得不阻止一些共享工具,如 Vimeo、Facebook、Twillio 等,而且文件不应该存储在设备上。
在新的 iOS 11 版本中,Apple 提供了具有默认共享功能的 SaveToFiles 选项。我尝试使用excludedActivityTypes,并阻止“com.apple.CloudDocsUI.AddToiCloudDrive”选项,但没有成功。
谁能帮助我通过 Swift 禁用 SaveToFile 选项?我正在使用 Xcode 9.3 和 Swift 4。
解决方案
目前,我们可能无法禁用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
// ....
推荐阅读
- python - 关于模块属性的 python 类型提示(如模块协议)
- regex - 使用正则表达式从数据中提取文本
- javascript - 打开模式时防止在正文上滚动导致页面自动转到顶部
- javascript - 通过javascript使用级联下拉菜单时初始化子按钮
- c++ - PCL::RegionGrowing 负指数
- postgresql - 将超时设置为 Postgres 服务 pg_ctl
- mongodb - 在 mongo 聚合查询中获取值百分比
- firebase - 我一直在尝试从我的用户配置文件中的 firebase Firestore 获取用户数据正在使用颤振我需要帮助,用户数据存储在数据库中
- ansible - 奇怪的 Ansible 问题
- c# - 水晶报表 64 位