我有一个问题,我试图在用户移动UIScrollView时后台加载声音文件...问题是我使用NSURLRequest所以我可以在后台加载,但即便如此它拒绝实际加载直到UIScrollView已停止滚动.:(
我能做些什么吗?
谢谢!
我无法在UIWebView不破坏其goBack方法的情况下将自定义HTML加载到我身上.
什么有用
我正在拦截我的URL请求,UIWebView所以我可以加载自定义HTML.我控制了所有的HTML,所以我有我的特殊应用程序请求使用myapp://arg1/?arg2=val我可以解析的自定义方案(即.)webView:shouldStartLoadWithRequest:navigationType:.我决定我真正想要加载和调用哪些HTML loadHTMLString:baseURL并返回NO以取消原始请求.
什么行不通
以上工作很棒.问题是我想使用该UIWebView's goBack方法,并且loadRequest:似乎是UIWebView添加到其历史堆栈的唯一方法.
我有一些想法,但我不确定哪些是可行的以及如何解决它们.最主要的似乎是,我必须返回YES的webView:shouldStartLoadWithRequest:navigationType,我必须使用UIWebView的loadRequest方法.
想法1:修改NSURLRequest/Response: 我可以将NSURLRequest子类化,以便(当UIWebView发出请求时)它实际上不会发出HTTP请求并返回带有我的HTML的NSURLResponse吗?或者可能以某种方式修改/子类/添加类别方法到NSURLResponse?我喜欢它是一个真正的请求,但我担心私有API并被App Store拒绝.
想法2:处理自定义URL协议 注册自定义URL协议,以便我的应用程序响应它,我可以让它返回合法的NSURLResponse(填充我的自定义HTML.)
想法3:欺骗缓存用这个缓存策略创建请求,NSURLRequestReturnCacheDataDontLoad然后以某种方式在webView和缓存之间获取我的HTML?
或许我完全走错了轨道?
我一直在测试一个iPhone视图控制器,它使用UIWebView加载外部内容,而不是项目包中的资源.另一位工程师注意到Web视图根本没有缓存,所以我进行了一些研究.一些较旧的问题表明UIWebView无法缓存外部内容.
以前关于UIWebView缓存的SO问题:
这些帖子非常混乱,但我注意到在iOS 4.0问世之前他们都被问到了.我测试了以下缓存方法,这看起来很简单.
NSURLRequest *request = [NSURLRequest requestWithURL:myUrl
cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
[webView loadRequest:request];
Run Code Online (Sandbox Code Playgroud)
这似乎在iOS 4.3上运行良好,但在iOS 3.0上根本不起作用.我通过将设备指向Charles代理(在iPhone上,设置 - > WiFi,手动代理)并将流量记录到我的服务器来测试.
UIWebView是否开始在iOS 4.0中观察缓存策略?任何人都可以证实这一点,还是我想象的事情?
通过更新客户端的API,HTTPBasicAuthication方法已替换为OAuth2 BearerAuthorization标头.
使用旧API我会执行以下操作:
NSURLCredential *credential = [NSURLCredential credentialWithUser:self.account.username
password:self.account.token
persistence:NSURLCredentialPersistenceForSession];
NSURLProtectionSpace *space = [[NSURLProtectionSpace alloc] initWithHost:kAPIHost
port:443
protocol:NSURLProtectionSpaceHTTPS
realm:@"my-api"
authenticationMethod:NSURLAuthenticationMethodHTTPBasic];
Run Code Online (Sandbox Code Playgroud)
但这不适用于Bearer标题.
现在通常我会添加标题我自己添加它像这样:
NSString *authorization = [NSString stringWithFormat:@"Bearer %@",self.account.token];
[urlRequest setValue:authorization forHTTPHeaderField:@"Authorization"];
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案的问题在于API将大多数调用重定向到其他URL,这与安全性有关.NSURLRequest重定向后,从请求中删除了Authorization标头,因为我无法将Bearer方法添加到其中,NSURLCredentialStorage因此重定向后无法再对其进行身份验证.
什么是好的解决方案?我只能想到捕获重定向并修改NSURLRequest它,所以它确实包括Bearer标题.但是怎么样?
我试图从服务器获取数据.我使用NSURLConnectionDelegate,NSURLConnectionDataDelegate.有代码(Objective-C).
-(void)sendRequest
{
NSURL* url = [[NSURL alloc] initWithString:@"http://SomeServer"];
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init];
NSString* reqBody = [NSString stringWithFormat:@"<tag>Content</tag>"];
NSData* reqData = [reqBody dataUsingEncoding:NSUTF8StringEncoding];
NSInputStream* stream = [NSInputStream inputStreamWithData:reqData];
[request setURL:url];
[request setHTTPBodyStream:stream];
[request setHTTPMethod:@"POST"];
self.wpData = [[NSMutableData alloc] init];
NSURLConnection* conection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[conection start];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[self.wpData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
NSString* str = [[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding];
NSLog(@"RESPONSE DATA: %@",str);
[self.wpData appendData:d];
}
Run Code Online (Sandbox Code Playgroud)
但是当我使用时,我得到"411 …
objective-c nsurlconnection nsurlrequest ios http-status-code-411
每当我在一个可变请求上设置一个主体,并将该方法设置为除POST之外的任何其他内容时,该主体不包含在请求中,当服务器回复时,我得到一个kCFErrorDomainCFNetwork错误303(kCFErrorHTTPParseFailure).将方法更改为POST是请求无需错误即可完成的所有操作.有没有办法将身体附加到其他方法,或者我们是否坚持POST一切?
这是提交代码:
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:assembleURL]];// cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:45.0];
#if (SERVER_TARGET_ARGS_ALLOWED==1)
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[req setHTTPMethod:ServerMessageMethods[operation]]; //value is @"POST" or other method name
#endif
//run the payload into a JSON
SBJsonWriter *json = [[SBJsonWriter alloc] init];
NSString *encodedPayload = [json stringWithObject:payload];
encodedPayload = [NSString stringWithFormat:@"%@", [encodedPayload stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *dataPayload = [encodedPayload dataUsingEncoding:NSUTF8StringEncoding];
[req setHTTPBody:dataPayload];
NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];
Run Code Online (Sandbox Code Playgroud) 我有一个完全基于网络的应用程序,需要互联网连接才能导航.基本上是通过UIWebView查看的网站.
我需要能够告诉用户如果没有互联网连接,则无法加载任何页面.有一种简单的方法可以做到这一点.也许检查NSURLRequest是否失败?
干杯
我的自定义互联网浏览器出了问题.我正在使用WKWebView.我的应用程序中有标签.如果我单击选项卡,则在WKWebView中加载新的NSURLRequest.我需要实现一个缓存.如果用户按下选项卡,我宁愿加载缓存数据而不是新数据.不幸的是这段代码不起作用:
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:0.0];
[self.webView loadRequest:request];
Run Code Online (Sandbox Code Playgroud)
你能指导我如何为WKWebView实现缓存吗?
我在服务器上运行的Web服务以XML格式或JSON格式返回数据.我想要请求JSON格式但使用HTTP Post方法.
任何帮助非常感谢.
提前致谢.
我使用iOS7的新URL请求方法获取数据,如下所示:
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:[NSURL URLWithString:[self.baseUrl
stringByAppendingString:path]]];
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
NSUInteger responseStatusCode = [httpResponse statusCode];
if (responseStatusCode != 200) {
// RETRY (??????)
} else
completionBlock(results[@"result"][symbol]);
}];
[dataTask resume];
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不时收到HTTP响应,表明服务器无法访问(response code != 200)并需要向服务器重新发送相同的请求.
如何才能做到这一点?我如何完成上面评论所在的代码片段// RETRY?
在我的示例中,我在成功获取后调用完成块.但是如何再次发送相同的请求呢?
谢谢!
nsurlrequest ×10
ios ×6
iphone ×4
objective-c ×4
uiwebview ×3
cocoa ×2
cocoa-touch ×2
ipad ×2
caching ×1
json ×1
oauth-2.0 ×1
uiscrollview ×1
wkwebview ×1