iOS开发之CFNetWork的简单使用

CFNetwork解决单ip多证书代码 CFNetwork解决单ip多证书代码 #ios 结合AFNetworking使用 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.protocolClasses = @[[CFHTTPSURLProtocol class]]; AFHTTPSe... 阅读详情

CFNetWork是苹果提供的位于 Core Foundation 中的一个基于C的底层框架,是对更底层OS层BSD socket的封装,著名的网络框架ASI网络请求方面就是对CFNetWork进行封装的。

CFNetWork主要依赖俩个API,CFSocket 和 CFStream,CFSocket主要用于网络底层的通信,而CFStream包括CFReadStream 和 CFWriteStream,分别用于对Socket的读取和写入。

昨天下午小小研究了一ASIHttpRequest,顺带着看了看CFNetWork框架,试着写了一个小Demo,主要是用CFNetWork请求网上的一张图片,向新浪微博上传发送一张图片。

首先构造URL

[objc]  view plain  copy
  1. //url(度娘上的一张图片)  
  2. CFStringRef urlStr = CFSTR("http://c.hiphotos.baidu.com/image/w%3D310/sign=b8f7695888d4b31cf03c92bab7d6276f/4e4a20a4462309f76248df09710e0cf3d7cad682.jpg");  
  3.   
  4. //GET请求  
  5. CFStringRef method = CFSTR("GET");  
  6.   
  7. //构造URL  
  8. CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, urlStr, NULL);  


然后通过 CFReadStream发送http请求

[objc]  view plain  copy
  1. //http请求  
  2. CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, method, url, kCFHTTPVersion1_1);  
  3.   
  4. //创建一个读取流 读取网络数据  
  5. CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);  
  6.   
  7. //设置流的context这里将self传入,用于以后的回调  
  8. CFStreamClientContext ctxt = {0, (__bridge voidvoid *)(self), NULL, NULL, NULL};  

设置回调事件,用于监听网络事件

[objc]  view plain  copy
  1.     //监听回调事件  
  2.       
  3. //  kCFStreamEventNone,(没有事件发生)  
  4. //      
  5. //  kCFStreamEventOpenCompleted,(流被成功打开)  
  6. //      
  7. //  kCFStreamEventHasBytesAvailable,(有数据可以读取)  
  8. //      
  9. //  kCFStreamEventCanAcceptBytes,(流可以接受写入数据(用于写入流))  
  10. //      
  11. //  kCFStreamEventErrorOccurred,(在流上有错误发生)  
  12. //      
  13. //  kCFStreamEventEndEncountered ,(到达了流的结束位置)  
  14.     CFOptionFlags event = kCFStreamEventHasBytesAvailable|kCFStreamEventEndEncountered;  
  15.       

传入回调函数,用于接收的流事件的回调

[objc]  view plain  copy
  1.     //设值回调函数myCallBack  
  2.       
  3. //    回调函数格式  
  4. //    void callBack(CFReadStreamRef stream,CFStreamEventType type,void *clientCallBackInfo)  
  5.       
  6.     CFReadStreamSetClient(readStream, event, myCallBack, &ctxt);  

将流加入到runloop中,并打开流

[objc]  view plain  copy
  1. //将流加入到runloop中  
  2. CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);  
  3.   
  4. //打开流  
  5. CFReadStreamOpen(readStream);  

回调函数的实现,接收请求到的数据

[objc]  view plain  copy
  1. void myCallBack (CFReadStreamRef stream,CFStreamEventType type,voidvoid *clientCallBackInfo){  
  2.       
  3.     if (type == kCFStreamEventHasBytesAvailable) {  
  4.           
  5.         //将流中的数据存入到数组中  
  6.         UInt8 buff [255];  
  7.         int length = CFReadStreamRead(stream, buff, 255);  
  8.           
  9.         if (!imageData) {  
  10.             imageData = [NSMutableData data];  
  11.         }  
  12.   
  13.         [imageData appendBytes:buff length:length];  
  14.           
  15.     }  
  16.     if (type == kCFStreamEventEndEncountered) {  
  17.           
  18.         //通知imageView显示图片  
  19.         [(__bridge ViewController *)clientCallBackInfo didRequestImage];  
  20.           
  21.         //关闭流  
  22.         CFReadStreamClose(stream);  
  23.         //将流从runloop中移除  
  24.         CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);  
  25.     }  
  26. }  

最后就非常简单了将接收到的数据转成图片,给UIImageView显示就行了.

[objc]  view plain  copy
  1. - (void)didRequestImage{  
  2.     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 100, 320, 200)];  
  3.     UIImage *image = [UIImage imageWithData:imageData];  
  4.     imageView.image = image;  
  5.       
  6.     [self.view addSubview:imageView];  
  7. }  

上面是通过 CFNetWork请求数据,看起来挺简单的吧,下面是通过 CFNetWork向 新浪微博发送一张图片,上传的流程和上面的差不太多,主要是拼接数据麻烦一些,下面放上代码。

[objc]  view plain  copy
  1. //url  
  2. CFStringRef urlStr = CFSTR("https://upload.api.weibo.com/2/statuses/upload.json");  
  3.   
  4. //POST请求  
  5. CFStringRef method = CFSTR("POST");  
  6.   
  7. CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, urlStr, NULL);  
  8.   
  9. CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, method, url, kCFHTTPVersion1_1);  

//设置请求头,和请求体,注意只有POST才需要设置请求体

[objc]  view plain  copy
  1. //设置请求头  
  2. //分割符,HTTP上传文件的固定格式  
  3. NSString *boundary = [NSString stringWithFormat:@"---------------------------14737809dasdasda2746641449"];  
  4. NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];  
  5.   
  6. //OC的字符串要做C框架中使用需要__bridge桥接  
  7. CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Content-Type"), (__bridge CFStringRef)(contentType));  

请求体

[objc]  view plain  copy
  1. //设置请求体  
  2. NSData *bodyData = [self getRequestData];  
  3. CFHTTPMessageSetBody(request, (__bridge CFDataRef)(bodyData));  

请求体的拼接

[objc]  view plain  copy
  1. //拼装请求体  
  2. - (NSData *)getRequestData{  
  3.       
  4.     //需要上传的图片  
  5.     UIImage *image = [UIImage imageNamed:@"cat.png"];  
  6.     NSData *imageData = UIImagePNGRepresentation(image);  
  7.       
  8.       
  9.     //分隔符,注意要与上面请求头中的一致  
  10.     NSString *boundary = [NSString stringWithFormat:@"---------------------------14737809dasdasda2746641449"];  
  11.       
  12.       
  13.     //定义可变Data;  
  14.     NSMutableData *body = [NSMutableData data];  
  15.       
  16.     //分隔符  
  17.     [body appendData:[[NSString stringWithFormat:@"\r\n\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
  18.       
  19.     //需要发送的文字内容  
  20.     [body appendData:[@"Content-Disposition: form-data; name=\"status\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];  
  21.     [body appendData:[@"需要发送的文字内容\r\n" dataUsingEncoding:NSUTF8StringEncoding]];  
  22.       
  23.     //分隔符  
  24.     [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
  25.       
  26.     //需要发送的图片内容  
  27.     [body appendData:[@"Content-Disposition: form-data; name=\"pic\"; filename=\"cat.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];  
  28.     [body appendData:[@"Content-Type: image/png\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];  
  29.     [body appendData:[NSData dataWithData:imageData]];  
  30.       
  31.     //分割符  
  32.     [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
  33.       
  34.     //access_token 向新浪微博发送内容,需要OAuth认证,这里必须带上access_token  
  35.     [body appendData:[@"Content-Disposition: form-data; name=\"access_token\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];  
  36.       
  37.     [body appendData:[@"2.00svaeojkrewe901dPLialB" dataUsingEncoding:NSUTF8StringEncoding]];  
  38.       
  39.     //结尾注意这里的分割符和前面不一样,--%@--后面多了两条--,如果少了会发送不成功哦  
  40.     [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
  41.       
  42.     return body;  
  43. }  

然后将流加入到runloop中,打开流就OK了,剩下的基本和第一个Demo相同,在此就不再啰嗦了。

Ok发送成功



转载:http://blog.youkuaiyun.com/u013341398/article/details/39754133


掌握iOS FTP客户端开发的奥秘 本文主要介绍了如何在iOS应用中开发一个FTP客户端,涵盖了FTP协议的基本概念、客户端与服务器之间的通信方式、常用的FTP命令以及如何实现一个简单的FTP客户端。文中详细解释了FTP协议中端口的使用、预定义命令的交换以及客户端的开发流程,并提供了一些开发中的注意事项和建议。 阅读详情

相关推荐

掌握FTP协议:开发iOS应用中的FTP客户端

本文介绍了如何在iOS应用中开发一个简单的FTP客户端。首先概述了FTP协议的基础知识,随后介绍了开发过程中需要遵循的一些基本元素。接着,文章详细讲解了使用CFNetwork框架和自定义FTP客户端类的两种方法,并提供了实现网络流的具体步骤。最后,文章通过实例展示了如何下载远程文件,以及如何处理网络流中的阻塞问题。

weixin_35950531的博客 453

探索iOS网络编程新天地:iOS_Network项目解析

探索iOS网络编程新天地:iOS_Network项目解析 去发现同类优质开源项目:https://gitcode.com/ 在iOS开发中,网络编程是不可或缺的一部分。今天我们要介绍的是一个开源项目——,它提供了一种简洁、高效的网络请求处理方式。本文将深入探讨项目的背景、技术实现、应用场景及其独特之处,希望能为你的iOS开发工作带来新的启发。 项目简介 是一个专门为iOS开发者设计的网络库,它基于...

gitblog_00061的博客 347

Win10右键新建菜单丢了记事本?别慌!5分钟教你用注册表找回来(附权限设置避坑指南)

本文详细指导如何通过注册表编辑器恢复Win10右键新建菜单中丢失的记事本选项,包括重建键值结构、配置ShellNew项及设置权限等关键步骤。特别提供权限避坑指南,确保修改持久有效,帮助用户快速解决这一常见但困扰的问题。

weixin_31714129的博客 854

详解 Network.framework:iOS 网络开发的新基石

是 Apple 提供的一套面向连接级别(Connection Level)编程的现代化 API。创建和管理 TCP / UDP 连接加密连接(TLS)多路径传输(Multipath TCP)网络状态实时监控(如 Wi-Fi/蜂窝网络切换)更安全的连接(默认支持 TLS 验证)✅ 更安全(默认启用 TLS)✅ 更高效(异步、低功耗优化)✅ 支持多路径(Multipath TCP)✅ 易用的 Swift 风格 API✅ 适配未来(如 QUIC、HTTP/3)

侯仕奇的博客 2349

halcon 检测直线

图中后三个对象既是检测出的图像;

qq_59062726的博客 665

RK3588-NANOPC-T6移植ubuntu+xenomai内核

更具网址下载相应的内核。导入到开发板并执行内核。

qq_42007446的博客 572

IOS NetworkExtension 框架使用笔记

从iOS 8开始,苹果开放了新的框架 NetworkExtension ,该框架提供了配置和控制VPN支持的接口,和wifi热点相关的接口。 使用的步骤如下:1.向苹果发送邮件申请使用NetworkExtension框架框架申请链接:https://developer.apple.com/contact/network-extension 开发者账号登录,填写申请表说明app是要用来干嘛的,然后

李小冰的博客 2万+

Autosar Davinci Configurator新建工程以及导入DBC和CDD

Autosar Davinci Configurator新建工程前言一、Autosar Davinci Configurator新建工程二、Autosar Davinci Configurator导入DBC和CDD1.引入库2.读入数据总结 前言 如何用 DavinciCFG 新建工程,以及导入DBC和CDD文件。 一、Autosar Davinci Configurator新建工程 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、Autosar Davinc

别再跑偏了的博客 1万+

iOS开发之CFNetwork框架使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33727510的博客 332

别再用MounRiver了!在VSCode里用PlatformIO搞定CH32V208开发(附完整配置流程)

本文详细介绍了如何在VSCode中使用PlatformIO进行CH32V208开发,替代传统的MounRiver Studio。通过完整的配置流程和优化技巧,开发者可以构建高效、现代化的RISC-V开发环境,显著提升编译速度和开发效率。

weixin_28711397的博客 533

中介效应、调节效应与交互效应:从概念辨析到统计建模全指南

在社会科学与数据分析研究中,理解变量之间的因果关系与条件性影响是核心任务之一。回归分析作为最基础的统计工具,常被用于探索自变量对因变量的作用机制,而中介效应与调节效应则分别回答了“如何影响”与“何时影响不同”的深层问题。中介效应通过路径分析拆解因果链条,揭示内部的传导机制;调节效应则借助交互项识别影响的边界条件。Bootstrap法已成为检验间接效应的主流手段,而简单斜率分析则让调节作用的模式更加直观。无论是用户研究、医学统计还是产品数据分析,掌握这些模型都能帮助研究者构建更具解释力的实证框架。本文基于大量

weixin_29051149的博客 330

iOS网络编程之CFNetwork

转 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议   一,CFNetwork 简介 首先来回顾下。在前文《[深入浅出Cocoa]iOS网络编程之Socket》中,提到iOS网络编程层次模型分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKitCore F

Yuan的博客 477

软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

当在Visual Studio中遇到软件崩溃且无法查看详细调用堆栈时,可以使用Windbg进行动态调试去分析定位问题。

dvlinker的技术专栏 1万+

[深入浅出Cocoa]iOS网络编程之CFNetwork

转载自:http://blog.youkuaiyun.com/kesalin/article/details/8801156 [深入浅出Cocoa]iOS网络编程之CFNetwork 罗朝辉 (http://blog.youkuaiyun.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议   一,CFNetwork 简介 首先来回顾下。在前文《

逢个场,作个戏 688

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【iOS开发-6】iOS框架以及手册的在线阅读和PDF版本的iOS Technology Overview下载

看一下官方文档,就可知:iOS框架就是iOS开发的整个技术,只不过apple把所以的技术都分类封装到不同的框架里面,便于需要的人调用。 当然,至于iOS框架从底层到顶层分为Core OS、Core Services、Media、Cocoa Touch四个层,可以简单理解成把那么多框架分成四个类而已。

小小的客栈 大大的江湖 1861

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ios开发中网络模块开发的几种常用方法

在iOS开发,有以下几种常用的网络请求工具: 苹果自带: NSURLConnection:用法简单,最古老最经典最直接的一种方案 NSURLSession:功能比NSURLConnection更加强大,苹果目前比较推荐使用这种技术【2013推出,iOS7开始出的技术】 CFNetwork:NSURL*的底层,纯C语言 第三方框架 ASIHttpRequest:外号“HTTP

大灰狼爱技术 389

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CFNetwork framework

iphone包含了很多框架和库,从底层的套接字到不同层次的封装,可以方便地给程序添加网络功能。 (1)BSD套接字。最底层的套接字,这是Unix网络开发常用的API。如果从其他系统移植程序,而程序用的是BSD套接字,那么网络部分可以继续使用这些API。 (2)CFNetwork framework 。CFNetwork 也是比较底层的, 是对BSD套接字的一个扩展 。它...

weixin_33949359的博客 101

iOS开发网络篇—简单介绍ASI框架的使用

iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用。 一、ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大。 ASI的实现基于底层的CFNetwork框架,因此运行效率很高。可惜作者早已停止更新,有一些潜在的BUG无人去解决 ASI的github地址 https://github.com/po...

weixin_33726318的博客 198

IPhone Objective-C HTTP代理那些破事

标题带有怨气,确实,苹果对开发者不友好,包括API设计和文档,都不是很友好。 设置HTTP代理,在一些优秀的开源或商业的httpClient库,应该是很容易的事,但不包括苹果CFNetwork 和URLSession 1、CFNetwrok  HTTP代理设置 首先你要分开CFHTTPMessageRef 和 CFReadStreamRef 这两个,对于HTTP的一些常规设置,有的需

缤纷冷泪的专栏 4275

IOS-使用Asyncsocket进行socket编程

iphone的标准推荐CFNetwork C库编程.但是编程比较烦躁。在其它OS往往用类来封装的对Socket函数的处理。比如MFC的CAsysncSocket.在iphone也有类似于开源项目.cocoa AsyncSocket库, 官方网站:http://code.google.com/p/cocoaasyncsocket/ 它用来简化CFnetwork的调用. 一.在项目引入ASync

dingyawei123的专栏 335
上一篇: AFN和ASI的区别
下一篇: URLConnection & URLSession
lin_transform
博客等级 码龄9年 3粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值