Функции делегата XMPPFramework, вызываемые в симуляторе, но не на телефоне

Я следую учебному курсу: http://mobile.tutsplus.com/tutorials/iphone/building-a-jabber-client-for-ios-server-setup/, чтобы настроить приложение iOS с сервером ejabberd. До сих пор я довольно много скопировал код в новый проект.

Моя проблема в том, что функции делегата XMPP AppDelegate.m не вызывается при запуске на телефоне. Все работает отлично в Simulator и названы две функции ниже.

- (void)xmppStreamDidConnect:(XMPPStream *)sender { NSLog(@"in WSAppDelegate - xmppStreamDidConnect"); isOpen = YES; NSError *error = nil; [[self xmppStream] authenticateWithPassword:password error:&error]; } - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender { NSLog(@"in WSAppDelegate - xmppStreamDidAuthenticate"); [self goOnline]; } 

Я могу подключиться как к телефону, так и к симулятору, так как этот вызов работает без ошибок:

 [xmppStream connect:&error] 

Вот мой код AppDelegate.h:

 #import <UIKit/UIKit.h> #import "XMPPRoster.h" #import "XMPP.h" #import "SMChatDelegate.h" #import "SMMessageDelegate.h" @class SMBuddyListViewController; @interface WSAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; SMBuddyListViewController *viewController; XMPPStream *xmppStream; XMPPRoster *xmppRoster; NSString *password; BOOL isOpen; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet SMBuddyListViewController *viewController; @property (nonatomic, readonly) XMPPStream *xmppStream; @property (nonatomic, readonly) XMPPRoster *xmppRoster; @property (nonatomic, assign) id _chatDelegate; @property (nonatomic, assign) id _messageDelegate; - (BOOL)connect; - (void)disconnect; @end 

И AppDelegate.m:

 #import "WSBuddyListViewController.h" @interface WSAppDelegate() - (void)setupStream; - (void)goOnline; - (void)goOffline; @end @implementation WSAppDelegate @synthesize xmppStream; @synthesize xmppRoster; @synthesize window; @synthesize viewController; @synthesize _chatDelegate; @synthesize _messageDelegate; - (void)applicationWillResignActive:(UIApplication *)application { [self disconnect]; } - (void)applicationDidBecomeActive:(UIApplication *)application { [self setupStream]; BOOL connected = NO; connected = [self connect]; NSLog(@"*** connected = %i", connected); } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } - (void)setupStream { NSLog(@"in WSAppDelegate - setupStream"); xmppStream = [[XMPPStream alloc] init]; [xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; [xmppStream setHostName:@"localhost"]; } - (void)goOnline { NSLog(@"in WSAppDelegate - goOnline"); XMPPPresence *presence = [XMPPPresence presence]; [[self xmppStream] sendElement:presence]; } - (void)goOffline { XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; [[self xmppStream] sendElement:presence]; } - (BOOL)connect { NSLog(@"in WSAppDelegate - connect"); [self setupStream]; NSString *jabberID = [[NSUserDefaults standardUserDefaults] stringForKey:@"userID"]; NSString *myPassword = [[NSUserDefaults standardUserDefaults] stringForKey:@"userPassword"]; if (![xmppStream isDisconnected]) { NSLog(@"in WSAppDelegate - connect - if (![xmppStream isDisconnected]) "); return YES; } if (jabberID == nil || myPassword == nil) { NSLog(@"in WSAppDelegate - connect - if (jabberID == nil || myPassword == nil)"); return NO; } [xmppStream setMyJID:[XMPPJID jidWithString:jabberID]]; password = myPassword; NSError *error = nil; if (![xmppStream connect:&error]) { NSLog(@"in WSAppDelegate - connect - if (![xmppStream connect:&error]))"); UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"Can't connect to server %@", [error localizedDescription]] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alertView show]; return NO; } return YES; } - (void)disconnect { [self goOffline]; [xmppStream disconnect]; [_chatDelegate didDisconnect]; } #pragma mark - #pragma mark XMPP delegates - (void)xmppStreamDidConnect:(XMPPStream *)sender { NSLog(@"in WSAppDelegate - xmppStreamDidConnect"); isOpen = YES; NSError *error = nil; [[self xmppStream] authenticateWithPassword:password error:&error]; } - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender { NSLog(@"in WSAppDelegate - xmppStreamDidAuthenticate"); [self goOnline]; } - (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq { return NO; } - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message { NSLog(@"in WSAppDelegate - xmppStream:(XMPPStream *)sender didReceiveMessage"); NSString *msg = [[message elementForName:@"body"] stringValue]; NSString *from = [[message attributeForName:@"from"] stringValue]; NSMutableDictionary *m = [[NSMutableDictionary alloc] init]; [m setObject:msg forKey:@"msg"]; [m setObject:from forKey:@"sender"]; [_messageDelegate newMessageReceived:m]; } - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence { NSLog(@"in WSAppDelegate - xmppStream:(XMPPStream *)sender didReceivePresence:"); NSString *presenceType = [presence type]; // online/offline NSString *myUsername = [[sender myJID] user]; NSString *presenceFromUser = [[presence from] user]; if (![presenceFromUser isEqualToString:myUsername]) { if ([presenceType isEqualToString:@"available"]) { [_chatDelegate newBuddyOnline:[NSString stringWithFormat:@"%@@%@", presenceFromUser, @"localhost"]]; } else if ([presenceType isEqualToString:@"unavailable"]) { [_chatDelegate buddyWentOffline:[NSString stringWithFormat:@"%@@%@", presenceFromUser, @"localhost"]]; } } } - (void)dealloc { [xmppStream removeDelegate:self]; [xmppRoster removeDelegate:self]; [xmppStream disconnect]; } @end 

2 Solutions collect form web for “Функции делегата XMPPFramework, вызываемые в симуляторе, но не на телефоне”

Если вы посмотрите на свой метод setupStream , вы используете имя «localhost». Это заставляет меня думать, что сервер находится на вашей машине разработки, и устройство пытается подключиться к себе (localhost). Вам придется заменить это на свое имя сервера.

Вероятно, это работает в симуляторе, потому что клиент и сервер один и тот же.

ОБНОВЛЕНИЕ :

Я только что прочитал учебник, и он не очень хорошо справляется с описанием того, как он будет работать на реальном устройстве.

как сказал Майк Д, вы подключаетесь к серверу, который находится на вашем компьютере ([xmppStream setHostName: @ "localhost"];) Чтобы подключиться к «localhost», вам нужно изменить файл hosts на своем устройстве (/ etc / hosts), но это запрещено Apple, так как ваше приложение не может изменить материал вне песочницы. (если устройство не заблокировано). Я сделал это на телефоне Android, когда сталкивался с подобной проблемой в прошлом. Проверьте это обсуждение ( Есть ли файл hosts на iPhone? Как его изменить? )

  • XMPP Как я могу получить уведомление или событие, когда текущий пользователь переходит в автономный режим?
  • Список участников чата
  • XMPPFramework - Как получить отображаемое имя пользователя в настоящее время вошедшего в систему
  • Нужна помощь по использованию xep-0184
  • Как установить (загрузить) изображение в XMPP Group (room)?
  • Потеря сообщений по потерянному соединению xmpp
  • Сообщения являются оскорбительными или помечены как спам - Facebook Chat
  • Файл Cocoa / Cocoa.h не найден
  • Работа в фоновом режиме в XMPP
  • Клиентская библиотека XMPP для ios с поддержкой BOSH
  • XMPP iOS Framework обнаруживает проблему отключения интернета с сервером OpenFire
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.