繁体   English   中英

使用WebKit的简单Swift Cocoa应用程序:上传图片不起作用

[英]Simple Swift Cocoa app with WebKit: Upload picture doesn't work

我决定制作自己的FB聊天应用程序,在尝试其他'免费增值'应用程序后,只在WebView上显示https://messenger.com

我的ViewController.swift只有几行代码,可以在Web视图中加载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密钥添加到info.plist以通过HTTPS连接解锁HTTP流量之外,我还没有做任何其他设置。

请先看看这张图片。

测试应用的屏幕截图

除了两件事,一切看起来都很好。

  1. 上传图片不起作用 - 我在图片中标记为1。

    • 通常(如在其他已发布的应用程序或Web浏览器中),如果您单击该图标,它会显示一个浏览器来上传如下图片。 浏览器上传图片的示例

    • 我的应用完全忽略了用户点击该图标,因此我无法将任何图片上传到聊天中。 有趣的是,如果我将图片拖放到webview ,它上传就好了。

  2. 共享图片没有显示 - 我在图片中标记为2。

    • 再次,从其他浏览器或已发布的应用程序,它显示我与参与者共享的图片,如下所示。 (当然我审查了这些照片) 显示共享图片的浏览器示例

    • 我的应用程序尝试加载图片,但不显示它们。 我可以看到它试图加载,因为我在加载时看到循环进度指示器。

为什么?

  1. 我怀疑可能有一种方法来监听在WebView触发的JavaScript并链接到文件浏览器或类似的东西?

  2. 这个我不知道。 我登录了Messenger(基本上是Facebook),所以我认为session不是问题。 也许一些jQuery加载问题?

我该怎么做才能解决这些问题?

  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. 我只是尝试从Messagers App创建一个WebView,图像加载得很好。
    您应该尝试从界面构建器(或代码)启用“自动加载图像”或“启用动画图像”等WebView选项。

这段代码适合我,这里的好处是你使图像的下载异步。 您可以在此处找到有关此概念的更多信息: http//www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1和: http//www.raywenderlich.com/79150/grand-中央调度,教程迅速,部分2

编辑

I.您必须使用以下内容创建名为ImageLoader的新类或新的iOS Swift文件:

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中,您可以按照以下代码行从ImageLoaded调用方法'imageForUrl':

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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM