Your SlideShare is downloading. ×
URL Loading Systemを拡張する, NSURLProtocol
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

URL Loading Systemを拡張する, NSURLProtocol

2,600
views

Published on

2004-04-10, Cocoa勉強会 …

2004-04-10, Cocoa勉強会

NSURLProtocolのデザインと自分でサブクラスを定義する場合についてなど。

Published in: Technology

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,600
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 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 Overview URL Loading Systemに関わるクラス、およびその役割は次のとおり。(ADCの「URL Loading SystemOverview」より) 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 - protocolSimple Loading 基本的なケース。プロトコルはクライアントのメソッド(NSURLProtcolClient)を通して、ロードの結果・経過を通知する。
  • 2. 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;とだけコードを書けばよい。 -startLoading URLのロードを開始する。実際にロードを行うメソッド。 -stopLoading URLのロードを中止する。ユーザが中止を指示したとき、ロード中にエラーが発生したときなどに呼び 出される。 実装したプロトコルのクラスは+[NSURLProtocol registerClass:]で登録しなければURL Loading Systemでは有効とはならない。Loading with Cache キャッシュを利用するケース。キャッシュデータは、NSURLCacheにより管理される。また、キャッシュデータはNSCachedURLResponseのインスタンスとして表現される。
  • 3. あるURLをロードしようとして、有効なキャッシュがあったときには、次のようになる。(後半はロード後にキャッシュデータを保存しておく処理) プロトコルは、リクエストの-[NSURLRequest cachePolicy]にしたがってキャッシュが有効かを判定する。各クラスの役割 プロトコル キャッシュデータが有効かを判定 クライアント キャッシュデータの取り出し キャッシュデータの保存(このときキャッシュデータの作成も行う) NSURLCache キャッシュデータを保存・取り出しできる入れ物Loading with Authentication 認証の必要なケース。認証はプロトコルNSURLAuthenticationChallengeSenderを実装したオブジェクトが行う。プロトコルのクラスで実装するのが簡単だが、下の図では説明のためプロトコルと認証のオブジェクトを分けて書いてある。
  • 4. プロトコルは、認証に成功後、ユーザ/パスワードを保存する。このとき、NSURLCredentialPersistencePermanentが指定されていれば、ユーザ/パスワードはキーチェーンに保存される。 また、-[NSURLCredentialStorage defaultCredentialForProtectionSpace:]によりユーザ/パスワードを取り出して、クライアントに尋ねずに処理を継続することもできる。各クラスの役割 プロトコル = NSURLAuthenticationChallengeSender 認証の実際の実行 ユーザ/パスワードをNSURLCredentialStorageに保存 クライアント ユーザ/パスワードの入力の受付 NSURLCredentialStorage ユーザ/パスワードを保存・取り出しできる入れ物 NSURLCredential ユーザ/パスワードの組をあらわす NSURLProtectionSpace 認証先のホスト名、ポートなどをあらわす NSURLAuthenticationChallenge NSURLCredential, NSURLProtectionSpace, NSURLAuthenticationChallengeSenderなどをまと めて保持 NSURLCredential、NSURLProtectionSpace、NSURLAuthenticationChallengeの3つは振る舞いをもたない、データクラス。
  • 5. おまけどんなときにプロトコルを実装するか 本当に、あたらしい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の サブクラスを実装したもので、公開されているものを他に知らないのであげておく。 情報少なすぎだってば...