で、まずやることは
のプロジェクトへの組み込み。
組み込み方は「iPhoneアプリ開発、その(83)」の「sqlite3ライブラリのリンク」でも説明したけど、SDKのバージョンもあがったのでおさらいの意味でもう一度。
ここではSDK3.0の場合で説明。
「実践! iPhoneアプリ開発:RSSリーダの作り方 (4) - libxmlでパースする」で説明されているようにプロジェクト>プロジェクトに追加…メニューからファイルを選択するでもいいし、iPhoneアプリ開発、その(83)の方法でもOK。指定するライブラリは
Macintosh HD → Developer → Platforms → iPhoneSimulator.platform→Developer→SDKs→iPhoneSimulator3.0.sdk→usr→lib→libxml2.dylib
というシンボリックリンクです。こいつは現在のところlibxml2.2.dylibにつながって(確認したい人はファイダでlibxml2.dylibを選んで、ファイル>オリジナルを表示メニューを選びましょう)いる。
注)直でlibxml2.2.dylibを組み込まない理由は、将来libxml2のバージョンが上がっても、このlibxml2.dylib シンボリックリンクを新しいライブラリにつなげ変えれば、このlibxml2.dylibを組み込んでいるプロジェクトは変更しなくても最新のlibxml2を使えることになるから。
ま、iPhone SDKの場合、結構SDK自体が変わるのであまり効果は期待できないんで作法程度に考えましょう。
追加する時に出てくるダイアログはデフォルト(こんな感じ)のままでOK。
ライブラリが組み込めたら、次はインクルードパスの設定。
インクルードパスってのはソース内でincludeやimportで指定している
といったファイルを探す場所の事。includeとimportの違いは「Objective-C 2.0プログラミング言語>クラスの定義>クラスインターフェイス」のインターフェイスのインポートの部分を読みましょう。
今回はlibxmlを使うソースで
が必要になります。
で、このincludeやimportで指定したファイルは、やみくもに探しているわけじゃなく決まった所を決まった順(同じ名前のファイルがあれば、最初に見つかった側が使われるので順序も重要)にしか探してもらえない。
Macintosh HD → Developer → Platforms → iPhoneSimulator.platform→Developer→SDKs→iPhoneSimulator3.0.sdk→usr→include
自体は検索対象なんだけど、その中にあるlibxml2というフォルダは検索対象外になる。
そのためこのパスも検索対象に含めろと指定してやる必要がある。指定するにはプロジェクト>アクティブターゲット"rss"を編集>メニューで出てくるダイアログのブルドタグのヘッダ検索パスを編集する。
これだ~。
あ、ワン・トゥ・スリ~
ここの2番目の赤丸枠「構成:アクティブ(Debug)」は他に「すべての構成」や「Release」もある。こいつはプロジェクト>アクティブなビルド構成を選択メニューで選択する項目のどちら側の設定かを指定するのに利用。どちらにも適用したい場合は「すべての構成」を選ぶ。私は当面、Debugしか使う気がないので「構成:アクティブ(Debug)」だけ設定しました。
「表示:」は「すべての設定」でないと「ヘッダ検索パス」の項目が現れないので注意。インクルードパスを追加した後は「このレベルに定義された設定」でも現れるようになる。
「このレベルに定義された設定」は「常にユーザーパスを検索」のように太文字になっとります。
ちなみに「すべての設定」だと項目がいっぱい出てくるんですが、検索キーワードに「ヘッダ検索」と入力するとその文字列と一致する項目だけ表示されるので便利っす。
あとは「ヘッダ検索パス」の項目をダブルクリックして出てくるダイアログの追加ボタンを押してパスを入力。
入力するパスはダイレクトに
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/usr/include/libxml2
でもいいんですが私は
${SDKROOT}/usr/include/libxml2
とします。こう書いた方がベースSDKを切り替えたら勝手に連動してくれるので便利だから。
ベースSDKは「iPhoneアプリ開発、その(83)」のところでも軽く触れてるけどSDKによって切り替わる起点とするパスの事。
Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/
をのぞいたら
iPhoneSimulator2.0.sdk/
iPhoneSimulator2.1.sdk/
・
・
iPhoneSimulator3.0.sdk/
てフォルダが並んでると思うけど、${SDKROOT}はこのどれを使うかの指定です。それぞれにFrameworksやusrフォルダを持っとるわけですな。
メモ)設定ダイアログにはベースSDKの項目もあって、調べるとシミュレータ時も、シミュレータじゃなく実機側になってる。ただし動かすとただしくシミュレータで動く。ここらへんは何故でしょうね。これで正しく動くなら、わざわざシミュレータの項目が存在する意味がわからない...
ここまでできたら、後はrssAppDelegateへの実装。
まずは小手調べでbbs.phpから返されるテキストをパースさせてみる。
1、NSURLConnectionのconnectionWithRequest:delegateメソッドより前に
でパース用のxmlParserCtxtPtrを作っておく。
2、connection:didReceiveDataメソッドにデータが届くたびに
でパースさせる。この結果はxmlParserCtxtPtr作成時に指定しておいたstartElementHandler、endElementHandler、charactersFoundHandler関数経由で伝えられる。
3、connectionDidFinishLoading:connectionメソッドが呼び出された時点で
でデータが終わった事を伝え、
でパース用のxmlParserCtxtPtrを解放する。
今回はstartElementHandlerで発見したタグ文字列を表示してみます。追加部分はrssAppDelegate.mのみで#ifdef PARSE_XML~#endifで囲まれたところ。
うりゃ、っと実行。
げえええええ、input以降のタグが来ね~。
ふっ、どうやらPHP側でミスがあるみたいですな。
以下次回!
------------
サンプルプロジェクト:rss5.zip
libxml2
のプロジェクトへの組み込み。
組み込み方は「iPhoneアプリ開発、その(83)」の「sqlite3ライブラリのリンク」でも説明したけど、SDKのバージョンもあがったのでおさらいの意味でもう一度。
ここではSDK3.0の場合で説明。
「実践! iPhoneアプリ開発:RSSリーダの作り方 (4) - libxmlでパースする」で説明されているようにプロジェクト>プロジェクトに追加…メニューからファイルを選択するでもいいし、iPhoneアプリ開発、その(83)の方法でもOK。指定するライブラリは
Macintosh HD → Developer → Platforms → iPhoneSimulator.platform→Developer→SDKs→iPhoneSimulator3.0.sdk→usr→lib→libxml2.dylib
というシンボリックリンクです。こいつは現在のところlibxml2.2.dylibにつながって(確認したい人はファイダでlibxml2.dylibを選んで、ファイル>オリジナルを表示メニューを選びましょう)いる。
注)直でlibxml2.2.dylibを組み込まない理由は、将来libxml2のバージョンが上がっても、このlibxml2.dylib シンボリックリンクを新しいライブラリにつなげ変えれば、このlibxml2.dylibを組み込んでいるプロジェクトは変更しなくても最新のlibxml2を使えることになるから。
ま、iPhone SDKの場合、結構SDK自体が変わるのであまり効果は期待できないんで作法程度に考えましょう。
追加する時に出てくるダイアログはデフォルト(こんな感じ)のままでOK。
ライブラリが組み込めたら、次はインクルードパスの設定。
インクルードパスってのはソース内でincludeやimportで指定している
#import <Foundation/Foundation.h>
#include <stdio.h>
といったファイルを探す場所の事。includeとimportの違いは「Objective-C 2.0プログラミング言語>クラスの定義>クラスインターフェイス」のインターフェイスのインポートの部分を読みましょう。
今回はlibxmlを使うソースで
#include <libxml/tree.h>
が必要になります。
で、このincludeやimportで指定したファイルは、やみくもに探しているわけじゃなく決まった所を決まった順(同じ名前のファイルがあれば、最初に見つかった側が使われるので順序も重要)にしか探してもらえない。
Macintosh HD → Developer → Platforms → iPhoneSimulator.platform→Developer→SDKs→iPhoneSimulator3.0.sdk→usr→include
自体は検索対象なんだけど、その中にあるlibxml2というフォルダは検索対象外になる。
そのためこのパスも検索対象に含めろと指定してやる必要がある。指定するにはプロジェクト>アクティブターゲット"rss"を編集>メニューで出てくるダイアログのブルドタグのヘッダ検索パスを編集する。
これだ~。
あ、ワン・トゥ・スリ~
ここの2番目の赤丸枠「構成:アクティブ(Debug)」は他に「すべての構成」や「Release」もある。こいつはプロジェクト>アクティブなビルド構成を選択メニューで選択する項目のどちら側の設定かを指定するのに利用。どちらにも適用したい場合は「すべての構成」を選ぶ。私は当面、Debugしか使う気がないので「構成:アクティブ(Debug)」だけ設定しました。
「表示:」は「すべての設定」でないと「ヘッダ検索パス」の項目が現れないので注意。インクルードパスを追加した後は「このレベルに定義された設定」でも現れるようになる。
「このレベルに定義された設定」は「常にユーザーパスを検索」のように太文字になっとります。
ちなみに「すべての設定」だと項目がいっぱい出てくるんですが、検索キーワードに「ヘッダ検索」と入力するとその文字列と一致する項目だけ表示されるので便利っす。
あとは「ヘッダ検索パス」の項目をダブルクリックして出てくるダイアログの追加ボタンを押してパスを入力。
入力するパスはダイレクトに
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/usr/include/libxml2
でもいいんですが私は
${SDKROOT}/usr/include/libxml2
とします。こう書いた方がベースSDKを切り替えたら勝手に連動してくれるので便利だから。
ベースSDKは「iPhoneアプリ開発、その(83)」のところでも軽く触れてるけどSDKによって切り替わる起点とするパスの事。
Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/
をのぞいたら
iPhoneSimulator2.0.sdk/
iPhoneSimulator2.1.sdk/
・
・
iPhoneSimulator3.0.sdk/
てフォルダが並んでると思うけど、${SDKROOT}はこのどれを使うかの指定です。それぞれにFrameworksやusrフォルダを持っとるわけですな。
メモ)設定ダイアログにはベースSDKの項目もあって、調べるとシミュレータ時も、シミュレータじゃなく実機側になってる。ただし動かすとただしくシミュレータで動く。ここらへんは何故でしょうね。これで正しく動くなら、わざわざシミュレータの項目が存在する意味がわからない...
ここまでできたら、後はrssAppDelegateへの実装。
まずは小手調べでbbs.phpから返されるテキストをパースさせてみる。
1、NSURLConnectionのconnectionWithRequest:delegateメソッドより前に
xmlCreatePushParserCtxt
でパース用のxmlParserCtxtPtrを作っておく。
2、connection:didReceiveDataメソッドにデータが届くたびに
xmlParseChunk
でパースさせる。この結果はxmlParserCtxtPtr作成時に指定しておいたstartElementHandler、endElementHandler、charactersFoundHandler関数経由で伝えられる。
3、connectionDidFinishLoading:connectionメソッドが呼び出された時点で
xmlParseChunk
でデータが終わった事を伝え、
xmlFreeParserCtxt
でパース用のxmlParserCtxtPtrを解放する。
今回はstartElementHandlerで発見したタグ文字列を表示してみます。追加部分はrssAppDelegate.mのみで#ifdef PARSE_XML~#endifで囲まれたところ。
うりゃ、っと実行。
げえええええ、input以降のタグが来ね~。
ふっ、どうやらPHP側でミスがあるみたいですな。
以下次回!
------------
サンプルプロジェクト:rss5.zip