1

我正在开发一个 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

有人可以告诉我这部电影是如何通过的以及我该如何处理吗?

谢谢

4

2 回答 2

0

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

  1. 从库中获取视频并保存在 userdefaults 中的数据中。
  2. 通过appschems传输USerDefault密钥并在app的app delgate中截取它的open URL方法。
  3. 使用相同的密钥加载该视频并将其转发到服务器。

有关应用程序组和共享扩展的参考:https ://medium.com/@abhishekthaplithapliyal/ios-share-extension-930ba1ad3c3d

于 2018-02-02T03:56:55.453 回答
0

loadItem 异步运行,当您处理视频文件时,文件大小比图像大得多,因此 loadItem 在 self.extensionContext?.completeRequest 运行并关闭共享扩展之前没有时间完成自身。

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

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

var loadItemDone: Bool = false

(2) 编写一个递归函数,定期检查loadItem函数是否完成。如果是,则运行 completeRequest 调用。如果不是,继续递归。就我而言,我每秒检查一次是否完成,这就是为什么它说“之后: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) 将 loadItemDone 变量设置为 true,当 loadItem 完成时:

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

    // Do stuff with the movie now.

    self.loadItemDone = true
}

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

此外,DispatchQueue 对我不起作用,这就是为什么我不得不稍微修改一下......我很想从更熟悉共享扩展中线程的任何人那里听到更好的解决方案......

于 2018-02-02T03:40:56.497 回答