您的当前位置:首页正文

webView开发遇到的问题

来源:华拓网

1.怎么创建post的web请求

我们平常都是比较熟悉get方式的请求方式,post用的比较少,但是在类似支付页面的调用上回用到,用法如下

使用场景:url为基本url,dic为多个参数要post的参数,for中为了拼接body体

NSURL *url = [NSURL URLWithString:self.webURL];

NSString *bodyStr = @"";

for (NSString *keyStr in self.dic) {

NSString *andStr = bodyStr.length < 1?@"":@"&";

NSString *aaa = self.dic[keyStr];

NSString *iiii = [aaa URLEncodedString];//转为URL字符

bodyStr = [bodyStr stringByAppendingString:[NSString stringWithFormat:@"%@%@=%@",andStr,keyStr,iiii]];

}

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];

[request setHTTPMethod:@"POST"];

[request setHTTPBody: [bodyStr dataUsingEncoding: NSUTF8StringEncoding]];

[_webV loadRequest: request];

2.iOS中URL特殊字符的转换问题

上述中 代码:NSString *iiii = [aaa URLEncodedString];//转为URL字符

//转换为URL编码

- (NSString *)URLEncodedString

{

// CharactersToBeEscaped = @":/?&=;+!@#$()~',*";

// CharactersToLeaveUnescaped = @"[].";

NSString *unencodedString = self;

NSString *encodedString = (NSString *)

CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,

(CFStringRef)unencodedString,

NULL,

(CFStringRef)@"!*'();:@&=+$,/?%#[]",

kCFStringEncodingUTF8));

return encodedString;

}

//还原

-(NSString *)URLDecodedString

{

//NSString *decodedString = [encodedString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding ];

NSString *encodedString = self;

NSString *decodedString  = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL,

(__bridge CFStringRef)encodedString,

CFSTR(""),

CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));

return decodedString;

}

上述方法是为了转换特殊字符的问题,但是已经警告不要用了,并提供了代替方法stringByAddingPercentEncodingWithAllowedCharacters,该方法的用法是:

NSString *iiii = [aaa stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];

但是使用中又发现"+""="等(其他待补充)url中的字符没有转换过来,找了很多方式没找到更好的解决方式,只能使用如下比较笨的方式

iiii = [iiii stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];

iiii = [iiii stringByReplacingOccurrencesOfString:@"=" withString:@"%3D"];

3.web页面打开空白的解决方法

遇到一些支付页面由于需要允许证书接收,所以会一直空白,并且控制台输出

CFStreamErrorDomainSSL, -9813

解决方法:在appdelegate.m中,@end后面加上

@implementation NSURLRequest(DataController)

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host

{

return YES;

}