来自 Share Extension 的 Safari 截图

Posted

技术标签:

【中文标题】来自 Share Extension 的 Safari 截图【英文标题】:Screenshot Safari from Share Extension 【发布时间】:2014-08-28 15:41:42 【问题描述】:

是否可以通过共享扩展对 Safari 中 web 视图的当前可见区域进行屏幕截图?我可以使用窗口,但扩展不支持 UIApplication,因此我无法访问该窗口。

【问题讨论】:

【参考方案1】:

因为无法从扩展程序访问 UIApplication,所以您不能。您无法获得第一个 UIWindow,即 Safari 层,因此您必须使用扩展具有的 javascript 预处理文件。因此,只需创建一个 Javascript 文件,该文件在发送到 Safari 时会生成一个带有当前可见区域图像数据的 base64 字符串。通过扩展中的 kUTTypePropertyList 标识符获取该字符串。因为那应该是 NSData,所以使用 +imageWithData 从那里生成 UIImage。这就是您要查找的内容,无需再次加载页面,如果网页需要登录,可以防止第二次加载和错误图像。

【讨论】:

@skozz 嗨,我正在尝试使用 html2canvas 生成图像,但如何将其返回到扩展程序。我也尝试返回 document.body 但它不起作用。 我设法用 html2canvas 库捕获屏幕,但是扩展崩溃...似乎是当 js 处理时间过长时出现一些超时错误【参考方案2】:

据我所知,除非您动态调用所需的 API,否则您不能这样做,即使如此,您也可能会遇到上下文权限问题和应用商店批准问题。

另一种方法是将当前的 Safari URL 传递给您的扩展,使用隐藏的 UIWebView 加载它并将此视图呈现为 UIImage,但您将丢失当前可见区域信息...

【讨论】:

这就是我目前正在做的事情,但我无法获得用户当前的可见区域,我必须两次加载同一个网页(safari 和我隐藏的 UIWebView)。我想这是他们没有告诉我们关于可扩展性的部分,它有多么有限。 这种方法对于用户必须登录的网页也会失败。【参考方案3】:

编辑:所以下面在模拟器中工作,但 not 在设备上工作。我目前也在寻找解决方案。

你不能只得到 Safari 的可见区域,但你可以得到一个小技巧的截图。以下方法从 ShareViewController 中截取屏幕截图。

func captureScreen() -> UIImage

    // Get the "screenshot" view.
    let view = UIScreen.mainScreen().snapshotViewAfterScreenUpdates(false)

    // Add the screenshot view as a subview of the ShareViewController's view.
    self.view.addSubview(view);

    // Now screenshot *this* view.
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, false, 0);
    self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Finally, remove the subview.
    view.removeFromSuperview()

    return image

【讨论】:

【参考方案4】:

这是在共享扩展中捕获网页屏幕截图的认可方式:

for (NSExtensionItem *item in self.extensionContext.inputItems) 
    for (NSItemProvider *itemProvider in item.attachments) 
        [itemProvider loadPreviewImageWithOptions:@NSItemProviderPreferredImageSizeKey: [NSValue valueWithCGSize:CGSizeMake(60.0f, 60.0f)] completionHandler:^(UIImage * item, NSError * _Null_unspecified error) 
            // Set the size to that desired, however,
            // Note that the image 'item' returns will not necessarily by the size that you requested, so code should handle that case.
            // Use the UIImage however you wish here.
        ];
    

【讨论】:

以上是关于来自 Share Extension 的 Safari 截图的主要内容,如果未能解决你的问题,请参考以下文章

App Extensions篇之Share Extension

错误:无法打开扩展控制文件“/usr/pgsql-9.6/share/extension/postgis.control”:没有这样的文件或目录

iOS扩展开发攻略Share Extension

在 Share Extension (Swift) 中处理 NSItemProvider 数据类型

用户未在 Share App Extension 中登录 Firebase

iOS9 Share Extension 无法在 Xcode 上调试