私はNSURLConnectionでカスタムNSURLProtocolを実装するこのチュートリアルを実装しようとしています。カスタムNSURLProtocol with NSURLSession
https://www.raywenderlich.com/76735/using-nsurlprotocol-swift
期待どおりに動作しますが、今NSURLConnectionはiOS9に廃止されていることを、私はNSURLSessionに変換しようとしています。
不幸にも機能しませんでした。
私はuiwebviewでWebサイトをロードしていますが、NSURLConnectionをロードしてすべてが正常に動作すると、webviewからのすべてのHTTP要求がキャプチャされますが、NSURLSessionを使用しているときはキャプチャされません。
何か助けていただければ幸いです。
はここにあなたのコードを持っている問題は、あなたのデータのタスクを含むようにNSURLSession.sharedSessionを使用していることである私のコード
import UIKit
class MyProtocol: NSURLProtocol, NSURLSessionDataDelegate, NSURLSessionTaskDelegate, NSURLSessionDelegate {
//var connection: NSURLConnection!
var mutableData: NSMutableData!
var response: NSURLResponse!
var dataSession: NSURLSessionDataTask!
override class func canInitWithRequest(request: NSURLRequest) -> Bool {
if NSURLProtocol.propertyForKey("MyURLProtocolHandledKey", inRequest: request) != nil {
return false
}
return true
}
override class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLRequest {
return request
}
override class func requestIsCacheEquivalent(aRequest: NSURLRequest,
toRequest bRequest: NSURLRequest) -> Bool {
return super.requestIsCacheEquivalent(aRequest, toRequest:bRequest)
}
override func startLoading() {
let newRequest = self.request.mutableCopy() as! NSMutableURLRequest
NSURLProtocol.setProperty(true, forKey: "MyURLProtocolHandledKey", inRequest: newRequest)
self.dataSession = NSURLSession.sharedSession().dataTaskWithRequest(newRequest)
dataSession.resume()
self.mutableData = NSMutableData()
}
override func stopLoading() {
print("Data task stop")
self.dataSession.cancel()
self.mutableData = nil
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
self.response = response
self.mutableData = NSMutableData()
print(mutableData)
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
self.client?.URLProtocol(self, didLoadData: data)
self.mutableData.appendData(data)
}
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
if (error == nil)
{
self.client!.URLProtocolDidFinishLoading(self)
self.saveCachedResponse()
}
else
{
self.client?.URLProtocol(self, didFailWithError: error!)
}
}
func saveCachedResponse() {
let timeStamp = NSDate()
let urlString = self.request.URL?.absoluteString
let dataString = NSString(data: self.mutableData, encoding: NSUTF8StringEncoding) as NSString?
print("TiemStamp:\(timeStamp)\nURL: \(urlString)\n\nDATA:\(dataString)\n\n")
}
}
はどのようにあなたのコードが動作していない知っているのですか?自分で問題を追跡するために何をしましたか?コード例に戻って、コメントアウトされたすべてのセクションを削除できますか?おそらく、各ルーチンで達成しようとしていることについてのコメントを追加してください。 –
ねえ、私はwebviewのキャッシュで迅速かつ直面している問題に新しいです。私は同じソースで試しています。ウェブページが正しく読み込まれ、キャッシュに保存されています。しかし、デバイスがオフラインのとき、私はキャッシュデータからそれを得ることができません。私はurlsessionでコードを更新する必要があります。あなたはこのソースで私を助けてください:(https://drive.google.com/file/d/0B-5GPXUpPZh-Q2FOWEJudXRaQkE/view?usp=sharing –