3

http://mobile.tutsplus.com/tutorials/iphone/building-a-jabber-client-for-ios-server-setup/のチュートリアルに従って 、ejabberdサーバーでiOSアプリをセットアップします。これまでのところ、コードを新しいプロジェクトにコピーしました。

私の問題は、XMPPデリゲート関数AppDelegate.mが電話で実行されたときに呼び出されないことです。Simulatorではすべてが正常に機能し、以下の2つの関数が呼び出されます。

  - (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
4

2 に答える 2

8

メソッドを見ると、setupStream「localhost」という名前を使用しています。これにより、サーバーが開発マシン上にあり、デバイスがそれ自体 (localhost) に接続しようとしていると思われます。これをサーバー名に置き換える必要があります。

クライアントとサーバーがまったく同じであるため、これはシミュレーターで機能する可能性があります。

更新

チュートリアルを読んだだけですが、実際のデバイスでどのように機能するかを説明するのにまったく役に立ちません。

于 2013-03-07T01:02:16.617 に答える
0

マイク D が言ったように、あなたのマシン ([xmppStream setHostName:@"localhost"];) にあるサーバーに接続しています。"localhost" に接続するには、デバイスのホスト ファイルを変更する必要があります (/etc /hosts) ですが、これは Apple によって禁止されています。これは、アプリがサンドボックスの外部のものを変更できないためです (デバイスが脱獄されていない限り)。過去に同様の問題に直面したとき、私はAndroid携帯でこのようなことをしました。この議論を確認してください( iPhoneにhostsファイルは存在しますか?どのように変更しますか? )

于 2014-10-14T12:38:43.080 に答える