[Проблема решена, я просто пока не могу выбрать свой ответ в качестве решения.]
Я работаю над функцией загрузки видео для мобильного приложения с API данных YouTube; но у меня сохраняется ошибка 401 при выполнении запроса.
Я использую Firebase для предоставления мне ключей OAuth & API от Google Developer.
Я попытался проверить, не изменился ли файл PLIST, предоставленный Firebase, и даже другой.
Я попытался сбросить Симулятор iOS, удалить приложение и прекратить права доступа к учетной записи для приложения через GIDSignIn.sharedInstance().disconnect()
.
Я пытался увидеть другие вопросы StackOverFlow, но все они касаются других языков или даже «необработанных» HTTP-запросов.
В моем файле AppDelegate у меня есть эти строки для соединения с Firebase и Google:
FirebaseApp.configure()
GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
и этот метод (и очень похожий, который я здесь не буду показывать):
func application( _ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any ) -> Bool {
return GIDSignIn.sharedInstance().handle( url,
sourceApplication: sourceApplication,
annotation: annotation )
}
В моем классе, связанном с контроллером, у меня есть методы для создания запроса:
private func uploadVideo( withVideoObject video: GTLRYouTube_Video, resumeUploadLocationURL locationURL: URL? ) throws {
let query = try uploadQuery( _video: video, resumeUploadLocationURL: locationURL )!
// [ progress related feedback ]
YouTubeUploadController.uploadFileTicket = self.service.executeQuery( query,
delegate: self.controller!,
didFinish: #selector( self.controller!.displayResultWithTicket(ticket:finishedWithObject:error:) ) )
}
private func uploadQuery( _video: GTLRYouTube_Video, resumeUploadLocationURL locationURL: URL? ) throws -> GTLRYouTubeQuery_VideosInsert? {
let fileToUploadURL = URL( fileURLWithPath: "\(self.controller!.uploadPathField)" )
if !( try! fileToUploadURL.checkPromisedItemIsReachable() ) {
throw YouTubeCustomError.init( _kind: .fileNotFound )
}
// Get a file handle for the upload data.
let uploadParameters = prepareUploadParameters( fileToUploadURL: fileToUploadURL, locationURL: locationURL )
return GTLRYouTubeQuery_VideosInsert.query( withObject: _video, part: "snippet,status", uploadParameters: uploadParameters )
}
отправляет ошибку через displayResultWithTicket(ticket:finishedWithObject:error:)
:
" Эта операция не может быть завершена. (Com.google.HTTPStatus error 401.) "
Нет данных о сбоеПричины или восстановлениеSuggestion.
Заранее спасибо.
Тело ответа:
Вот HTTP-журналы ответов GTMSessionFetcher для попытки загрузки:
Response body: (178 bytes)
{
"error" : {
"message" : "Login Required",
"errors" : [
{
"message" : "Login Required",
"locationType" : "header",
"reason" : "required",
"domain" : "global",
"location" : "Authorization"
}
],
"code" : 401
}
}
Заголовки запроса
Request: POST https://www.googleapis.com/resumable/upload/youtube/v3/videos?part=snippet%2Cstatus&prettyPrint=false
Request headers:
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json; charset=utf-8
User-Agent: org.cocoapods.GoogleAPIClientForREST/1.3.8 google-api-objc-client/3.0 iPhone/12.2 hw/sim (gzip) (GTMSUF/1)
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Length: 2614231
X-Goog-Upload-Content-Type: video/mp4
X-Goog-Upload-Protocol: resumable