ios开发之网络编程

上周末本应早写这个网络和MapKit的。

由于周六朋友聚会,周日送一朋友回远方,吃吃喝喝的就忘掉了。

网络编程基本是移动互联这块中必须掌握的编程技巧。由于我买的的小柚子书上没有这块,

最近刚买的开发秘籍那本上的关于网络链接这块,太抽象了。

首先吐槽一下这本书,细节描述的还是不错的。但是不合适做入门~

然后在网络上搜索关于ios的网络编程基本就首页全是讲的同一篇文章,被转烂了。

找了半天没找到源文出处。

可以参考的一个地址:http://www.cocoachina.com/bbs/read.php?tid-31300.html

主要将了两部分:1.网络检测;2.简单的NSURLConnection链接以及设置代理。

问了下朋友,基本说现在都用

HTTP包装开源项目ASIHTTPRequest。

但这边我们还是从最原始的框架提供的API入手,后边我再去看下这个。

这边我就以最简单的例子来引入几个常用的API中的类。

[cpp] view
plain
copy

  1. //  
  2. //  NLViewController.m  
  3. //  NetWorkTest  
  4. //  
  5. //  Created by Nono on 12-5-16.  
  6. //  Copyright (c) 2012年 NonoWithLilith. All rights reserved.  
  7. //  
  8. #import "NLViewController.h"  
  9.   
  10. @interface NLViewController ()  
  11.   
  12. @end  
  13.   
  14. @implementation NLViewController  
  15. @synthesize label = _label;  
  16. @synthesize data = _data;  
  17. @synthesize connection = _connection;  
  18. - (void)dealloc{  
  19.     [self.label release];  
  20.     [self.data release];  
  21.     [super dealloc];  
  22. }  
  23. - (void)viewDidLoad  
  24. {  
  25.     [super viewDidLoad];  
  26.     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 10.0, 300.0, 400)];  
  27.     self.label = label;  
  28.     label.textAlignment = UITextAlignmentCenter;  
  29.     [label setNumberOfLines:0];  
  30.     label.lineBreakMode = UILineBreakModeWordWrap;   
  31.     self.label.text = @"正在在请求数据";  
  32.     [self.view addSubview:label];  
  33.     [label release];  
  34.     //step 1:请求地址  
  35.     NSString *urlString = @"http://www.google.com";  
  36.     NSURL *url = [NSURL URLWithString:urlString];  
  37.     //step 2:实例化一个request  
  38.     NSURLRequest *requrst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];  
  39.     //step 3:创建链接  
  40.     self.connection = [[NSURLConnection alloc] initWithRequest:requrst delegate:self];  
  41.     if ( self.connection) {  
  42.         NSLog(@"链接成功");  
  43.     }else {  
  44.         NSLog(@"链接失败");  
  45.     }  
  46.       
  47.     [url release];  
  48.     [urlString release];  
  49.     [requrst release];  
  50.     // Do any additional setup after loading the view, typically from a nib.  
  51. }  
  52.   
  53. - (void)viewDidUnload  
  54. {  
  55.     self.label = nil;  
  56.     self.data = nil;  
  57.     [super viewDidUnload];  
  58.     // Release any retained subviews of the main view.  
  59. }  
  60.   
  61. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  62. {  
  63.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  64. }  
  65.   
  66. #pragma mark-  
  67. #pragma NSUrlConnectionDelegate methods  
  68. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  
  69. {  
  70.     //接受一个服务端回话,再次一般初始化接受数据的对象  
  71.      
  72.     NSLog(@"返回数据类型:%@",[response textEncodingName]);   
  73.     NSMutableData *d = [[NSMutableData alloc] init];  
  74.      self.data = d;  
  75.     [d release];  
  76. }  
  77.   
  78. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
  79. {  
  80.     //接受返回数据,这个方法可能会被调用多次,因此将多次返回数据加起来  
  81.       
  82.     NSUInteger datalength = [data length];  
  83.     NSLog(@"返回数据量:%d",datalength);  
  84.     [self.data appendData:data];  
  85. }  
  86.   
  87. - (void)connectionDidFinishLoading:(NSURLConnection *)connection  
  88. {  
  89.     //连接结束  
  90.       
  91.     NSLog(@"%d:",[self.data length]);  
  92.     NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);  
  93.     NSString *mystr = [[NSString alloc] initWithData:_data encoding:enc];  
  94.    // string i  
  95.     NSLog(@"最后的结果:%@",mystr);  
  96.     self.label.text = mystr;  
  97.     [mystr release];  
  98.     [self.connection release];  
  99. }  
  100.   
  101. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  
  102. {  
  103.     //链接错误  
  104. }  
  105.   
  106. @end  

简单说下:

1.最简单的网络链接,一个url,一个request,一个connection以及一个response返回。默认的是get请求。

2.data转码问题,这个一开始有点纠结。即,在最后我们要把NSData转化成NSString时候需要一个转码格式,一开始我习惯性的用了UTF-8,

然后发现转化后String 是Null,于是去打印了下请求返回的一些参数,显示的是GB2312~。

然后NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSString *mystr = [[NSString alloc] initWithData:_data encoding:enc];

就ok了。

4.代理方法的实现,基本以上几个都需要实现吧。还有更多可选方法可以根据自身需要去选择性实现。

但是,显然,以上这个小例子真的太基础,可能根本不能满足我们的需求,至少得有个post的列子。

然后我看了几个勉强有网络链接demo,写的比较随意化,最后在 ios  developer 中找到一个官方版的比较文正规范的例子。

http://developer.apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009245

这边也提下,官网的例子很多,也都比较规范化,我们新入门者可以多多参考。

基本上面一个例子就对sdk自带的网络api学习就算完整了。

在加上上面那个提及到的网络检测,至少,现在我们对网络这块有个大致了解。

如果想要自己考虑到上传,下载,像java自己去封装一个网络库。那就多研究下开源库。

据说上面提到那个库很强大,很简洁,也很容易入门

我这边只是简单介绍了网络开发这块几个入门点和入门资料。

有不足忘指出。

还有,哪位大神能帮我比较详细的解答下这个问题

http://www.cocoachina.com/bbs/read.php?tid=103569

时间: 2024-09-14 18:25:07

ios开发之网络编程的相关文章

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载

前言:iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载是在前篇iOS开发之网络编程--使用NSURLConnection实现大文件下载的基础上进行    断点续传的设置.关于iOS开发之网络编程--使用NSURLConnection实现大文件下载的细节这里当然就不会再累述的啦.   断点续传的原理:    每次在向服务器请求下载数据的同时,要告诉服务器从整个下载文件的数据流的某个还未下载的位置开始下载,然后服务器就返回从那个位置开始的数据流.    图片示意图:

iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文件下载(离线断点续传下载)>,都遗留了一个细节未处理的问题,那就是在离线断点下载的过程中,当应用程序重新启动之后,进度条的进度值默认没有设置为之前已经下载的进度,根据基本公式"当前进度值 = 已经下载的数据长度 ÷ 最终下载完的数据总长度",已经下载的数据长度可以由沙盒中已经下载的那

iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDataDelegate一起搭配实现文件上传功能.另外,下面使用的文件上传思路是和NSURLConnection中本人之前的随笔<iOS开发之网络编程--使用NSURLConnection实现文件上传>提到的上传思路是一样的,都是要将请求信息拼接起来,然后传入到请求里进行上传.这个拼接过程是必要的,但

iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)

前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续传. 关于NSURLSessionDownloadTask的知识,可以请读者阅读本人的前篇:<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>. 另外呢,因为NSURLSessionDownloadTask和NSURLSessionDataTask分别都是NS

iOS开发之网络编程--使用NSURLConnection实现大文件下载

主要思路(实现下载数据分段写入缓存中) 1.使用NSURLConnectionDataDelegate以及代理方法. 2.在成功获取响应的代理方法中,获得沙盒全路径,并在该路径下创建空文件和文件句柄. 3.在获取data的代理方法中,先设置句柄在沙盒全路径文件末尾,然后通过句柄写入data数据. 4.在文件下载完的代理方法中,关闭句柄同时设置句柄引用为nil释放句柄和指针. 使用句柄的思路图(红色的箭头表示句柄,灰色的箭头表示移动的路径): 代码关键词: 类:NSFileHandle的方法 1.

IOS开发之网络编程--文件压缩和解压缩

前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个第三方框架代码文件夹是SSZipArchive,使用cocoapods搜索也是搜索SSZipArchive.但是如果你在github上直接搜索ZipArchive,搜到点赞数最多,维护频繁的ZipArchive库,然后下载代码,其实就是这个SSZipArchive. 第三方框架github网址:ht

iOS开发之网络编程--6、NSURLSessionConfiguration笔记

NSURLSessionConfiguration对象用于初始化NSURLSession对象. 展开请求级别中与NSMutableURLRequest相关的可供选择的方案,我们可以看到NSURLSessionConfiguration对于会话如何产生请求,提供了相当多的控制和灵活性.从网络访问性能,到cookie,安全性,缓存策略,自定义协议,启动事件设置,以及用于移动设备优化的几个新属性,你会发现你一直在寻找的,正是NSURLSessionConfiguration. 会话在初始化时复制它们的

iOS开发之网络编程--中文转码

前言: 在GET请求或者是POST请求,请求上传的参数如果含有中文,可能会导致请求失败. 所以要对存储了URL地址的NSString对象进行中文转码,然后将这个NSString对象传递给URL.   正文: 首先是本地服务器的账户和密码先曝光一下下哦,我有JavaWeb的简易程序,用Eclipse可以运行,嘻嘻,下面是JavaWeb的程序源码和效果截图:  好,回到客户端,也就是我们的IOS前端,来看看我写的网络请求: 下面是GET请求,GET请求要讲URL的NSString对象进行中文转码:

iOS开发之网络编程--获取文件的MIMEType

前言:有时候我们需要获取文件的MIMEType的信息,下面就介绍关于获取MIMEType的方法.   1.直接百度搜索关键字"MIMEType",你会找到,然后查吧: 2.用代码获取文件的MIMEType信息: #import "GetMIMEType.h" #import <MobileCoreServices/MobileCoreServices.h> @implementation GetMIMEType #pragma mark - 类方法 +