我正在尝试创建一个简单的NSURLConnection,以使用GET请求与服务器通信.连接工作正常,但从不调用NSURLConnection的委托方法.
这是在做什么:
NSString *post = [NSString stringWithFormat:@"key1=%@&key2=%@&key3=%f&key4=%@", val1, val4, val3, val4];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease] ;
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.domain.com/demo/name/file.php?%@", post]]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
Run Code Online (Sandbox Code Playgroud)
已实现以下委托方法,但没有一个被调用..
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"did fail");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
NSLog(@"did receive data");
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"did receive response ");
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"did finish loading");
[connection release];
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
之前已经提出过类似的问题,但我找不到解决方案.
这是我的情况 - 我的UIWebView加载了一个远程html页面.网页中使用的图像在构建时是已知的.为了使页面加载更快,我想将图像文件打包到iOS应用程序中并在运行时替换它们.
[请注意,html是远程的.我总是得到从本地加载html和图像文件的答案 - 我已经这样做了]
我得到的最接近的建议是在html页面和iOS应用程序中使用自定义URL方案,如myapp://images/img.png,使用NSURLProtocol子类截取myapp:// URL并用本地替换图像图片.在理论上听起来不错,但我没有遇到一个完整的代码示例来证明这一点.
我有Java背景.我可以使用自定义内容提供商轻松地为Android做到这一点.我相信iOS/Objective-C必须存在类似的解决方案.我没有足够的Objective-C经验可以在很短的时间内自行解决.
任何帮助将不胜感激.
我有UIWebview,它对外部服务进行AJAX调用.离线时我需要捕获这些请求并返回本地json.
我实现了NSURLProtocol,我设法捕获AJAX请求,问题是jquery总是返回0错误代码:
$.ajax({
url: url,
dataType: 'json',
contentType: "application/json",
success: function(jsonData){
alert("success :");
},
error: function (request, status, error) {
alert("failure :" + request.status );
}
Run Code Online (Sandbox Code Playgroud)
});
我总是得到一个request.status = 0
为了测试我的协议,我试图在我的html中模拟一个图像并且效果很好.
这是我的完整实现:
#import "EpubProtocol.h"
@implementation EpubProtocol
#pragma mark - NSURLProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
BOOL awsRequest = [self request:request contains:@"s3.amazonaws.com"];
BOOL imgRequest = [self request:request contains:@"google.fr"];
BOOL match = awsRequest || imgRequest;
return match;
}
+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)theRequest
{
return theRequest;
}
- (void)startLoading { …Run Code Online (Sandbox Code Playgroud) 如何在WKWebview上监控请求?
我尝试过使用NSURLprotocol(canInitWithRequest)但它不会监视ajax请求(XHR),只监视导航请求(文档请求)
我正在使用Xamarin.Forms处理iOS应用程序.
此应用程序使用UIWebView控制器,显示托管在我的服务器上的Web应用程序.每次我发出请求时,我都必须发送一个自定义标头,以便识别此请求来自移动应用程序,而不是来自浏览器,为此,我使用NSUrlProtocol对象覆盖方法请求插入每个请求的自定义标头.这是我的代码:
public override NSUrlRequest Request {
get {
NSMutableDictionary headers = null;
if (null == base.Request.Headers) {
headers = new NSMutableDictionary ();
} else {
headers = new NSMutableDictionary (base.Request.Headers);
}
headers.Add(NSObject.FromObject(AppVariables.headerVariable), NSObject.FromObject (AppVariables.appVersion));
NSMutableUrlRequest newRequest = (NSMutableUrlRequest)base.Request.MutableCopy ();
newRequest.Headers = headers;
return newRequest;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在遇到的问题是我注意到自从我开始使用NSUrlProtocol后,页面的加载时间增加了很多.现在加载需要10秒,在此实现之前,页面大约需要3秒钟.
任何人都可以指出一些有用的方向来克服这个?
我重写NSURLProtocol并需要返回具有特定statusCode的HTTP响应.NSHTTPURLResponse没有statusCode setter,所以我尝试用以下方法覆盖它:
@interface MyHTTPURLResponse : NSHTTPURLResponse {}
@implementation MyHTTPURLResponse
- (NSInteger)statusCode {
return 200; //stub code
}
@end
Run Code Online (Sandbox Code Playgroud)
重写的NSURLProtocol的startLoading方法如下所示:
-(void)startLoading
{
NSString *url = [[[self request] URL] absoluteString];
if([url isEqualToString:SPECIFIC_URL]){
MyURLResponse *response = [[MyURLResponse alloc] initWithURL:[NSURL URLWithString:@"http://fakeUrl"]
MIMEType:@"text/plain"
expectedContentLength:0 textEncodingName:nil];
[[self client] URLProtocol:self
didReceiveResponse:response
cacheStoragePolicy:NSURLCacheStorageNotAllowed];
[[self client] URLProtocol:self didLoadData:[@"Fake response string"
dataUsingEncoding:NSASCIIStringEncoding]];
[[self client] URLProtocolDidFinishLoading:self];
[response release];
}
else{
[NSURLConnection connectionWithRequest:[self request] delegate:self];
}
}
Run Code Online (Sandbox Code Playgroud)
但是这种方法不起作用,在NSURLProtocol中创建的响应总是在网页上使用statusCode = 0.同时,NSURLConnection从网络返回的响应具有正常的预期statusCodes.
任何人都可以请求有关如何为创建的NSURLResponse显式设置statusCode的想法?感谢名单.
在我的iOS应用程序中,我使用的是UIWebView和自定义协议(使用我自己的NSURLProtocol实现).我一直非常小心确保每当我加载一个url时,我将这样的内容加载到我的UIWebView中:
myprotocol:// MYSERVER/mypath中
在我的NSURLProtocol实现中,我获取NSURLRequest的可变副本,将URL转换为http:并将其发送到我的服务器.
一切都适用于HTTP GET请求.我遇到的问题是POST请求.如果请求使用我的自定义协议,似乎UIWebView没有正确编码HTTPBody中的表单数据.
一个解决方法,因为我使用HTTPS来处理我的服务器请求,就是我注册我的协议处理程序来拦截http:而不是myprotocol:我可以将所有调用转换为https:这个其他问题,在这里,我指向了解:
但我想知道是否有任何替代和/或更好的方式来实现我想要的东西.
所述NSURLProtocolClient协议包括一种方法,-URLProtocol:wasRedirectedToRequest:redirectResponse:,其中NSURLProtocol子类的实例被假设为使用以告诉请求被重定向的URL协议的客户端.但是,我不确定URL协议是否应该尝试从重定向的URL检索资源,或者让客户端发出对该资源的新请求.
任何人都可以告诉我在重定向的情况下原始URL协议对象应该做什么?
我正在尝试实现本教程,该教程使用NSURLConnection实现自定义NSURLProtocol.
https://www.raywenderlich.com/76735/using-nsurlprotocol-swift
它按预期工作,但现在在iOS9中不推荐使用NSURLConnection,我试图将其转换为NSURLSession.
不幸的是,它没有用.
我正在uiwebview中加载一个网站,如果我使用NSURLConnection加载并且一切都按预期工作,则会捕获来自webview的所有http请求,但在使用NSURLSession时则不会.
任何帮助表示赞赏.
这是我的代码
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 …Run Code Online (Sandbox Code Playgroud) 如您所知,使用MPMoviePlayerController对象播放电影
[[MPMoviePlayerController alloc] initWithContentURL: aURL];
Run Code Online (Sandbox Code Playgroud)
现在,我想实现一个自定义NSURLProtocol,我将在其中解密已被AlgorithmDES加密的电影源.那可能吗?谢谢你给予任何想法.需要你的帮助〜
nsurlprotocol ×10
ios ×7
iphone ×4
uiwebview ×4
objective-c ×2
ajax ×1
html ×1
image ×1
javascript ×1
macos ×1
monitor ×1
nsurlsession ×1
redirect ×1
swift ×1
url ×1
wkwebview ×1
xamarin ×1