2013-08-30 6 views
6

Objective-CのGoogle APIクライアントライブラリ を使用してYouTubeでビデオをアップロードしようとしていますが、私はこのエラーを受け取り続けています。 YouTubeのサンプルプロジェクトで私のアカウントをもう一度実行すると、同じエラーが表示されます。アサーションエラー - [GTMHTTPUploadFetcher connectionDidFinishLoading:]

問題がどこにありますか。 YouTube Data API v3がサービスページに表示されていることを確認します。

*** Assertion failure in -[GTMHTTPUploadFetcher connectionDidFinishLoading:], /Volumes/data/Work/test/DLNew/DL/google-api-objectivec-client-read-only/Source/HTTPFetcher/GTMHTTPUploadFetcher.m:399 
2013-08-30 14:28:31.399 [1250:907] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unexpected response data (uploading to the wrong URL?)' 

私はそれがこのリンク

`#if DEBUG 
    // The initial response of the resumable upload protocol should have an 
    // empty body 
    // 
    // This assert typically happens because the upload create/edit link URL was 
    // not supplied with the request, and the server is thus expecting a non- 
    // resumable request/response. 
    NSAssert([[self downloadedData] length] == 0, 
        @"unexpected response data (uploading to the wrong URL?)"); 
#endif 

でアプリをクラッシュさGTMHTTPUploadFetcherクラスのコードを確認してください。

NSString *path    = [[NSUserDefaults standardUserDefaults] objectForKey:@"MOVIEPATH"]; 
NSString *filename = [path lastPathComponent]; 
NSString *mimeType = [self MIMETypeForFilename:filename defaultMIMEType:@"video/mp4"]; 

NSError *eel=nil; 

NSFileHandle *handle  = [NSFileHandle fileHandleForReadingFromURL:[NSURL URLWithString:path] error:&eel]; 
NSLog(@"error is %@",eel); 
if (!handle) 
{ 
    NSLog(@"Failed to open file for reading"); 
    return; 
} 



GTLServiceYouTube *service  = [[GTLServiceYouTube alloc] init]; 
service.authorizer    = self.gTMOAuth2Authentication; 

GTLUploadParameters *params  = [GTLUploadParameters uploadParametersWithFileHandle:handle MIMEType:mimeType]; 

GTLYouTubeVideoSnippet *snippet = [GTLYouTubeVideoSnippet object]; 
snippet.title     = @"Test title"; 
snippet.descriptionProperty  = @"Test description"; 
snippet.tags     = [NSArray arrayWithObjects:@"TestOne", @"TestTwo" ,nil]; 
snippet.categoryId    = @"17"; 

GTLYouTubeVideoStatus *status = [GTLYouTubeVideoStatus object]; 
status.privacyStatus   = @"private"; 

GTLYouTubeVideo *video2   = [GTLYouTubeVideo object]; 
video2.snippet     = snippet; 
video2.status     = status; 

GTLQueryYouTube *query   = [GTLQueryYouTube queryForVideosInsertWithObject:video2 part:@"snippet,status" uploadParameters:params]; 



// Perform the upload 
GTLServiceTicket *ticket  = [service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) 
{ 
    if (error) 
    { 
     NSLog(@"ERROR: %@", error); 
     return; 
    } 

    NSLog(@"SUCCESS! %@; %@;", ticket, object); 
}]; 

ticket.uploadProgressBlock = ^(GTLServiceTicket *ticket, unsigned long long numberOfBytesRead, unsigned long long dataLength) 
{ 
    NSLog(@"%lld/%lld", numberOfBytesRead, dataLength); 
}; 

----------

問題私はので、私はユーチューブサイトにログインし、前にチャネルを作成する必要がありますする必要が新しいGmailアカウントからログインしました私はYouTubeにビデオをアップロードすることができます。これで、YouTubeチャンネルを作成した後で動画をアップロードできます。しかし、どのように私は他のユーザー、任意のアイデアのためにこのシナリオを扱うことができます

+0

重要なコードを追加 –

+0

アップロードするためのコード –

+0

params.uploadLocationURL = nil; – blueberryfields

答えて

0

新しいGmailアカウントからログインしていたので、YouTubeサイトにログインしてYouTubeにビデオをアップロードする前にチャンネルを作成する必要がありました。これで、YouTubeチャンネルを作成した後で動画をアップロードできます。まず

:誰もがすでにこのための解決策を見つけましたが、ここで私はアプリのクラッシュを避けるために(スウィフトに)実装するものである場合、私は、他のユーザーのために、このシナリオを処理することができますどのように、任意のアイデア

0

私はここで仮定をしていますが、私はあなたと同じエラーがあった、そして実際問題は私の認可者だった。 authでエラーを処理していて、service.authorizerにauthを適用していることを確認してください。

if (![self.youTubeAuth canAuthorize]) { 
    // ... 
} 
service.authorizer = auth; 

GTMOAuth2ViewControllerTouchイニシャライザのスコープが間違っているため、この問題が発生していました。 @""は間違った範囲より良い結果を提供します。 YouTubeのサンプルアプリをチェックしてください。

0

は、私はあなたのプロジェクトのために上にAPIサービス]タブから

スイッチサービスをドライブのAPIとSDKドライブを有効にして再試行する必要があると思います。

両方がオンの場合は、manifestに「api_console_project_id」:「xxxxxxxxxxxxx」引数を設定してください。

+0

両方のサービスが有効になっていますか? –

+0

ムクンド・シャドーあなたが解決策を見つけたら、私たちにも知らせてください。ありがとう –

+0

はい私は編集した答えを確認しました –

1

YouTubeに動画をアップロードしているときと同じ問題(GTMHTTPUploadFetcher.m:399のアサーションエラー)がありました。私はデバッグの数分を他の誰かを救うためにこれを投稿しています。

私の問題は、GTLServiceYouTubeのAPIKeyを設定した古いコードがに加えて、にOAuth2を使用していることが判明しました。 Doh。

GTLServiceYouTube *youtube = [[GTLServiceYouTube alloc] init]; 
youtube.APIKey = @"-my-simple-api-access-key-"; //<-- offending line 
[...] 
youtube.authorizer = [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName 
                   clientID:kYouTubeClientID 
                  clientSecret:kYouTubeClientSecret]; 

修正点は、OAuth2認可者のみを使用してAPIKeyをnilにするだけでした。 (APIKeyは「シンプルAPIアクセス」のためのものであり、どちらのヒントも問題の原因となることは明らかです)。

Fwiwでは、http要求は成功しましたが(200 OK)、http応答は別の話をしました。レスポンスを表示するには、これらの2行をGTMHTTPUploadFetcherの実装に追加しました。メートル(おそらくより良い方法をtheresの):dataStrで

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    [...] 
    NSString *dataStr = [[NSString alloc] initWithData:self.downloadedData encoding:NSUTF8StringEncoding]; 
    NSLog(@"Downloaded data:%@",dataStr); 
    [...] 
} 

JSON:

{ 
    "error": { 
     "code": 403, 
     "message": "Access Not Configured", 
     "data": [{ 
      "domain": "usageLimits", 
      "reason": "accessNotConfigured", 
      "message": "Access Not Configured" 
     }] 
    }, 
    "id": "gtl_1" 
} 
+0

素晴らしいです。 APIKeyをnilに設定して問題を修正しました。ありがとうMoj – Viraj

6

私は同じクラッシュが発生し、解決策を見つけます。 基本的な要求が悪い要求であっても、応答情報が明示的に提供されていない(私の認証者が有効で、canAuthorizeの方法でチェックを渡した場合は、Ryan_IRLが指摘されています)私はSTRIP_GTM_FETCH_LOGGINGマクロプリプロセッサを設定し、コード

#if STRIP_GTM_FETCH_LOGGING 
[GTMHTTPFetcher setLoggingEnabled:YES]; 
#endif 

HTTPFetcherどこかのログを有効にすると、ログはシミュレータ内GTMHTTPDebugLogsフォルダに格納されていることを発見したライブラリ(何かを見た後

/Users/<username>/Library/Application Support/iPhone Simulator/6.1/Applications/65451CDB-27D6-4BE2-910C-7F22D6A01832/GTMHTTPDebugLogsと同様)。そこに完全なログをHTML形式で見つけることができます(...)。 「要求/応答ログ」をクリック

enter image description here

次のログは、私の場合に示されました。

Response body: (201 bytes) 
{ 
    "id" : "gtl_1", 
    "error" : { 
    "message" : "Bad Request", 
    "code" : -32602, 
    "data" : [ 
     { 
     "domain" : "youtube.video", 
     "reason" : "invalidTitle", 
     "locationType" : "other", 
     "location" : "body.snippet.title", 
     "message" : "Bad Request" 
     } 
    ] 
    } 
} 

悪いリクエストは、いくつかの禁止された文字を含んでいたタイトル(アップロードするビデオの)に関連していました。タイトルを修正することでクラッシュが解決され、ビデオが正しくアップロードされました。この場合のステータス200は、もちろん...イライラしていて、明らかに間違っています。

私はGTMライブラリとそのような状況のためのNSAssertを最初に使用することにも非常に失望しています。我々はKey for iOS appsの代わりにKey for browser appsを使用している場合、私はここからそれを見つけた

+0

あなたのコードのログインを有効にする方法。 –

+0

私が書いたように、 '[GTMHTTPFetcher setLoggingEnabled:YES];行で'。 AppDelegateのapplication:didFinishLaunchingWithOptions:メソッドにそれを入れてください。 – albertodebortoli

+0

@albertodebortoliこのコードを追加した場所を教えてください。私は同じ問題に直面しているが、解決策は機能していない。アドバイスをお願いしますか? – cloudVision

0

は知ってはいけません使用したYouTubeチャンネルのステータスをチェック:「isLinked」パラメータの値が対応して0でない場合にのみ使用してビデオをアップロードし、「状態」

するパーツを設定して

GTLQueryYouTube.queryForChannelsListWithPart

GTLQueryYouTube.queryForVideosInsertWithObject

それ以外の場合は、YouTubeチャンネルを最初にリンクするようにユーザーに依頼します。

-2

GTLServiceYouTube * youtube = [[GTLServiceYouTube alloc] init]; youtube.APIKey = @ " - my-simple-api-access-key-"; // < - 怒っているライン youtube。承認者= [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName clientID:kYouTubeClientID clientSecret:kYouTubeClientSecret];

+0

デバイス上で動作していない、シミュレータで作業中です –

関連する問題