iOS の初心者です。Google Objective C API を使用して YouTube に動画をアップロードしようとしています。ほとんどの場合、それは機能します。動画をアップロードでき、エラーが発生した場合、私のコールバックはエラーを受け取ります。
しかし、デバイスのインターネット接続をオフにすると、コールバックは呼び出されません。(タイトルが正しくない、タグが正しくないなど、他の種類のエラーに対しても呼び出されます)
私の個人的な推測では、GTLServiceYouTube のコールバックを設定しましたが、GTMOAuth2Authentication のコールバックを明示的に設定していないため、呼び出しがありません。しかし、設定方法がわからず、どこにも何も見つかりませんでした。
私の状況では、ユーザーが資格情報を入力せずにビデオをアップロードできるようにする必要があるため、GTMOAuth2Authentication を手動で初期化することに注意してください。
これが私のコードです。私が何か間違ったことをしているのか、どうすれば修正できるのか教えてください。
NSString *clientID = @"185815387242-hqo2d4e06j4hk4f02t5gvn7jcifakdvr.apps.googleusercontent.com";
NSString *clientSecret = @"2LKi7orHyphJXXXXXXXXXXXX";
NSURL *tokenURL = [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/token"];
NSString *redirectURI = @"urn:ietf:wg:oauth:2.0:oob";
GTMOAuth2Authentication *auth;
auth = [GTMOAuth2Authentication authenticationWithServiceProvider:kGTMOAuth2ServiceProviderGoogle
tokenURL:tokenURL
redirectURI:redirectURI
clientID:clientID
clientSecret:clientSecret];
[auth setKeysForResponseString:@"email=annonce-video-i-6620%40pages.plusgoogle.com&isVerified=1&refresh_token=1%2FFFo5rlNs51u9g2TpCIE2oji_ACvDPc0XXXXXXXXXXXX&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&serviceProvider=Google&userID=107586507912247324352"];
//////////////////////////////////////////////////
GTLServiceYouTube *youTubeService = [[GTLServiceYouTube alloc] init];
// Have the service object set tickets to fetch consecutive pages
// of the feed so we do not need to manually fetch them.
youTubeService.shouldFetchNextPages = YES;
// Have the service object set tickets to retry temporary error conditions
// automatically.
youTubeService.retryEnabled = YES;
youTubeService.authorizer = auth;
// Status.
GTLYouTubeVideoStatus *status = [GTLYouTubeVideoStatus object];
// Snippet.
GTLYouTubeVideoSnippet *snippet = [GTLYouTubeVideoSnippet object];
snippet.title = @"TITLE";
NSString *desc = @"DESC";
if ([desc length] > 0) {
snippet.descriptionProperty = desc;
}
NSString *tagsStr = @"TAGS";
if ([tagsStr length] > 0) {
snippet.tags = [tagsStr componentsSeparatedByString:@","];
}
GTLYouTubeVideo *video = [GTLYouTubeVideo object];
video.status = status;
video.snippet = snippet;
// Get a file handle for the upload data.
NSString *path = @"AVALIDPATH";
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
if (fileHandle) {
NSString *mimeType = @"video/mp4";
GTLUploadParameters *uploadParameters =
[GTLUploadParameters uploadParametersWithFileHandle:fileHandle
MIMEType:mimeType];
uploadParameters.uploadLocationURL = nil;
GTLQueryYouTube *query = [GTLQueryYouTube queryForVideosInsertWithObject:video
part:@"snippet,status"
uploadParameters:uploadParameters];
GTLServiceYouTube *service = youTubeService;
[service executeQuery:query
completionHandler:^(GTLServiceTicket *ticket,
GTLYouTubeVideo *uploadedVideo,
NSError *error) {
//NEVER CALLED WHEN THE DEVICE IS IN AIRPLANE MODE
NSLog(@"And call me maybe.");
}];
GTMHTTPFetcher 行 969 への呼び出しがないことを追跡しました
@synchronized(self) {
target = [[delegate_ retain] autorelease];
sel = finishedSel_;
#if NS_BLOCKS_AVAILABLE
block = [[completionBlock_ retain] autorelease];
#endif
}
同期ブロックは 2 回呼び出されます。1 回目は GTMOAuth2Authentication コールバックを呼び出すため、2 回目は呼び出すためです...まあ... nil