我正在尝试在 iOS 13 上为我的 WKWebView 创建自定义上下文菜单。我可以覆盖普通链接的默认上下文菜单,但是,当我点击并按住图像时,会显示默认上下文菜单。
这是我的代码:
-(void) webView:(WKWebView *)webView
contextMenuConfigurationForElement:(WKContextMenuElementInfo *)elementInfo
completionHandler:(void (^)(UIContextMenuConfiguration *configuration))completionHandler {
NSURL *url = elementInfo.linkURL;
__block BOOL isURLImage;
__block UIImage *image;
if (url != nil) {
UIAction *openURL = [UIAction actionWithTitle:@"Open URL" image:nil identifier:nil handler:^(UIAction *action) {
[self.webView loadRequest:[NSURLRequest requestWithURL:url]];
}];
UIAction *openNewTab = [UIAction actionWithTitle:@"Open in new tab" image:nil identifier:nil handler:^(UIAction *action) {
[self createNewTab:url];
}];
dispatch_async(dispatch_queue_create("getImage", NULL), ^(void) {
NSData *data = [NSData dataWithContentsOfURL:url];
image = [UIImage imageWithData:data];
if (image == nil) {
dispatch_async(dispatch_get_main_queue(), ^{
UIContextMenuConfiguration *menuconfig = nil;
menuconfig = [UIContextMenuConfiguration configurationWithIdentifier:nil previewProvider:nil actionProvider:^(NSArray *suggestedAction) {
suggestedAction = nil;
return [UIMenu menuWithTitle:@"" children:@[openURL, openNewTab]];
}];
completionHandler(menuconfig);
});
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
UIAction *saveImage = [UIAction actionWithTitle:@"Save image" image:nil identifier:nil handler:^(UIAction *action) {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *assetRequest;
assetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
} completionHandler:^(BOOL success, NSError *error) {
}];
}];
UIContextMenuConfiguration *menuconfig = nil;
menuconfig = [UIContextMenuConfiguration configurationWithIdentifier:nil previewProvider:nil actionProvider:^(NSArray *suggestedAction) {
suggestedAction = nil;
return [UIMenu menuWithTitle:@"" children:@[openURL, openNewTab, saveImage]];
}];
completionHandler(menuconfig);
});
}
});
}
else {
completionHandler(nil);
}
}
任何帮助将不胜感激。
更新:
在更新我的应用程序以支持 iOS 14 的默认浏览器权限时,我再次遇到了与保存图像相关的问题。对于权利,您的应用程序只能使用 NSPhotoLibraryAddUsageDescription 请求只写权限。这是保护用户隐私的好主意,但只有一个问题:在 iOS 13 上仅使用 NSPhotoLibraryAddUsageDescription 保存图像的唯一方法是 UIImageWriteToSavedPhotosAlbum()。UIImageWriteToSavedPhotosAlbum() 不支持保存动画 gif。
有趣的一点:Apple 的图像默认上下文菜单配置(保存图像时无法覆盖的配置),即使在 info.plist 中指定了 NSPhotoLibraryAddUsageDescription,也会在 iOS 13 上保存 gif。希望这些信息对将来的人有所帮助。