URL Loading Systemを拡張する, NSURLProtocol

5
URL Loading Systemを拡張する Cocoa勉強会 2004.04.10(土) 木村 渡 はじめに この発表では、Mac OS XのURL Loading System、そのなかでもNSURLProtocolのサブクラスを実装し、URL Loading SystemをあらたなURL Schemeに対応させることについて説明する。また、認証・キャッシュについても とりあげる。ポイントは次の2つ。 NSURLProtocolのサブクラスにより、URLで表現されるデータへのアクセスを行う。 NSURLProtocol(のサブクラス)はプロトコル NSURLProtocolClientを実装したオブジェクトと協調して 動作する。 URL Loading System Overview URL Loading Systemに関わるクラス、およびその役割は次のとおり。(ADCの「URL Loading System Overview」より) URL Loading NSURLResponse NSURLRequest NSURLConnection NSURLDownload Cache Management NSURLCache NSCachedURLResponse Authentication and Credential NSURLProtectionSpace NSURLCredentialStorage NSURLCredential NSURLAuthenticationChallenge NSURLAuthenticationChallengeSender - protocol Cookie Storage - 今回は説明の対象外 NSHTTPCookieStorage NSHTTPCookie Protocol Support NSURLProtocol NSURLProtocolClient - protocol Simple Loading 基本的なケース。プロトコルはクライアントのメソッド(NSURLProtcolClient)を通して、ロードの結果・経過 を通知する。

description

2004-04-10, Cocoa勉強会 NSURLProtocolのデザインと自分でサブクラスを定義する場合についてなど。

Transcript of URL Loading Systemを拡張する, NSURLProtocol

Page 1: URL Loading Systemを拡張する, NSURLProtocol

URL Loading Systemを拡張するCocoa勉強会 2004.04.10(土) 木村 渡

はじめにこの発表では、Mac OS XのURL Loading System、そのなかでもNSURLProtocolのサブクラスを実装し、URLLoading SystemをあらたなURL Schemeに対応させることについて説明する。また、認証・キャッシュについてもとりあげる。ポイントは次の2つ。

NSURLProtocolのサブクラスにより、URLで表現されるデータへのアクセスを行う。NSURLProtocol(のサブクラス)はプロトコル NSURLProtocolClientを実装したオブジェクトと協調して動作する。

URL Loading System OverviewURL Loading Systemに関わるクラス、およびその役割は次のとおり。(ADCの「URL Loading SystemOverview」より)

URL LoadingNSURLResponseNSURLRequestNSURLConnectionNSURLDownload

Cache ManagementNSURLCacheNSCachedURLResponse

Authentication and CredentialNSURLProtectionSpaceNSURLCredentialStorageNSURLCredentialNSURLAuthenticationChallengeNSURLAuthenticationChallengeSender - protocol

Cookie Storage - 今回は説明の対象外NSHTTPCookieStorageNSHTTPCookie

Protocol SupportNSURLProtocolNSURLProtocolClient - protocol

Simple Loading基本的なケース。プロトコルはクライアントのメソッド(NSURLProtcolClient)を通して、ロードの結果・経過を通知する。

Page 2: URL Loading Systemを拡張する, NSURLProtocol

URLProtocol:didLoadData:は1度のロード中に何度も呼び出されることもある。また、ロード中にエラーが発生し、処理を継続できないときは、クライアントにURLProtocol:didFailWithError:で通知する。

各クラスの役割

プロトコルリソースへのアクセス

クライアント結果・経過の保持・表示

サブクラスで定義するメソッド

NSURLProtocolのサブクラスでは、以下のメソッドをオーバーライドして定義する必要がある。

+canInitWithRequest:リクエストされたURLが、このクラスで扱えるか。

+canonicalRequestForRequest:リクエストされたURLを補正する。たとえば、"file://localhost/tmp/thisfile"や "file:/tmp/thisfile"というURLがあったとき、"file:///tmp/thisfile"というURLに統一することができる。そうすることで、キャッシュが有効に利用できるなどウレシイことがある。(WebKit SDK MLより)とくに必要がなければreturn request;とだけコードを書けばよい。

-startLoadingURLのロードを開始する。実際にロードを行うメソッド。

-stopLoadingURLのロードを中止する。ユーザが中止を指示したとき、ロード中にエラーが発生したときなどに呼び出される。

実装したプロトコルのクラスは+[NSURLProtocol registerClass:]で登録しなければURL Loading Systemでは有効とはならない。

Loading with Cacheキャッシュを利用するケース。キャッシュデータは、NSURLCacheにより管理される。また、キャッシュデータはNSCachedURLResponseのインスタンスとして表現される。

Page 3: URL Loading Systemを拡張する, NSURLProtocol

あるURLをロードしようとして、有効なキャッシュがあったときには、次のようになる。(後半はロード後にキャッシュデータを保存しておく処理)

プロトコルは、リクエストの-[NSURLRequest cachePolicy]にしたがってキャッシュが有効かを判定する。

各クラスの役割

プロトコルキャッシュデータが有効かを判定

クライアントキャッシュデータの取り出しキャッシュデータの保存(このときキャッシュデータの作成も行う)

NSURLCacheキャッシュデータを保存・取り出しできる入れ物

Loading with Authentication認証の必要なケース。認証はプロトコルNSURLAuthenticationChallengeSenderを実装したオブジェクトが行う。プロトコルのクラスで実装するのが簡単だが、下の図では説明のためプロトコルと認証のオブジェクトを分けて書いてある。

Page 4: URL Loading Systemを拡張する, NSURLProtocol

プロトコルは、認証に成功後、ユーザ/パスワードを保存する。このとき、NSURLCredentialPersistencePermanentが指定されていれば、ユーザ/パスワードはキーチェーンに保存される。

また、-[NSURLCredentialStorage defaultCredentialForProtectionSpace:]によりユーザ/パスワードを取り出して、クライアントに尋ねずに処理を継続することもできる。

各クラスの役割

プロトコル = NSURLAuthenticationChallengeSender認証の実際の実行ユーザ/パスワードをNSURLCredentialStorageに保存

クライアントユーザ/パスワードの入力の受付

NSURLCredentialStorageユーザ/パスワードを保存・取り出しできる入れ物

NSURLCredentialユーザ/パスワードの組をあらわす

NSURLProtectionSpace認証先のホスト名、ポートなどをあらわす

NSURLAuthenticationChallengeNSURLCredential, NSURLProtectionSpace, NSURLAuthenticationChallengeSenderなどをまとめて保持

NSURLCredential、NSURLProtectionSpace、NSURLAuthenticationChallengeの3つは振る舞いをもたない、データクラス。

Page 5: URL Loading Systemを拡張する, NSURLProtocol

おまけ

どんなときにプロトコルを実装するか

本当に、あたらしいURLスキームに対応させたいときあるURLを別の内容で置き換えたいとき

正直、後者のほうが用途が多そう。

NSURLProtocolでは、URLの文字列で示されるリソースをロードする手順のみが標準化されていて、自由度はあまり高くない。多様なアクセスを行うには、NSHTTPURLRequestのようにリクエストのクラスも拡張する必要がある。

IMAP URL Scheme

サンプルの理解のため、参考まで。IMAPのURL表現は、RFC2192で定義されており、次のような形式をとる。

imap://user@imapserver/inbox;TYPE=listフォルダの一覧を取得する。

imap://user@imapserver/cocoastudy/?SUBJECT%20NSURLフォルダ内のメールを検索する。(フォルダ内のメールの一覧が得られる)

imap://user@imapserver/cocoastudy/;UID=155フォルダ内のUIDで表されるメールの内容を取得する。

ユーザが指定されなかったときは、anonymousでのログインとなる。

資料内でのコトバの定義

',&!+

NSURLProtocolのサブクラスのインスタンス。 *��-&

NSURLProtocolClientを実装したオブジェクト。�($")%�#

NSCachedURLResponseのインスタンス。

参考情報

������������� �����������

http://developer.apple.com/ documentation/Cocoa/Conceptual/URLLoadingSystem/index.html

とにかく基本。行間を読みまくれっ。������������

http://www.lists.apple.com/mailman/listinfo/webkitsdk-dev

たま~に有用な情報が得られる。 �����

http://homepage3.nifty.com/kimuraw/proj/sandtrip.html

木村が作成している、SafariにローカルCGI機能を追加するソフトウェア。実際にNSURLProtocolのサブクラスを実装したもので、公開されているものを他に知らないのであげておく。

情報少なすぎだってば...