- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写一些执行 http 请求的 API 代码,并且我一直在使用 [NSUrlConnection:sendAsynchronousRequest:queue:completionHandler] 进行调用,因为它使得编写简单的处理程序变得非常容易,而且我不必为每个调用设置不同的类和不同的委托(delegate)。
我遇到的问题是,接受自签名证书的唯一方法似乎是让一个实现几个函数的委托(delegate)说证书没问题。有没有办法用使用 block 的异步方法来做到这一点?
最佳答案
不,但是委托(delegate)调用并没有那么难。这是您需要的代码:
1) 将其设为静态文件
static CFArrayRef certs;
2) 在初始化时执行此操作:
// I had a crt certificate, needed a der one, so found this site:
// http://fixunix.com/openssl/537621-re-der-crt-file-conversion.html
// and did this from Terminal: openssl x509 -in crt.crt -outform der -out crt.der
NSString *path = [[NSBundle mainBundle] pathForResource:@"<your name>" ofType:@"der"];
assert(path);
NSData *data = [NSData dataWithContentsOfFile:path];
assert(data);
SecCertificateRef rootcert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)data);
if(rootcert) {
const void *array[1] = { rootcert };
certs = CFArrayCreate(NULL, array, 1, &kCFTypeArrayCallBacks);
CFRelease(rootcert); // for completeness, really does not matter
} else {
NSLog(@"BIG TROUBLE - ROOT CERTIFICATE FAILED!");
}
3) 然后添加这个方法:
- (void)connection:(NSURLConnection *)conn didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
#pragma unused(conn)
// NSLog(@"didReceiveAuthenticationChallenge %@ FAILURES=%zd", [[challenge protectionSpace] authenticationMethod], (ssize_t)[challenge previousFailureCount]);
/* Setup */
NSURLProtectionSpace *protectionSpace = [challenge protectionSpace];
assert(protectionSpace);
SecTrustRef trust = [protectionSpace serverTrust];
assert(trust);
CFRetain(trust); // Don't know when ARC might release protectionSpace
NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];
BOOL trusted = NO;
OSStatus err;
SecTrustResultType trustResult = 0;
err = SecTrustSetAnchorCertificates(trust, certs);
if (err == noErr) {
err = SecTrustEvaluate(trust, &trustResult);
if(err == noErr) {
// http://developer.apple.com/library/mac/#qa/qa1360/_index.html
switch(trustResult) {
case kSecTrustResultProceed:
case kSecTrustResultConfirm:
case kSecTrustResultUnspecified:
trusted = YES;
break;
}
}
}
CFRelease(trust);
// Return based on whether we decided to trust or not
if (trusted) {
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
} else {
NSLog(@"Trust evaluation failed");
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
关于ios - NSUrlConnection sendAsynchronousRequest 和自签名证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11615237/
我的主 UI 线程调用 sendAsynchronousRequest NSURLConnection的方法获取数据。 [NSURLConnection sendAsynchronousRequest
在下面的方法中,如果我在completionHandler中进行数据处理,是否会阻塞主线程?换句话说,completionHandler 中执行的任何操作是在主线程上完成还是在后台线程上完成? + (
我打电话 [NSURLConnection sendAsynchronousRequest:request queue:queue
我正在尝试使用 POST 从 PHP 页面获取简单的文本响应。我有以下代码: func post(url: String, info: String) -> String { var URL:
我不想做的事情的示例: var b = 0 let URL: NSURL = NSURL(string: "[URL to php file]")! let request:NSMutableURL
我正在使用以下代码进行网络调用。我知道响应将在 mainQueue 中运行,因为我已将队列参数指定为 [NSOperationQueue mainQueue] 但我想知道实际的 sendAsynchr
我正在开发一个 iOS 应用程序,它可以将大量任务分派(dispatch)到我的串行队列。任务是从我的网络服务器下载图像,将其保存到磁盘,然后显示在 UIImageView 上。但是,[NSURLCo
我有一个创建 NSURLRequest 的方法,并使用 NSURLConnection 方法 sendAsynchronousRequest:queue:compltionHandler: 发送该请求
我正在编写一些执行 http 请求的 API 代码,并且我一直在使用 [NSUrlConnection:sendAsynchronousRequest:queue:completionHandler]
这是我的代码崩溃的部分: let bodyData = "username=" + username + "&password=" + password let URL: NSURL = NSURL(
我正在尝试使用 POST 从 PHP 页面获取简单的文本响应。我有以下代码: func post(url: String, info: String) -> String { var URL:
我正在使用 sendAsynchronousRequest:queue:completionHandler: 上传文件(我已经删除了一些旧的第三方库,以支持使用此 native 方法直接调用。我保留了
当我执行NSURLConnection.sendAsynchronousRequest时,它总是显示相同的错误: Invalid conversion from throwing function o
我的应用程序允许用户拍照并将其上传到 PHP 服务器。我使用 sendAsynchronousRequest 调用将数据(带有照片文件的表单)发送到服务器。调试时,所有这些调用在我的 iPad 2 上
每次用户打开应用程序时,我都必须加载 API 的刷新 token 。 在我的 appDelegate.m 中,每次应用程序打开时我都会调用此代码: if(success){ //if the url
对不起,我不知道这一点,但我想知道为什么我尝试建立与数据库的连接时会出现延迟。 我基本上是从数据库中提取数据以将信息显示回 UITableView,但连接建立似乎有延迟。 - (void)viewDi
如果互联网连接出现问题,我会尝试取消异步请求。 var connection: NSURLConnection! self.connection = NSURLConnection.sendAsync
我的应用程序中有几个内存泄漏(不!请参阅更新 1),它们都归结为异步 URLRequest。下面的代码给了我一个内存泄漏,似乎“数据”从未被释放(下面的代码在逻辑上没有在我的应用程序中使用,因为它是一
我用这段代码发出请求: - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ //
.h @property (strong) NSString *reply; 我有以下方法: .m @synthesize reply; - (void)send { [NSURLConnecti
我是一名优秀的程序员,十分优秀!