2017-11-13 5 views
0

写真ライブラリからサーバーに動画をアップロードするための共有拡張機能を提供するiOSアプリで作業しています。 動画の処理方法の例が見つかりません。動画を共有するにはSwift 4と共有する

は、ここに私のコードです:

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

誰かが、映画がどのように渡され、私はそれをどう扱うことができるのか教えてください。

おかげ

+0

チェックこの例では、あなたを助けている場合http://www.technetexperts.com/mobile/share-extension-in-ios-application-overview-with -example/ –

+0

ありがとうございますが、あなたが言及している例は私がすでに扱っているイメージです。私はビデオがどのように渡されるか把握できません。 – radar

+0

共有拡張は、ビデオデータではなく、選択したビデオ項目の場所(ファイルURL)を提供します – SPatel

答えて

0

loadItemは非同期に実行され、あなたがビデオファイルで作業しているときloadItemがself.extensionContext前に自分自身を完了する時間がありませんので、ファイルサイズが、画像よりもはるかに大きいのですか?.completeRequest実行共有拡張を閉じます。私が見つけた

ソリューションは、次の関係:

(1)loadItem機能が完全であるか否かを測定ブール変数を作成します。

var loadItemDone: Bool = false 

(2)loadItem関数が完了したかどうかを定期的に確認する再帰関数を作成します。その場合は、completeRequest呼び出しを実行します。そうでない場合は、再帰を続行します。私の場合は、1秒に1回完了するかどうかをチェックします。その理由は「後:1」です。 loadItemが完了したときに

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)、trueにloadItemDone変数を設定します。

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

    // Do stuff with the movie now. 

    self.loadItemDone = true 
} 

'public.movi​​eは、' 私のために動作しませんでした。私は 'com.apple.quicktime-movie'を使用しなければならなかった

また、DispatchQueueは私にとってはうまくいきませんでした。なぜなら私はちょっとハックしなければならなかったからです。共有の拡張機能...あなたの周りの作業を行うことができ、アプリケーション・グループの助けを借りて

0

内のスレッドで:http://www.atomicbird.com/blog/sharing-with-app-extensions

  1. ライブラリからビデオを取得し、userdefaults内のデータで保存します。
  2. USerDefaultキーをappschems経由で転送し、appのappgateにopen URLメソッドを代行受信します。
  3. ビデオと同じキーロードでサーバーに転送します。
  4. アプリグループの参照と共有拡張のための

https://medium.com/@abhishekthaplithapliyal/ios-share-extension-930ba1ad3c3d

関連する問題