2013-03-11 15 views
7

Son zamanlarda xmppframework ile başladım, ama bir yerel ağımdaki sunucuma bağlanabiliyorum ama xmppstreamdelegate yöntemleri benim özel çağrılmıyor sınıf, ancak appdelegate sınıfında kesinlikle iyi çalışıyor. Herkes bu konuda bana yardımcı olabilir.İnsanlar sadece appdelegate sınıfında desteklenir?xmppstream delege yöntemleri benim özel sınıfta çağrılmadı

Başlık:

@interface XmppClass : NSObject<XMPPStreamDelegate>{ 
    XMPPStream *xmppStream; 
    Login * loginDetail; 
    BOOL allowSelfSignedCertificates; 
    BOOL allowSSLHostNameMismatch; 
} 
@property (nonatomic, strong, readonly) XMPPStream *xmppStream; 

@property (nonatomic, strong) Login *loginDetail; 
- (id)initWithLogin:(Login *) loginrefernce; 
- (BOOL)connect; 
- (void)disconnect; 
- (void)setupStream; 
@end 

Uygulama:

@implementation XmppClass 

@synthesize xmppStream; 
@synthesize loginDetail; 
- (id)initWithLogin:(Login *) loginrefernce 
{ 
    self = [super init]; 
    if (self) { 
     self.loginDetail=loginrefernce; 
     [DDLog addLogger:[DDTTYLogger sharedInstance]]; 
     [self setupStream]; 
     [self connect]; 
    } 
    return self; 
} 
- (void)setupStream 
{ 
NSAssert(xmppStream == nil, @"Method setupStream invoked multiple times"); 
// Setup xmpp stream 
// 
// The XMPPStream is the base class for all activity. 
// Everything else plugs into the xmppStream, such as modules/extensions and delegates. 

xmppStream = [[XMPPStream alloc] init]; 
#if !TARGET_IPHONE_SIMULATOR 
{ 
// Want xmpp to run in the background? 
// 
// P.S. - The simulator doesn't support backgrounding yet. 
//  When you try to set the associated property on the simulator, it simply fails. 
//  And when you background an app on the simulator, 
//  it just queues network traffic til the app is foregrounded again. 
//  We are patiently waiting for a fix from Apple. 
//  If you do enableBackgroundingOnSocket on the simulator, 
//  you will simply see an error message from the xmpp stack when it fails to set the property. 
xmppStream.enableBackgroundingOnSocket = YES; 
} 
#endif 

NSLog(@"setup stream"); 
[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; 

[xmppStream setHostName:@"10.68.202.123"]; 
//[xmppStream setHostPort:8070]; 

allowSelfSignedCertificates = NO; 
allowSSLHostNameMismatch = NO; 

// You may need to alter these settings depending on the server you're connecting to 

} 

- (BOOL)connect 
{ 
    NSLog(@"connect"); 
    if (![xmppStream isDisconnected]) { 
     return YES; 
    } 


// 
// If you don't want to use the Settings view to set the JID, 
// uncomment the section below to hard code a JID and password. 
// 
// myJID = @"[email protected]/xmppframework"; 
// myPassword = @""; 
if (self.loginDetail.emailId == nil || self.loginDetail.password == nil) { 
    return NO; 
} 

[xmppStream setMyJID:[XMPPJID jidWithString:[self.loginDetail.emailId  stringByAppendingString:@"/pc"]]]; 


NSError *error = nil; 
if (![xmppStream connect:&error]) 
{ 

    NSLog(@"Error connecting: %@", error); 

    return NO; 
} 

return YES; 
} 

- (void)disconnect 
{ 
    [xmppStream disconnect]; 
} 
- (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
} 

- (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary *)settings 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
    NSLog(@"some security thing"); 
    if (allowSelfSignedCertificates) 
    { 
     [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot]; 
    } 
    if (allowSSLHostNameMismatch) 
    { 
     [settings setObject:[NSNull null] forKey:(NSString *)kCFStreamSSLPeerName]; 
    } 
    else 
    { 
     // Google does things incorrectly (does not conform to RFC). 
     // Because so many people ask questions about this (assume xmpp framework is broken), 
     // I've explicitly added code that shows how other xmpp clients "do the right thing" 
     // when connecting to a google server (gmail, or google apps for domains). 
     NSString *expectedCertName = nil; 
     NSString *serverDomain = xmppStream.hostName; 
     NSString *virtualDomain = [xmppStream.myJID domain]; 
     if ([serverDomain isEqualToString:@"talk.google.com"]) 
     { 
      if ([virtualDomain isEqualToString:@"gmail.com"]) 
      { 
        expectedCertName = virtualDomain; 
      } 
      else 
      { 
        expectedCertName = serverDomain; 
      } 
     } 
     else if (serverDomain == nil) 
     { 
      expectedCertName = virtualDomain; 
     } 
     else 
     { 
      expectedCertName = serverDomain; 
     } 
     if (expectedCertName) 
     { 
      [settings setObject:expectedCertName forKey:(NSString *)kCFStreamSSLPeerName]; 
     } 
} 

}

- (void)xmppStreamDidSecure:(XMPPStream *)sender 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
} 

- (void)xmppStreamDidConnect:(XMPPStream *)sender 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
    NSLog(@"connected"); 
    NSError *error = nil; 
    if (![[self xmppStream] authenticateWithPassword:self.loginDetail.password error:&error]) 
    { 
      DDLogError(@"Error authenticating: %@", error); 
    } 
} 

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
    NSLog(@"authenticated"); 

} 

- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
    NSLog(@"did not authenticate"); 
} 

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
    return NO; 
} 

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 

    // A simple example of inbound message handling. 

} 

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence 
{ 
    DDLogVerbose(@"%@: %@ - %@", THIS_FILE, THIS_METHOD, [presence fromStr]); 
} 

- (void)xmppStream:(XMPPStream *)sender didReceiveError:(id)error 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
} 

- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error 
{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
    NSLog(@"%@",error); 
} 
@end 
+0

Kodunuzu girer misiniz? – paulmelnikow

+0

@noa i girintili olacaktır. –

+0

XmppClass örneğinizde '-setupStream' aranıyor mu? Ve '-connect'? [XmppStream connect] ', YES döndürüyor mu? ARC kullanıyor musunuz? Çıktı nedir? XmppClass örneğini oluşturan kod nedir? – paulmelnikow

cevap

1

Büyük olasılıkla sorun sınıf örneği, senin XMPPStream için bir temsilci önce serbest bırakılır olmasıdır Temsilci yöntemi çağrılır. Bu sınıfı, başka bir sınıfın özellik veya örnek değişkenini veya dispatch_once özelliğini kullanarak daha kalıcı hale getirin. Örneğin,

Değişim

YourClass *instance = [[YourClass alloc] init]; 
instance.xmppStream = .... 

tarafından

@property(nonatomic, strong) YourClass *instance; 
self.instance = [[YourClass alloc] init]; 
self.instance.xmppStream = .... 

İşte YourClass XMPPStream içerir ve bunun için temsilci edilir.

Bu sorun hakkında büyük bir blog yazısı yazdım. Bu oldukça yaygın bir durumdur. http://blog.alwawee.com/2013/07/31/on-xmppframework-delegate-method-not-being-called/

+0

Aynı sorunu yaşıyorum. Blog yayınınız kayboldu, başka bir yerde bulabilir miyim? Teşekkürler! – user2011985

+1

http://blog.alwawee.com/2013/07/31/on-xmppframework-delegate-method-not-being-called/ - işte – wzbozon

+0

Serin, teşekkürler! :) – user2011985

0

Bu bana yardımcı ... Ben aynı problem vardı bu

[[self appDelegate].xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; 
0

gibi çok noktaya yayın, STH kullanabilirsiniz. Umarım sizin için çalışır, sadece kodunuzdaki Değişiklikleri takip edin.

Static XmppClass *selfRef = nil; 
@implementation XmppClass 
@synthesize xmppStream; 
- (void)setupStream 
{ 
// Setup xmpp stream 
selfRef = [[XmppClass alloc] init]; 
xmppStream = [[XMPPStream alloc] init]; 
[xmppStream addDelegate:selfRef delegateQueue:dispatch_get_main_queue()]; 
İlgili konular