使用Swift 4在共享扩展中加载视频

时间:2017-11-13 10:16:20

标签: ios swift swift4 movie share-extension

我正在开发一个iOS应用程序,该应用程序提供了一个共享扩展,可以将视频从照片库上传到服务器。 我找不到任何关于如何处理视频的例子。

这是我的代码:

if itemProvider.hasItemConformingToTypeIdentifier("public.movie") {
    print ("A movie has been chosen")

    itemProvider.loadItem(forTypeIdentifier: "public.movie", options: nil, completionHandler: { (data, error) in
        print ("Loaded the video")
        if let video = data as? Data {
            // Do stuff with the movie now.
            print ("The movie should be loaded now")
        }
    self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
    })  
}

第一个print被打印出来,所以我实际上是public.movie项目。但不是第二个和第三个print

有人可以告诉我电影是如何通过的以及我如何处理它?

由于

2 个答案:

答案 0 :(得分:0)

loadItem以异步方式运行,当您使用视频文件时,文件大小远远大于图像,因此在self.extensionContext?.completeRequest运行并关闭共享扩展之前,loadItem没有时间完成自身。

我找到的解决方案涉及以下内容:

(1)创建一个布尔变量,用于衡量loadItem函数是否完整。

var loadItemDone: Bool = false

(2)编写一个递归函数,定期检查loadItem函数是否已完成。如果是,则运行completeRequest调用。如果没有,继续递归。在我的情况下,我每秒检查一次完成,这就是为什么它说“after:1”。

func waitForLoadItemToComplete(after seconds: Int) {
        let deadline = DispatchTime.now() + .seconds(seconds)
        DispatchQueue.main.asyncAfter(deadline: deadline) {
            if self.loadItemDone == false{
                self.waitForLoadItemToComplete(after: 1)
            }else{
                let alert = UIAlertController(title: "Success!", message: "Your file is uploaded!", preferredStyle: .alert)

                let action1 = UIAlertAction(title: "Yeah!", style: .cancel) { (action) in
                    print("User acknowledged file uploaded.")
                    self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
                }

                alert.addAction(action1)

                self.present(alert, animated: true, completion: nil)

            }
        }
    }

(3)当loadItem完成时,将loadItemDone变量设置为true:

if attachment.hasItemConformingToTypeIdentifier("com.apple.quicktime-movie") {

    // Do stuff with the movie now.

    self.loadItemDone = true
}

'public.movi​​e'对我不起作用。我不得不使用'com.apple.quicktime-movie'

另外,DispatchQueue对我不起作用,这就是为什么我不得不破解...我希望听到更多熟悉分享扩展中的线程的人提供更好的解决方案......

答案 1 :(得分:0)

在应用程序组的帮助下,您可以解决:http://www.atomicbird.com/blog/sharing-with-app-extensions

  1. 从库中获取视频并将数据保存在userdefaults中。
  2. 将USerDefault密钥转移到appschems并在应用程序的del delgate中拦截它打开的URL方法。
  3. 使用与视频相同的密钥加载并将其转发到服务器。
  4. 有关应用群组和分享扩展程序的参考:https://medium.com/@abhishekthaplithapliyal/ios-share-extension-930ba1ad3c3d