5

我正在尝试在 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。希望这些信息对将来的人有所帮助。

4

0 回答 0