3

google-api-objectivec-client を使用して YouTube チャンネル ID を取得しようとしています。私が抱えている問題は、基本的に、channelId にアクセスしようとすると、何らかの理由で例外が発生することです。私が使用しているコード:

GTLServiceYouTube *service = [[GTLServiceYouTube alloc] init];
service.APIKey = _MY_API_KEY_;
GTLQueryYouTube *query = [GTLQueryYouTube queryForSearchListWithPart:@"id"];
query.q = @"google";
query.type = @"channel";
query.maxResults = 1;
GTLServiceTicket *ticket = [service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) {
    if (error == nil) {
        GTLYouTubeSearchListResponse *products = object;
        for (id item in products.items) {
            GTLYouTubeSearchResult *result = item;
            NSLog(@"Identifier:%@",result.identifier);
            GTLYouTubeResourceId* resourceId = result.identifier;
            NSLog(@"kind:%@",resourceId.kind);
            NSLog(@"channel:%@",resourceId.channelId);
        }
    }else{
        NSLog(@"Error: %@", error.description);
    }
}];

このコードを実行しているときに得られる出力は次のとおりです。

2013-04-05 11:37:12.615 YouTest[21704:11303] Identifier:GTLYouTubeChannel 0x7233b00: {kind:"youtube#channel" channelId?:"UCK8sQmJBp8GCxrOtXWBpyEA"}
2013-04-05 11:37:12.617 YouTest[21704:11303] kind:youtube#channel
2013-04-05 11:37:12.617 YouTest[21704:11303] -[GTLYouTubeChannel channelId]: unrecognized selector sent to instance 0x7233b00
2013-04-05 11:37:12.618 YouTest[21704:11303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[GTLYouTubeChannel channelId]: unrecognized selector sent to instance 0x7233b00'

したがって、私の実装は、resourceId の channelId にアクセスしようとしている時点でクラッシュします。ドキュメントから、resourceId のタイプが youtube#channel. channelId はもちろん、私も印刷している result.identifier 文字列から解析できますが、channelId のプロパティがあるため、それを使用することをお勧めします。

私のコードの何が問題なのかについてのアイデアはありますか?

4

4 に答える 4

2

確かに、Google ライブラリにはバグがあります。ただし、この例のように、JSON 文字列に直接アクセスし、NSString+SBJSON.h クラスを使用して解析することで、この問題を解決しました。

#import "NSString+SBJSON.h"

...

GTLYouTubeResourceId *resource = channel.snippet.resourceId;

NSDictionary *jsonObject = [resource.JSONString JSONValue];

NSString *channelid = [jsonObject valueForKey:@"channelId"];
于 2014-03-20T01:04:51.720 に答える
0

回避策コード:

    channel.snippet.resourceId.JSON[@"channelId"];

基になる JSON が公開されているため、JSON を自分で解析する必要はありません。

「youtube#channel」の「kind」要素がランタイム オブジェクトの作成を破棄し、代わりに GTLYouTubeChannel を作成しているため、GTLYouTubeResourceId の自動バインドが機能していないようです。

完全な回避策コード:

ticket.surrogates = @{ (id)[GTLYouTubeChannel class] : [GTLYouTubeResourceId class] };

そのバインドを強制的に機能させたい場合は、クエリを実行するときに、チケットの上流で回避することができます。

グローバル回避パッチ:

https://github.com/google/google-api-objectivec-client/pull/109

この問題のオープン チケットがあります。

https://github.com/google/google-api-objectivec-client/issues/63

https://github.com/google/google-api-objectivec-client/issues/92

この問題を回避するために、resourceId.kind 'kind' を呼び出さないように API を変更したいと考えているようです。しかし、API が変更されるのを待っている間は、これら 3 つの回避策のいずれかが目的にかなうはずです。

于 2016-04-07T21:57:25.797 に答える
0

同じ問題がありました。以下で解決しました...

     NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:[resourceId.JSONString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
            NSString *channelId = [jsonObject valueForKey:@"channelId"];
            NSLog(@"channelId is %@", channelId);
于 2015-08-24T23:23:59.810 に答える
0

Objective-C にはあまり詳しくありませんが、生成されたクライアント ライブラリの YouTube Data API v3 バインディングに問題があるようです。プロジェクトページの最新バージョンを使用していますか? 最新バージョンで再現できる場合は、クライアント ライブラリに対してバグを報告することをお勧めします。query.type = @"video";これをさらにトラブルシューティングしながら、応答アイテムの videoId にアクセスしようとしたときに同じ問題が発生するかどうかを確認します。

ただし、これはあなたが試すことができる代替手段です。チャネルの ID もsnippet.channelIdプロパティで返されます。スニペット部分をリクエストする場合は、GTLQueryYouTube *query = [GTLQueryYouTube queryForSearchListWithPart:@"snippet"];代わりにその値を読み取れるかどうかを確認してください。

于 2013-04-09T18:39:21.367 に答える