在一个应用程序中同时使用 Gdata 和 Xmpp 协议

Posted

技术标签:

【中文标题】在一个应用程序中同时使用 Gdata 和 Xmpp 协议【英文标题】:Using Gdata and Xmpp protocol both in one application 【发布时间】:2010-12-14 13:50:40 【问题描述】:

我正在将两个应用程序集成为一个。第一个应用程序是聊天应用程序。我们使用 xmpp 框架从 Gmail 帐户中检索 Gmail 聊天伙伴。在另一个应用程序中,我们使用 Google 数据协议登录 gmail 帐户并检索所有联系人。当我整合这两个项目时,我遇到了一个特殊的问题。

Google 数据协议和 XMPP 都定义了 nsxml 对象。

例如:在 XMPP 中,nsxml 元素定义如下

 #ifndef NSXMLElement
   #define NSXMLElement DDXMLElement
 #endif

#ifndef NSXMLDocument
  #define NSXMLDocument DDXMLDocument
#endif

在 Google 数据协议中,nsxml 元素定义如下

#define NSXMLDocument  GDataXMLDocument
#define NSXMLElement   GDataXMLElement

我的问题是两个协议都在定义 nsxml 对象。因此,当我尝试发送以下聊天消息时,它给了我一个错误:

-[GDataXMLElement addAttributeWithName:stringValue:]: unrecognized selector sent to instance 0x8101450
2010-12-14 19:12:32.430 GMIProject[1870:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[GDataXMLElement addAttributeWithName:stringValue:]: unrecognized selector sent to instance 0x8101450'
*** Call stack at first throw:
(
 0   CoreFoundation                      0x029c1b99 __exceptionPreprocess + 185
 1   libobjc.A.dylib                     0x034b440e objc_exception_throw + 47
 2   CoreFoundation                      0x029c36ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
 3   CoreFoundation                      0x029332b6 ___forwarding___ + 966
 4   CoreFoundation                      0x02932e72 _CF_forwarding_prep_0 + 50
 5   GMIProject                          0x000057f2 -[ChatViewController send:] + 410
 6   UIKit                               0x0048a7f8 -[UIApplication sendAction:to:from:forEvent:] + 119
 7   UIKit                               0x0069668b -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 156
 8   UIKit                               0x0048a7f8 -[UIApplication sendAction:to:from:forEvent:] + 119
 9   UIKit                               0x00515de0 -[UIControl sendAction:to:forEvent:] + 67
 10  UIKit                               0x00518262 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
 11  UIKit                               0x00516e0f -[UIControl touchesEnded:withEvent:] + 458
 12  UIKit                               0x004ae3d0 -[UIWindow _sendTouchesForEvent:] + 567
 13  UIKit                               0x0048fcb4 -[UIApplication sendEvent:] + 447
 14  UIKit                               0x004949bf _UIApplicationHandleEvent + 7672
 15  GraphicsServices                    0x03871822 PurpleEventCallback + 1550
 16  CoreFoundation                      0x029a2ff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
 17  CoreFoundation                      0x02903807 __CFRunLoopDoSource1 + 215
 18  CoreFoundation                      0x02900a93 __CFRunLoopRun + 979
 19  CoreFoundation                      0x02900350 CFRunLoopRunSpecific + 208
 20  CoreFoundation                      0x02900271 CFRunLoopRunInMode + 97
 21  GraphicsServices                    0x0387000c GSEventRunModal + 217
 22  GraphicsServices                    0x038700d1 GSEventRun + 115
 23  UIKit                               0x00498af2 UIApplicationMain + 1160
 24  GMIProject                          0x00002422 main + 84
 25  GMIProject                          0x000023c5 start + 53

这里我的聊天应用程序调用了 xmpp 框架的函数,但是由于 NSXml 对象已被 GData 对象重新定义和覆盖,因此正在调用 GData 的函数,从而引发了异常。

【问题讨论】:

【参考方案1】:

我知道这是旧的,但我刚刚遇到了一个类似的问题,也许这会对你有所帮助。

我更改了我正在使用的另一个库(简称为 K)的定义,因此现在它被标记为这样的内容。

#define NSXMLDocumentK DDXMLDocument 
#define NSXMLElementK DDXMLElement 
#define NSXMLNodeK DDXMLNode
#define NSXMLNodePrettyPrintK DDXMLNodePrettyPrint

并且谷歌库仍然像往常一样定义。然后在我使用 K 代码的任何地方,我都将其更改为正确的定义。我运行了我的代码,它似乎对我有用。

【讨论】:

嗨,我没有时间检查这个。但感谢您的回答。我会尽快检查它

以上是关于在一个应用程序中同时使用 Gdata 和 Xmpp 协议的主要内容,如果未能解决你的问题,请参考以下文章

在 XMPP 中检测使用相同帐户的其他客户端

在 Android 上使用 GData API 的最佳选择?

使用 XMPP 的 Android 视频聊天

在 XMPP 中获得异常未授权(401),同时提交表单

iPhone 使用 GData 框架将视频上传到 youtube 应用程序

如何传播通过 gdata python api 创建的谷歌日历事件的提醒?