iPhone(iOS) + XMPP
19/02/13 16:01
iPhoneのXMPPに関する情報がJavaに比べて少ないので、メモ。色々ライブラリはあると思うが、RobbieHansonの XMPPFramework for OSX/iOSに関して。
(1) Xcodeへの設定
基本的には上記サイトのGettingStarted_iOSを見ながらやれば問題はない。しかしこっちの方が、スクリーンショットとか豊富で安心かも。ただし、情報が古いため、XMPPFramework-master/Authenticationも加えるのを忘れないように。
Build Phase->Link Binary with Libraries のframeworkの追加や、KissXMLを使うためのlibxml関係のリンクフラグなどの設定が少し面倒かな。。
自分の環境では、こんな感じ。
最後に.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ってやつになったのね。もっと積極的かつ継続的に触って、忘れないようにしたいです。