2014-08-28 2 views
6

Возможно ли выполнить скриншот текущей видимой зоны веб-просмотра в Safari из расширения Share? Я мог бы использовать окна, но UIApplication не поддерживается в расширениях, поэтому я не могу получить доступ к этому окну.Скриншот Safari из Share Extension

ответ

2

Вы не можете так как UIApplication не может быть достигнут из расширения. Вы не можете получить первый UIWindow, который является слоем Safari, поэтому вам нужно играть с файлом предварительной обработки Javascript, который есть у расширений. Поэтому просто создайте файл Javascript, который при отправке в Safari генерирует строку base64 с текущими данными изображения видимой зоны. Возьмите эту строку через идентификатор kUTTypePropertyList в своем расширении. Поскольку это должно быть NSData, сгенерируйте UIImage оттуда, используя +imageWithData. Это то, что вы ищете, без необходимости повторно загружать страницу, предотвращая вторую загрузку и плохое изображение, если веб-страница требует входа.

+0

Можете ли вы предоставить фрагмент кода примера js-файла? – iMash

+0

@skozz Привет, Я пытаюсь использовать html2canvas для генерации изображения, но как вернуть это расширение. Я также попытался вернуть document.body, но он не работает. –

0

Насколько я знаю, вы не можете, если вы не вызываете API, который вам нужен динамически, и даже при этом вы можете столкнуться с проблемами разрешения конфликтов и проблемами утверждения магазина приложений.

Альтернатива может быть прохождение текущего URL Safari для вашего расширения, загрузите его с помощью скрытой UIWebView и сделать этот вид в UIImage, но вы потеряете текущую видимую информацию о зоне ...

+1

Это то, что я сейчас делаю, но я не могу получить текущую видимую зону пользователь и я должен загрузить одну и ту же веб-страницу дважды (сафари и мой скрытый UIWebView). Думаю, это та часть, о которой они не говорили нам о расширяемости, насколько она ограничена. –

+0

Этот подход также не сработает для веб-страниц, где пользователь должен войти в систему. – orkoden

+0

да не может сделать перезагрузку для некоторых случаев –

0

Редактировать: Таким образом, ниже работает в Симуляторе, но не Работает на устройстве. В настоящее время я ищу решение.

Вы не можете получить только видимую область Сафари, но вы можете сделать получить скриншот с небольшой изобретательностью. Следующий метод отображает скриншот из 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 
} 
0

Это утвержденный способ захватить скриншот веб-страницы в расширении доли:

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. 
     }]; 
    } 
} 
Смежные вопросы