2014-08-28 15 views
6

È possibile eseguire uno screenshot della zona visibile corrente della visualizzazione Web in Safari da un'estensione di condivisione? Potrei usare Windows, ma l'applicazione UIA non è supportata sulle estensioni, quindi non posso accedere a quella finestra.Screenshot Safari da Share Extension

risposta

2

Non è possibile poiché non è possibile raggiungere UIApplicazione da un'estensione. Non puoi ottenere il primo UIWindow, che è il livello di Safari, quindi devi giocare con il file di pre-elaborazione di Javascript che hanno le estensioni. Quindi, basta creare un file Javascript che, una volta inviato a Safari, generi una stringa base64 con i dati dell'immagine della zona visibile corrente. Prendi quella stringa attraverso l'identificatore kUTTypePropertyList nella tua estensione. Dal momento che dovrebbe essere NSData, generare UIImage da lì, usando +imageWithData. Questo è quello che stai cercando, senza dover caricare di nuovo la pagina, evitando un secondo carico e una brutta immagine se la pagina web richiede un login.

+0

Puoi fornire un frammento di codice del file js di esempio? – iMash

+0

@skozz Ciao, sto cercando di usare html2canvas per generare l'immagine, ma come restituirla all'estensione. Ho anche provato a restituire document.body ma non funziona. –

0

Per quanto ne so, non è possibile a meno che non si invochi l'API che è necessario in modo dinamico, e anche così si potrebbe incorrere in problemi di autorizzazione di contesto e problemi di approvazione App Store.

Un'alternativa potrebbe essere passando l'URL Safari in corso al proprio interno, caricarla utilizzando un UIWebView nascosta e rendere questa visione in un UIImage, ma si perderanno le informazioni correnti zona visibile ...

+1

Questo è quello che sto facendo attualmente, ma non riesco a ottenere la zona visibile attuale l'utente e io devo caricare la stessa pagina web due volte (safari e la mia UIWebView nascosta). Immagino che questa sia la parte che non ci hanno detto dell'estensibilità, quanto sia limitata. –

+0

Questo approccio fallirà anche per le pagine Web in cui l'utente deve effettuare il login. – orkoden

+0

yes non può fare una ricarica per alcuni casi –

0

Modifica: quindi il sotto funziona nel simulatore ma fa non lavoro sul dispositivo. Al momento sto cercando una soluzione.

Non è possibile ottenere solo l'area visibile di Safari, ma è possibile ottenere uno screenshot con un po 'di ingegno. Il seguente metodo cattura uno screenshot da 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

questo è il modo approvato per catturare lo screenshot di una pagina web in un prolungamento quota:

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. 
     }]; 
    } 
}