note


iPhone(iOS) + XMPP

iPhoneのXMPPに関する情報がJavaに比べて少ないので、メモ。色々ライブラリはあると思うが、RobbieHansonの XMPPFramework for OSX/iOSに関して。

(1) Xcodeへの設定

基本的には上記サイトのGettingStarted_iOSを見ながらやれば問題はない。しかしこっちの方が、スクリーンショットとか豊富で安心かも。ただし、情報が古いため、XMPPFramework-master/Authenticationも加えるのを忘れないように。
Build Phase->Link Binary with Libraries のframeworkの追加や、KissXMLを使うためのlibxml関係のリンクフラグなどの設定が少し面倒かな。。
自分の環境では、こんな感じ。
Pasted Graphic

Pasted Graphic 1

最後に.hファイル、XMPPFramework-master/Sample_XMPPFramework.hを、XMPPFramework.hっていう名前にして、自分が使うライブラリに応じて中身を書き換えてやってXcodeに置いとけば、#importが後々楽になる。

(2) とりあえず接続

サンプルコードを見ればわかりますが、念のためメモ。
XMPPStreamインスタンスを作るー>JIDの設定ー>Delegateの登録ー>コネクトー>コネクトできたらパスワードで認証(Delegateメソッド内で行う)
という感じで処理が進む。

例えばこんなコード。setupStreamを適当な場所で呼んでやり、ほっといたらすぐにxmppStreamDidConnectが呼ばれます。:

- (void)setupXMPPStream{
DDLogVerbose(@"%@: %@", [self class], THIS_METHOD);

xmppStream = [[XMPPStream alloc] init]; //XMPPStreamインスタンスを作る
xmppStream.myJID = [XMPPJID jidWithString:myJID]; //JIDの設定(hoge@hogehoge.comみたいなのがJID)

[
xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; //Delegateの登録

NSError *error = nil;

if (![xmppStream connect:&error]) //コネクト
{
DDLogError(@"%@: Error connecting: %@", [self class], error);
}

}

- (void)xmppStreamDidConnect:(XMPPStream *)sender
{
NSError *error = nil;

if (![xmppStream authenticateWithPassword:_pass error:&error])
{
DDLogError(@"%@: Error authenticating: %@", [self class], error);
}

}



(3) XEP-0060 PubSubについて


RobbieHansonのXMPPFrameworkにももちろんPubSubのExtensionは入っている。が、JavaのSmackに比べて少しAPIが少なく感じるのと、日本語英語含めてほとんどサンプルやチュートリアルが見当たらないので、メモ。

XMPPStreamインスタンスを作った時みたいに、pubsub用のインスタンスも作る。

xmppPubSub = [[XMPPPubSub alloc] initWithServiceJID:[XMPPJID jidWithString:@"pubsub.hoge.com”]];
[
xmppPubSub activate:xmppStream];
[
xmppPubSub addDelegate:self delegateQueue:dispatch_get_main_queue()];//Delegateの登録


後は、XMPPPubSubのメソッドを見ながら色々と試してみると良い[xmppPubSub createNode/deleteNode/subscribeToNode/unsubscribeToNodeなど..]。ちなみにPubSubノード一覧は、 [xmppPubSub discoverItemsForNode:nil];でゲットできました。何かIQを送った場合、その結果は下記のDelegateメソッドでゲットできる。


- (void)xmppPubSub:(XMPPPubSub *)sender didReceiveResult:(XMPPIQ *)iq{

// ここに処理を書けばOK。とりあえずメッセージの中身を確認したい場合は、NSLog(@“%@“,[iq XMLString]); なんかで見ればよい。普通のXMLなので、
// DDXMLElement *element = [[DDXMLElement alloc] initWithXMLString:[iq XMLString] error:nil];
// NSArray* allNodes = [element nodesForXPath:…..
// こんな感じで書いて行けば、、XPathでXMLノードにアクセスできる。

}



しかしiOSプログラミングとObjective-Cは普段使わないとすぐ忘れちゃう(T^T)
毎回ほぼ0からのスタートだから、大変。「はじめてのiOS」みたいなチュートリアルを何回見て何回忘れたことか・・
Interface Builderじゃなくて、storyboardってやつになったのね。もっと積極的かつ継続的に触って、忘れないようにしたいです。