0

我有一个应用程序,我在其中实现了 facebook 登录。我将来自 facebook sdk 的源代码直接复制到我的项目中。现在我需要添加谷歌登录。这次我添加了 GTMOAuth2 作为静态库。(我也有这方面的来源,但我无缘无故地添加为静态库)。问题是他们都在使用 SBJson,我得到了重复的符号。facebook sdk 中的 SBJson 似乎比 GTMOAuth2 库中的更新。我是菜鸟,以前从来没有重复的符号,我该怎么办?是否有解决这个特定问题或解决重复符号的一般方法?我是否只删除出现两次的内容,直到它起作用,是否有一些链接器设置?谢谢。

更新 - 我尝试了什么:

将两个项目添加为静态库。

  • 我尝试从 GTMOAuth2 中删除 SBJSON.h/m 文件,结果:谷歌登录后 json 解析错误:

  • 我尝试从 Facebook iOS SDK 中删除 SBJSON.h/m 文件;结果:facebook 登录后 json 解析错误。

我可以让这两个版本的 SBJSON 在我的应用程序中神奇地共存而没有重复的符号吗?我是否必须修改一个库才能使用我打算使用的一个 SBJSON?

4

2 回答 2

3

我正在使用来自 facebook sdk 的 SBJSON。我刚刚从 GTMOAuth2 库中删除了 SBJSON 以避免重复符号,如Ishu. 下一个问题是 GTMOAuth2 尝试首先使用 SBJSONParser 并且该类没有 objectWithString:error: 方法,只有 SBJSON 有该方法。我修改了代码以使用 SBJSON 类,甚至不尝试使用 SBJSONParser,因为它不起作用。在原始版本SBJsonParser中先检查,然后再检查 SBJSON。



- (NSDictionary *)dictionaryWithJSONData:(NSData *)data {
    ...
    // try SBJsonParser or SBJSON
    Class jsonParseClass = NSClassFromString(@"SBJSON");
    /*
    if (!jsonParseClass) {
      jsonParseClass = NSClassFromString(@"SBJsonParser");
    }
    */
    if (jsonParseClass) {
      GTMOAuth2ParserClass *parser = [[[jsonParseClass alloc] init] autorelease];
      NSString *jsonStr = [[[NSString alloc] initWithData:data
                                                 encoding:NSUTF8StringEncoding] autorelease];
      if (jsonStr) {
        obj = [parser objectWithString:jsonStr error:&error];
#if DEBUG
        if (error) {
          NSLog(@"%@ error %@ parsing %@", NSStringFromClass(jsonParseClass),
                error, jsonStr);
        }
#endif
        return obj;
      }
    }
  ...
}

更新 在这里,我在 GTM-OAuth2 讨论组中提出了同样的问题。这发生在我回答问题之后,但我忘了在这里更新我的答案。总之,这就是我所做的:

  • 使用 Facebook SDK 和 GTMOAuth2 作为静态库(可能这不是必需的)
  • 从这里获取最新版本的 SBJSON
  • 用这个替换 Facebook SDK 中的 SBJSON
  • 从 GTM-OAuth2 中删除 SBJSON 源(或从构建阶段删除它们)

这为您提供了 Facebook SDK 中包含的最新 SBJSON 库。Facebook SDK 和 GTM-OAuth2 都将使用那个。它应该工作。

于 2011-07-13T06:19:02.560 回答
1

是的,删除 GTMOAuth2 库的 SBJSON(因为它是旧版本)。

于 2011-07-08T09:37:00.510 回答