2016-08-15 48 views
3

我正在製作視頻共享應用程序,我有一個Objective-C版本以及一個Swift。我將所選視頻的網址成功上傳到Firebase存儲並同時上傳。在Objective-C項目中,視頻顯示正常,沒有問題,但在Swift版本中,雖然URL已經記錄到控制檯,但完全相同,但沒有,AVPlayer只是空白的,沒有噪音沒有什麼。從Firebase存儲返回的網址在一個項目中運行,但不在另一個項目中

這是我的雨燕上傳和檢索代碼:

上傳:(既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

您是否試圖在兩個項目(相同的URL)下載相同的文件,或者您有兩份文件?我的答案如下,如果你想要做同樣的網址,但現在我不確定。 –

+0

沒有,不同的文件,和兩個不同的Firebase項目(我應該做得更清楚),但我會檢查出來。謝謝! – Echizzle

+0

所以唯一的區別是Swift vs Obj-C?奇怪的是,當你嘗試下載它時,你沒有收到錯誤,它只是空的? –

回答

0

TL; DR:這是預期行爲;只需使用HTTP庫(NSURLSession,GTMSessionFetcher,AlamoFire)下載它,而不是將其轉換爲FIRStorageReferencereferenceWithURL

長篇小說:你有一個項目(我們稱之爲foo),它有一個連接到它的存儲桶foo.appspot.com。你上傳一個對象(我們稱之爲myFile.txt)。現在,你想與你的朋友分享這個對象。

有存儲在你的水桶foo.appspot.com代表myFile.txt的方法有兩種:

  • 私人,內部URL:gs://foo.appspot.com/myFile.txt
  • 公開,外部URL:https://firebasestorage.googleapis.com/v0/b/foo.appspot.com/o/myFile.txt?alt=media&token=<token>

私人URL必須下載通過我們的圖書館(dataWithMaxSize:completion:,writeToFile:),並檢查正確的驗證憑證,然後通過Firebase Storage Security Rules授權。

公共URL可以通過任何庫(如AlamoFire等)和任何用戶下載,無論他們是否使用您的應用程序。這些下載不會被檢查用於身份驗證或授權,而是依賴於您(開發人員)來正確控制(如果URL太寬泛,我們允許您撤銷無法猜測的令牌)。由於偶爾會有開發人員給我們提供公共下載URL的原因,他們想操縱它(比如說在參考文件中添加一個新文件或修改現有文件並允許外部下載),我們提供了referenceWithURL:方法將公共URL(https://)轉換爲專用URL(gs://),然後可以對其進行操作。因此,當您嘗試從項目之外的URL創建存儲引用(這意味着您將對該文件執行經過驗證和授權的請求)時,我們會拋出一個異常,因爲您無法堅持(foo)中的應用下載URL,並獲得除故障以外的任何結果 - 我們不允許來自項目foo的隨機認證用戶對項目bar(超出公共下載URL)的文件進行操作。在未來,當我們爲每個項目支持多個桶時,我們將讓您創建對您控制的其他桶的引用,但在此之前,只需下載文件就像其他文件一樣。

相關問題