Используя протоколы Gdata и Xmpp в одном приложении

Я интегрирую два приложения в одно. Первое приложение - это приложение чата. Мы использовали фреймворк 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, которая вызывает исключение.

Может кто-нибудь PLZ помочь мне с этим?? благодарю вас.

1 ответ

Решение

Я знаю, что это старо, но я только что столкнулся с подобной проблемой, и, возможно, это поможет вам.

Я изменил определение для другой библиотеки (короткое имя K), которую я использую, так что теперь она помечена чем-то вроде этого.

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

и библиотека Google все еще определена как обычно. Затем везде, где я использую код K, я изменил его на правильное определение. Я запустил свой код, и он, кажется, работает для меня.

Другие вопросы по тегам