Простое приложение Swift Cocoa с WebKit: загрузка изображения не работает

я решил сделать свой собственный FB чат приложение, которое просто показывает https://messenger.com на WebView после попытки других приложений "freemium".

мой ViewController.swift имеет всего несколько строк кода, который загружает URL-адрес в веб-представлении

import Cocoa
import WebKit

class ViewController: NSViewController {

    @IBOutlet weak var webView: WebView!
    override func viewDidLoad() {
        super.viewDidLoad()

        let url = NSURL(string: "https://messenger.com")
        let request = NSURLRequest(URL: url!);
        webView.mainFrame.loadRequest(request);
    }

    override var representedObject: AnyObject? {
        didSet {
        // do nothing
        }
    }
}

кроме того, добавление NSAppTransportSecurity ключ к информации.plist чтобы разблокировать HTTP-трафик через HTTPS-соединение, я не сделал никаких других настроек.

вопрос

пожалуйста, взгляните на это изображение первый.

Screenshot of testing app

все выглядит нормально и работает, кроме двух вещей.

  1. загрузка изображения не работает - я помечен как 1 на картинке.

    • обычно (как и в других выпущенных приложениях или из веб-браузеров) если вы нажмете этот значок, он покажет проводник для загрузки изображения, как показано ниже. example of browser upload image

    • мое приложение полностью игнорирует щелчок пользователя этот значок, поэтому я не могу загружать картинки в чат. интересно, если я перетащу изображение в webview, он загружает нормально.

  2. общая картина не отображается - я помечен как 2 на картинке.

    • опять же, из других браузеров или выпущенные приложения, он показывает фотографии, которые я поделился с участниками, как показано ниже. (конечно, я подвергал цензуре картины) example of browser showing shared pics

    • мое приложение пытается загрузить фотографии, но не отображает их. Я вижу, что он пытается загрузить, потому что я вижу круговой индикатор прогресса во время загрузки.

почему?

  1. Я подозреваю, что может быть способ прослушать JavaScript, который запускается в WebView и ссылка на проводник или что-то в этом роде?

  2. этого я не знаю. Я вошел в Messenger (в основном Facebook), поэтому я думаю session здесь нет проблемы. Может быть, проблема с загрузкой jQuery??

что я должен сделать, чтобы решить эти проблемы?

2 ответов


  1. действительно существует метод делегата для открытия новой панели с именем runOpenPanelForFileButtonWithResultListener, документации.

в методе делегата просто создайте новую NSOpenPanel следующим образом:

func webView(sender: WebView!, runOpenPanelForFileButtonWithResultListener resultListener: WebOpenPanelResultListener!, allowMultipleFiles: Bool) {
    let openDialog = NSOpenPanel()
    if (openDialog.runModal() == NSOKButton) {
        let fileName: String = (openDialog.URL?.path)!
        resultListener.chooseFilename(fileName) // Use chooseFilenames for multiple files
    }
}
  1. Я просто попытался создать WebView из приложения Messagers, и изображения загружаются хорошо.
    Вы должны попытаться включить параметры WebView, такие как" автозапуск изображений "или" включить анимированные изображения " из interface builder (или по коду).

этот код работает для меня, и что хорошо, что вы делаете загрузку изображения асинхронной. Вы можете найти больше об этой концепции здесь:http://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1 и: http://www.raywenderlich.com/79150/grand-central-dispatch-tutorial-swift-part-2

редактировать

Я вам нужно создать новый класс или новый файл iOS Swift с именем ImageLoader С таким содержанием:

class ImageLoader {

var cache = NSCache()

class var sharedLoader : ImageLoader {
    struct Static {
        static let instance : ImageLoader = ImageLoader()
    }
    return Static.instance
}

func imageForUrl(urlString: String, completionHandler:(image: UIImage?, url: String) -> ()) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {()in
        var data: NSData? = self.cache.objectForKey(urlString) as? NSData

        if let goodData = data {
            let image = UIImage(data: goodData)
            dispatch_async(dispatch_get_main_queue(), {() in
                completionHandler(image: image, url: urlString)
            })
            return
        }

        var downloadTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
            if (error != nil) {
                completionHandler(image: nil, url: urlString)
                return
            }

            if data != nil {
                let image = UIImage(data: data)
                self.cache.setObject(data, forKey: urlString)
                dispatch_async(dispatch_get_main_queue(), {() in
                    completionHandler(image: image, url: urlString)
                })
                return
            }

        })
        downloadTask.resume()
    })

}

}

II. в вашем фактическом viewController вы вызываете метод "imageForUrl" из ImageLoaded, следуя этим строкам кода:

ImageLoader.sharedLoader.imageForUrl("http://upload.wikimedia.org/wikipedia/en/4/43/Apple_Swift_Logo.png", completionHandler:{(image: UIImage?, url: String) in
        self.myImage.image = image!
    })

Я взял код из этой ссылки: https://teamtreehouse.com/community/does-anyone-know-how-to-show-an-image-from-url-with-swift

отредактировано для изображения, загруженного в webview

здесь код. Он работает идеально подходит для меня:

override func viewDidLoad() {
    super.viewDidLoad()
    let myWebView:UIWebView = UIWebView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height))
    myWebView.loadRequest(NSURLRequest(URL: NSURL(string: "https://scontent-vie1-1.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/12144725_10204647881668565_4367944825116750386_n.jpg?oh=5ecdae91f5258ffe0e0355e176f8eb8a&oe=56B007CA")!))
    self.view.addSubview(myWebView)
}