2016-08-15 3 views
3

私はビデオ共有アプリケーションで作業しています。私はObjective-CバージョンとSwiftを持っています。私は選択したビデオのURLを両方のプロジェクトでFirebaseストレージにアップロードし、取得します。 Objective-Cプロジェクトでは、ビデオは問題なく表示されますが、SwiftのバージョンではURLはコンソールに記録されていますがまったく同じですがAVPlayerは空白ですノイズは何もない。ここFirebaseストレージから返されたURLは、あるプロジェクトでは動作しますが、他のプロジェクトでは動作しません。

私スウィフトアップロードと検索用コードである:

アップロード:(metadata.downloadURLとmetadata.downloadURL.absoluteStringの両方でみた)

func sendData(string: String) { 

    if string == "" && self.urlToUpload == nil { 

     self.showAlertWithTitle("Please upload a valid file and caption", message: "") 

    } 

    else { 

    //write url to storage ref 

    if urlToUpload != nil { 

     let childString = NSString(format: "Video %@", NSUUID().UUIDString) 

     let videosRef = storageReference.child("postVideos").child(childString as String) 

     let metadata = FIRStorageMetadata() 
     metadata.contentType = "Video" 

     let uploadTask = videosRef.putFile(self.urlToUpload!, metadata: metadata, completion: { (metadata, error) in 

      if error != nil { 

       print("ERROR DESC. %@", error?.localizedDescription) 
       print("ERROR %@", error) 

      } 

      else { 
       print(metadata) 

       //pop alert here then set button back etc. 
      } 
     }) 

     uploadTask.observeStatus(.Success) { snapshot in 

      print("Success!") 
      print(snapshot) 

      print(snapshot.metadata?.downloadURL()) 

      //self.downloadURLToUpload = snapshot.metadata?.downloadURL() 

      self.downloadURLString = snapshot.metadata?.downloadURL()?.absoluteString 

      uploadTask.removeAllObservers() 

      //if download url exists send rest of data 

      let emailString = String(FIRAuth.auth()!.currentUser!.email!) 

      //let postToSend = Post(name: emailString, message: string, downloadURLString: String(self.downloadURLToUpload!)) 

      let postToSend = Post(name: emailString, message: string, downloadURLString: self.downloadURLString) 

      let postDict = ["name" : postToSend.name!, "message" : postToSend.message!, "downloadURLString" :postToSend.downloadURLString!] 

      self.reference.child("messages").childByAutoId().setValue(postDict) 

      self.tableView.reloadData() 
     } 
    } 
    } 

} 

検索:

func returnDataFromURL(urlString: String!, completion: CompletionHandler) { 

    let strg = FIRStorage.storage() 

    let ref = strg.referenceForURL(urlString) 

    ref.downloadURLWithCompletion { (url, error) in 

     if error != nil { 
      print(error?.localizedDescription) 

     } 
     else { 
      completion(url: url!) 
     } 
    } 

} 

URL自体は同じフォーマットですが、コンソールではプロパティが少し違って見えますが、これはAVPlayerに渡すときの私の問題かもしれません(テスト用ビデオで動作しますだから問題ではない)。

取得したダウンロードURLがObjective-Cプロジェクトでどのように表示されるか。

enter image description here

かつ迅速で...

enter image description here

いつものように、当然の助けをいただき、ありがとうございます。

+0

同じファイルを2つのプロジェクト(同じURL)にダウンロードしようとしていますか、またはファイルのコピーが2つありますか?私の答えはあなたが同じURLをしようとしている場合ですが、今私はよく分かりません。 –

+0

いいえ、別のファイル、2つの異なるFirebaseプロジェクト(私はそれを明確にしておくべきですが)とにかくチェックアウトします。ありがとう! – Echizzle

+0

唯一の違いはSwift対Obj-Cですか?奇数...ダウンロードしようとするとエラーになることはありません。ただ空ですか? –

答えて

0

TL; DR:これは意図された動作です。 referenceWithURLFIRStorageReferenceに変換するのではなく、HTTPライブラリ(NSURLSessionGTMSessionFetcherAlamoFire)を使用してダウンロードしてください。

ロングストーリー:ストレージバケットfoo.appspot.comが添付されているプロジェクト(fooとしましょう)があります。オブジェクトをアップロードします(myFile.txtとしましょう)。今、そのオブジェクトをあなたの友人と共有したいと思っています。あなたのバケツfoo.appspot.comに保存されているmyFile.txtを代表する2つの方法があります

  • プライベート、内部URL:gs://foo.appspot.com/myFile.txt
  • 公開、外部URL:プライベートURLをダウンロードする必要がありますhttps://firebasestorage.googleapis.com/v0/b/foo.appspot.com/o/myFile.txt?alt=media&token=<token>

私たちのライブラリ(dataWithMaxSize:completion:writeToFile:)を通過し、正しい認証資格情報があるかどうかが確認され、承認のために。

公開URLは、アプリを使用しているかどうかにかかわらず、任意のライブラリ(AlamoFireなど)と任意のユーザーからダウンロードできます。これらのダウンロードは認証や承認のためにチェックされず、代わりに適切に制御するために開発者に依存しています(URLがあまりに広く共有されている場合、その推測不可能なトークンを取り消すことができます)。開発者が公開のダウンロードURLを与え、参照ファイルに新しいファイルを追加したり(既存のファイルを変更したり、外部ダウンロードを許可するなど)、操作したい理由があることがありますので、referenceWithURL:メソッドを提供していますパブリックURL(https://)をプライベートURL(gs://)に変換し、それを操作することができます。

このように、プロジェクト外のURLからストレージ参照を作成しようとすると(そのファイルに対して認証され許可された要求を実行することを意味する)、スティックすることができないため例外がスローされますfooのアプリケーションにダウンロードURL(https://firebasestorage.googleapis.com/v0/b/bar.appspot.com/o/myOtherFile.txt?alt=media&token=<token>など)を追加し、失敗以外の結果を得る - プロジェクトfooのランダムに認証されたユーザーは、プロジェクトbar(公開ダウンロードURLを超えて)のファイルを操作できません。

将来的には、プロジェクトごとに複数のバケットをサポートする場合、管理している他のバケットへの参照を作成させることができます。それまでは他のファイルと同じようにファイルをダウンロードしてください。

関連する問題