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时崩溃了。从文档中我了解到 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

我对 Objective-C 不是很熟悉,但是是的,生成的客户端库的 YouTube 数据 API v3 绑定似乎有问题。您是否使用项目页面中的最新版本?如果您可以使用最新版本重现它,您可能希望针对客户端库提交错误。在进一步解决此问题时,我会检查您在query.type = @"video";尝试访问响应项的 videoId 时是否有同样的问题。

不过,这是您可以尝试的替代方法。频道的 id 也会在snippet.channelId属性中返回。GTLQueryYouTube *query = [GTLQueryYouTube queryForSearchListWithPart:@"snippet"];如果您通过查看是否可以读取该值来请求片段部分。

于 2013-04-09T18:39:21.367 回答
0

解决方法代码:

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

无需自己解析 JSON,因为底层 JSON 已暴露。

看起来自动绑定对 GTLYouTubeResourceId 不起作用,因为“youtube#channel”的“kind”元素放弃了运行时对象的创建,而是创建了 GTLYouTubeChannel。

彻底的解决方法代码:

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

似乎他们想更改 API 以不调用 resourceId.kind 'kind' 以避免此问题。但是,当我们等待 API 更改时,这三种变通方法中的任何一种都应该满足您的目的。

于 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 回答