0.AFN框架基本使用

  • 0.1 AFN内部结构
  1. AFN结构体
  2. - NSURLConnection
  3. + AFURLConnectionOperation(已经被废弃)
  4. + AFHTTPRequestOperation(已经被废弃)
  5. + AFHTTPRequestOperationManager(封装了常用的 HTTP 方法)(已经被废弃)
  6. * 属性
  7. * baseURL :AFN建议开发者针对 AFHTTPRequestOperationManager 自定义个一个单例子类,设置 baseURL, 所有的网络访问,都只使用相对路径即可
  8. * requestSerializer :请求数据格式/默认是二进制的 HTTP
  9. * responseSerializer :响应的数据格式/默认是 JSON 格式
  10. * operationQueue
  11. * reachabilityManager :网络连接管理器
  12. * 方法
  13. * manager :方便创建管理器的类方法
  14. * HTTPRequestOperationWithRequest :在访问服务器时,如果要告诉服务器一些附加信息,都需要在 Request 中设置
  15. * GET
  16. * POST
  17. - NSURLSession
  18. + AFURLSessionManager
  19. + AFHTTPSessionManager(封装了常用的 HTTP 方法)
  20. * GET
  21. * POST
  22. * UIKit + AFNetworking 分类
  23. * NSProgress :利用KVO
  24. - 半自动的序列化&反序列化的功能
  25. + AFURLRequestSerialization :请求的数据格式/默认是二进制的
  26. + AFURLResponseSerialization :响应的数据格式/默认是JSON格式
  27. - 附加功能
  28. + 安全策略
  29. * HTTPS
  30. * AFSecurityPolicy
  31. + 网络检测
  32. * 对苹果的网络连接检测做了一个封装
  33. * AFNetworkReachabilityManager
  34. 建议:
  35. 可以学习下AFN UIKit 做了一些分类, 对自己能力提升是非常有帮助的
  • 11.2 AFN的基本使用

(1)发送POST请求的方式

  1. -(void)post
  2. {
  3. //1.创建会话管理者
  4. //AFHTTPSessionManager内部是基于NSURLSession实现的
  5. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  6. //2.创建参数
  7. NSDictionary *dict = @{
  8. @"username":@"520it",
  9. @"pwd":@"520it",
  10. };
  11. //3.发送POST请求
  12. /*
  13. http://120.25.226.186:32812/login?username=ee&pwd=ee&type=JSON
  14. 第一个参数:NSString类型的请求路径,AFN内部会自动将该路径包装为一个url并创建请求对象
  15. 第二个参数:请求参数,以字典的方式传递,AFN内部会判断当前是POST请求还是GET请求,以选择直接拼接还是转换为NSData放到请求体中传递
  16. 第三个参数:进度回调 此处为nil
  17. 第四个参数:请求成功之后回调Block
  18. 第五个参数:请求失败回调Block
  19. */
  20. [manager POST:@"http://120.25.226.186:32812/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  21. //注意:responseObject:请求成功返回的响应结果(AFN内部已经把响应体转换为OC对象,通常是字典或数组)
  22. NSLog(@"请求成功---%@",responseObject);
  23. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  24. NSLog(@"请求失败---%@",error);
  25. }];
  26. }

(2)使用AFN下载文件

  1. -(void)download
  2. {
  3. //1.创建会话管理者
  4. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  5. //2.创建请求对象
  6. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_13.png"]];
  7. //3.创建下载Task
  8. /*
  9. 第一个参数:请求对象
  10. 第二个参数:进度回调
  11. downloadProgress.completedUnitCount :已经下载的数据
  12. downloadProgress.totalUnitCount:数据的总大小
  13. 第三个参数:destination回调,该block需要返回值(NSURL类型),告诉系统应该把文件剪切到什么地方
  14. targetPath:文件的临时保存路径
  15. response:响应头信息
  16. 第四个参数:completionHandler请求完成后回调
  17. response:响应头信息
  18. filePath:文件的保存路径,即destination回调的返回值
  19. error:错误信息
  20. */
  21. NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
  22. NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
  23. } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
  24. NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
  25. NSLog(@"%@\n%@",targetPath,fullPath);
  26. return [NSURL fileURLWithPath:fullPath];
  27. } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
  28. NSLog(@"%@",filePath);
  29. }];
  30. //4.执行Task
  31. [downloadTask resume];
  32. }

1.AFN使用技巧

  1. 1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具类。
  2. 2.这样做的优点是以后如果修改了底层依赖的框架,那么我们修改这个工具类就可以了,而不用再一个一个的去修改。
  3. 3.该工具类一般提供一个单例方法,在该方法中会设置一个基本的请求路径。
  4. 4.该方法通常还会提供对GETPOST请求的封装。
  5. 5.在外面的时候通过该工具类来发送请求
  6. 6.单例方法:
  7. + (instancetype)shareNetworkTools
  8. {
  9. static XMGNetworkTools *instance;
  10. static dispatch_once_t onceToken;
  11. dispatch_once(&onceToken, ^{
  12. // 注意: BaseURL中一定要以/结尾
  13. instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://120.25.226.186:32812/"]];
  14. });
  15. return instance;
  16. }

2.AFN文件上传

  1. 1.文件上传拼接数据的第一种方式
  2. [formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];
  3. 2.文件上传拼接数据的第二种方式
  4. [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];
  5. 3.文件上传拼接数据的第三种方式
  6. [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
  7. 4.【注】在资料中已经提供了一个用于文件上传的分类。
  8. /*文件上传相关的代码如下*/
  9. -(void)upload1
  10. {
  11. //1.创建会话管理者
  12. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  13. //2.处理参数(非文件参数)
  14. NSDictionary *dict = @{
  15. @"username":@"123"
  16. };
  17. //3.发送请求上传文件
  18. /*
  19. 第一个参数:请求路径(NSString类型)
  20. 第二个参数:非文件参数,以字典的方式传递
  21. 第三个参数:constructingBodyWithBlock 在该回调中拼接文件参数
  22. 第四个参数:progress 进度回调
  23. uploadProgress.completedUnitCount:已经上传的数据大小
  24. uploadProgress.totalUnitCount:数据的总大小
  25. 第五个参数:success 请求成功的回调
  26. task:上传Task
  27. responseObject:服务器返回的响应体信息(已经以JSON的方式转换为OC对象)
  28. 第六个参数:failure 请求失败的回调
  29. task:上传Task
  30. error:错误信息
  31. */
  32. [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  33. UIImage *image = [UIImage imageNamed:@"Snip20160117_1"];
  34. NSData *imageData = UIImagePNGRepresentation(image);
  35. //在该block中拼接要上传的文件参数
  36. /*
  37. 第一个参数:要上传的文件二进制数据
  38. 第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的(通常会在接口文档中提供)
  39. 第三个参数:该文件上传到服务后以什么名称保存
  40. 第四个参数:该文件的MIMeType类型
  41. */
  42. [formData appendPartWithFileData:imageData name:@"file" fileName:@"123.png" mimeType:@"image/png"];
  43. } progress:^(NSProgress * _Nonnull uploadProgress) {
  44. NSLog(@"%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
  45. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  46. NSLog(@"请求成功----%@",responseObject);
  47. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  48. NSLog(@"请求失败----%@",error);
  49. }];
  50. }
  51. -(void)upload2
  52. {
  53. //1.创建会话管理者
  54. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  55. //2.处理参数(非文件参数)
  56. NSDictionary *dict = @{
  57. @"username":@"123"
  58. };
  59. //3.发送请求上传文件
  60. /*
  61. 第一个参数:请求路径(NSString类型)
  62. 第二个参数:非文件参数,以字典的方式传递
  63. 第三个参数:constructingBodyWithBlock 在该回调中拼接文件参数
  64. 第四个参数:progress 进度回调
  65. uploadProgress.completedUnitCount:已经上传的数据大小
  66. uploadProgress.totalUnitCount:数据的总大小
  67. 第五个参数:success 请求成功的回调
  68. task:上传Task
  69. responseObject:服务器返回的响应体信息(已经以JSON的方式转换为OC对象)
  70. 第六个参数:failure 请求失败的回调
  71. task:上传Task
  72. error:错误信息
  73. */
  74. [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  75. NSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/文顶顶/Desktop/Snip20160117_1.png"];
  76. //在该block中拼接要上传的文件参数
  77. //第一种拼接方法
  78. /*
  79. 第一个参数:要上传的文件的URL路径
  80. 第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的(通常会在接口文档中提供)
  81. 第三个参数:该文件上传到服务后以什么名称保存
  82. 第四个参数:该文件的MIMeType类型
  83. 第五个参数:错误信息,传地址
  84. */
  85. //[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"1234.png" mimeType:@"image/png" error:nil];
  86. //第二种拼接方法:简写方法
  87. /*
  88. 第一个参数:要上传的文件的URL路径
  89. 第二个参数:文件参数对应的参数名称,此处为file
  90. 第三个参数:错误信息
  91. 说明:AFN内部自动获得路径URL地址的最后一个节点作为文件的名称,内部调用C语言的API获得文件的类型
  92. */
  93. [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
  94. } progress:^(NSProgress * _Nonnull uploadProgress) {
  95. NSLog(@"%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
  96. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  97. NSLog(@"请求成功----%@",responseObject);
  98. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  99. NSLog(@"请求失败----%@",error);
  100. }];
  101. }

3.使用AFN进行序列化处理

  1. /*
  2. 1.AFN它内部默认把服务器响应的数据当做json来进行解析,所以如果服务器返回给我的不是JSON数据那么请求报错,这个时候需要设置AFN对响应信息的解析方式。AFN提供了三种解析响应信息的方式,分别是:
  3. 1)AFXMLParserResponseSerializer----XML
  4. 2) AFHTTPResponseSerializer---------默认二进制响应数据
  5. 3)AFJSONResponseSerializer---------JSON
  6. 2.还有一种情况就是服务器返回给我们的数据格式不太一致(开发者工具Content-Type:text/xml),那么这种情况也有可能请求不成功。解决方法:
  7. 1) 直接在源代码中修改,添加相应的Content-Type
  8. 2) 拿到这个属性,添加到它的集合中
  9. 3.相关代码
  10. -(void)srializer
  11. {
  12. //1.创建请求管理者,内部基于NSURLSession
  13. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  14. /* 知识点1:设置AFN采用什么样的方式来解析服务器返回的数据*/
  15. //如果返回的是XML,那么告诉AFN,响应的时候使用XML的方式解析
  16. manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  17. //如果返回的就是二进制数据,那么采用默认二进制的方式来解析数据
  18. //manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  19. //采用JSON的方式来解析数据
  20. //manager.responseSerializer = [AFJSONResponseSerializer serializer];
  21. /*知识点2 告诉AFN,再序列化服务器返回的数据的时候,支持此种类型
  22. [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"];
  23. //2.把所有的请求参数通过字典的方式来装载,GET方法内部会自动把所有的键值对取出以&符号拼接并最后用?符号连接在请求路径后面
  24. NSDictionary *dict = @{
  25. @"username":@"223",
  26. @"pwd":@"ewr",
  27. @"type":@"XML"
  28. };
  29. //3.发送GET请求
  30. [manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
  31. //4.请求成功的回调block
  32. NSLog(@"%@",[responseObject class]);
  33. } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
  34. //5.请求失败的回调,可以打印error的值查看错误信息
  35. NSLog(@"%@",error);
  36. }];
  37. }

4.使用AFN来检测网络状态

  1. /*
  2. 说明:可以使用AFN框架中的AFNetworkReachabilityManager来监听网络状态的改变,也可以利用苹果提供的Reachability来监听。建议在开发中直接使用AFN框架处理。
  3. */
  4. //使用AFN框架来检测网络状态的改变
  5. -(void)AFNReachability
  6. {
  7. //1.创建网络监听管理者
  8. AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
  9. //2.监听网络状态的改变
  10. /*
  11. AFNetworkReachabilityStatusUnknown = 未知
  12. AFNetworkReachabilityStatusNotReachable = 没有网络
  13. AFNetworkReachabilityStatusReachableViaWWAN = 3G
  14. AFNetworkReachabilityStatusReachableViaWiFi = WIFI
  15. */
  16. [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  17. switch (status) {
  18. case AFNetworkReachabilityStatusUnknown:
  19. NSLog(@"未知");
  20. break;
  21. case AFNetworkReachabilityStatusNotReachable:
  22. NSLog(@"没有网络");
  23. break;
  24. case AFNetworkReachabilityStatusReachableViaWWAN:
  25. NSLog(@"3G");
  26. break;
  27. case AFNetworkReachabilityStatusReachableViaWiFi:
  28. NSLog(@"WIFI");
  29. break;
  30. default:
  31. break;
  32. }
  33. }];
  34. //3.开始监听
  35. [manager startMonitoring];
  36. }
  37. ------------------------------------------------------------
  38. //使用苹果提供的Reachability来检测网络状态,如果要持续监听网络状态的概念,需要结合通知一起使用。
  39. //提供下载地址:https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip
  40. -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
  41. {
  42. //1.注册一个通知
  43. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChange) name:kReachabilityChangedNotification object:nil];
  44. //2.拿到一个对象,然后调用开始监听方法
  45. Reachability *r = [Reachability reachabilityForInternetConnection];
  46. [r startNotifier];
  47. //持有该对象,不要让该对象释放掉
  48. self.r = r;
  49. }
  50. //当控制器释放的时候,移除通知的监听
  51. -(void)dealloc
  52. {
  53. [[NSNotificationCenter defaultCenter] removeObserver:self];
  54. }
  55. -(void)networkChange
  56. {
  57. //获取当前网络的状态
  58. if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN)
  59. {
  60. NSLog(@"当前网络状态为3G");
  61. return;
  62. }
  63. if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == ReachableViaWiFi)
  64. {
  65. NSLog(@"当前网络状态为wifi");
  66. return;
  67. }
  68. NSLog(@"当前没有网络");
  69. }

5.数据安全

  1. 01 攻城利器:Charles(公司中一般都使用该工具来抓包,并做网络测试)
  2. 注意:Charles在使用中的乱码问题,可以显示包内容,然后打开info.plist文件,找到java目录下面的VMOptions,在后面添加一项:-Dfile.encoding=UTF-8
  3. 02 MD5消息摘要算法是不可逆的。
  4. 03 数据加密的方式和规范一般公司会有具体的规定,不必多花时间。

6.HTTPS的基本使用

  1. 1.https简单说明
  2. HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
  3. HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。
  4. https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTPTCP之间)。
  5. 2.HTTPSHTTP的区别主要为以下四点:
  6. 一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
  7. 二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
  8. 三、httphttps使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  9. 四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
  10. 3.简单说明
  11. 1HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的保护。
  12. 2HTTPS的信任继承基于预先安装在浏览器中的证书颁发机构(如VeriSignMicrosoft等)(意即“我信任证书颁发机构告诉我应该信任的”)。
  13. 3)因此,一个到某网站的HTTPS连接可被信任,如果服务器搭建自己的https 也就是说采用自认证的方式来建立https信道,这样一般在客户端是不被信任的。
  14. 4)所以我们一般在浏览器访问一些https站点的时候会有一个提示,问你是否继续。
  15. 4.对开发的影响。
  16. 4.1 如果是自己使用NSURLSession来封装网络请求,涉及代码如下。
  17. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  18. {
  19. NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
  20. NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  21. NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
  22. }];
  23. [task resume];
  24. }
  25. /*
  26. 只要请求的地址是HTTPS的, 就会调用这个代理方法
  27. 我们需要在该方法中告诉系统, 是否信任服务器返回的证书
  28. Challenge: 挑战 质问 (包含了受保护的区域)
  29. protectionSpace : 受保护区域
  30. NSURLAuthenticationMethodServerTrust : 证书的类型是 服务器信任
  31. */
  32. - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
  33. {
  34. // NSLog(@"didReceiveChallenge %@", challenge.protectionSpace);
  35. NSLog(@"调用了最外层");
  36. // 1.判断服务器返回的证书类型, 是否是服务器信任
  37. if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
  38. NSLog(@"调用了里面这一层是服务器信任的证书");
  39. /*
  40. NSURLSessionAuthChallengeUseCredential = 0, 使用证书
  41. NSURLSessionAuthChallengePerformDefaultHandling = 1, 忽略证书(默认的处理方式)
  42. NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, 忽略书证, 并取消这次请求
  43. NSURLSessionAuthChallengeRejectProtectionSpace = 3, 拒绝当前这一次, 下一次再询问
  44. */
  45. // NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
  46. NSURLCredential *card = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
  47. completionHandler(NSURLSessionAuthChallengeUseCredential , card);
  48. }
  49. }
  50. 4.2 如果是使用AFN框架,那么我们不需要做任何额外的操作,AFN内部已经做了处理。

7 WebView的基本使用

  1. 1 概念性知识
  2. 01 webView是有缺点的,会导致内存泄露,而且这个问题是它系统本身的问题。
  3. 02 手机上面的safai其实就是用webView来实现的
  4. 03 现在的开发并不完全是原生的开发,而更加倾向于原生+Html5的方式
  5. 04 webViewOC代码和html代码之间进行交互的桥梁
  6. 2 代码相关
  7. /*A*网页操控相关方法**/
  8. [self.webView goBack]; 回退
  9. [self.webView goForward]; 前进
  10. [self.webView reload]; 刷新
  11. //设置是否能够前进和回退
  12. self.goBackBtn.enabled = webView.canGoBack;
  13. self.fowardBtn.enabled = webView.canGoForward;
  14. /*B*常用的属性设置**/
  15. self.webView.scalesPageToFit = YES; 设置网页自动适应
  16. self.webView.dataDetectorTypes = UIDataDetectorTypeAll; 设置检测网页中的格式类型,all表示检测所有类型包括超链接、电话号码、地址等。
  17. self.webView.scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
  18. /*C*相关代理方法**/
  19. //每当将加载请求的时候调用该方法,返回YES 表示加载该请求,返回NO 表示不加载该请求
  20. //可以在该方法中拦截请求
  21. -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
  22. {
  23. return ![request.URL.absoluteString containsString:@"dushu"];
  24. }
  25. //开始加载网页,不仅监听我们指定的请求,还会监听内部发送的请求
  26. -(void)webViewDidStartLoad:(UIWebView *)webView
  27. //网页加载完毕之后会调用该方法
  28. -(void)webViewDidFinishLoad:(UIWebView *)webView
  29. //网页加载失败调用该方法
  30. -(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
  31. /*D*其它知识点-加载本地资源**/
  32. NSURL *url = [[NSBundle mainBundle] URLForResource:@"text.html" withExtension:nil];
  33. [self.webView loadRequest:[NSURLRequest requestWithURL:url]];

8 HTML

  1. 1.Html决定网页的内容,css决定网页的样式,js决定网页的事件
  2. 2.html学习网站:http://www.w3school.com.cn

9 OC和JS代码的互调

  1. 01 OC调用JS的代码
  2. NSString *str = [self.webView stringByEvaluatingJavaScriptFromString:@"sum()"];
  3. 02 JS怎么调用OC的说明
  4. 新的需求:点击按钮的时候拨打电话
  5. 但是我在点击按钮的时候,用户是不知道的,我们怎么能够知道用户点击了网页上面的一个按钮,只能通过一个技巧,那就是自己搞一个特定的协议头比如说xmg://,当我拦截到你的网络请求的时候,只需要判断一下当前的协议头是不是这个就能判断你现在是否是JS调用。
  6. OC里面有通过字符串生成SEL类型的方法,所以当拿到数据之后做下面的事情
  7. 1)截取方法的名称
  8. 2)将截取出来的字符串转换为SEL
  9. 3)利用performSelect方法来调用SEL
  10. 03 涉及到的相关方法
  11. [@"abc" hasPrefix:@"A"] //判断字符串是否以一个固定的字符开头,这里为A
  12. //截串操作
  13. - (NSString *)substringFromIndex:(NSUInteger)from;
  14. //切割字符串,返回一个数组
  15. - (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
  16. //替换操作
  17. - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
  18. //把string包装成SEL
  19. SEL selector = NSSelectorFromString(sel);
  20. 04 如何屏蔽警告
  21. #pragma clang diagnostic push
  22. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  23. //-Warc-performSelector-leaks为唯一的警告标识
  24. [self performSelector:selector withObject:nil];
  25. #pragma clang diagnostic pop

10 NSInvocation的基本使用

  1. //封装invacation可以调用多个参数的方法
  2. -(void)invacation
  3. {
  4. //1.创建一个MethodSignature,签名中保存了方法的名称,参数和返回值
  5. //这个方法属于谁,那么就用谁来进行创建
  6. //注意:签名一般是用来设置参数和获得返回值的,和方法的调用没有太大的关系
  7. NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(callWithNumber:andContext:withStatus:)];
  8. /*注意不要写错了方法名称
  9. // NSMethodSignature *signature = [ViewController methodSignatureForSelector:@selector(call)];
  10. */
  11. //2.通过MethodSignature来创建一个NSInvocation
  12. //NSInvocation中保存了方法所属于的对象|方法名称|参数|返回值等等
  13. NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
  14. /*2.1 设置invocation,来调用方法*/
  15. invocation.target = self;
  16. // invocation.selector = @selector(call);
  17. // invocation.selector = @selector(callWithNumber:);
  18. // invocation.selector = @selector(callWithNumber:andContext:);
  19. invocation.selector = @selector(callWithNumber:andContext:withStatus:);
  20. NSString *number = @"10086";
  21. NSString *context = @"下课了";
  22. NSString *status = @"睡觉的时候";
  23. //注意:
  24. //1.自定义的参数索引从2开始,0和1已经被self and _cmd占用了
  25. //2.方法签名中保存的方法名称必须和调用的名称一致
  26. [invocation setArgument:&number atIndex:2];
  27. [invocation setArgument:&context atIndex:3];
  28. [invocation setArgument:&status atIndex:4];
  29. /*3.调用invok方法来执行*/
  30. [invocation invoke];
  31. }

11 异常处理

  1. 01 一般处理方式:
  2. a.app异常闪退,那么捕获crash信息,并记录在本地沙盒中。
  3. b.当下次用户重新打开app的时候,检查沙盒中是否保存有上次捕获到的crash信息。
  4. c.如果有那么利用专门的接口发送给服务器,以求在后期版本中修复。
  5. 02 如何抛出异常
  6. //抛出异常的两种方式
  7. // @throw [NSException exceptionWithName:@"好大一个bug" reason:@"异常原因:我也不知道" userInfo:nil];
  8. //方式二
  9. NSString *info = [NSString stringWithFormat:@"%@方法找不到",NSStringFromSelector(aSelector)];
  10. //下面这种方法是自动抛出的
  11. [NSException raise:@"这是一个异常" format:info,nil];
  12. 03 如何捕获异常
  13. NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);
  14. void UncaughtExceptionHandler(NSException *exception) {
  15. NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息
  16. NSString *reason = [exception reason];//非常重要,就是崩溃的原因
  17. NSString *name = [exception name];//异常类型
  18. NSString *errorMsg = [NSString stringWithFormat:@"当前调用栈的信息:%@\nCrash的原因:%@\n异常类型:%@\n",arr,reason,name];
  19. //把该信息保存到本地沙盒,下次回传给服务器。
  20. }

补充

  1. 关于JS相关的学习框架:WebViewJavascriptBridge

12.Cocoapods的安装

  1. 1.先升级Gem
  2. sudo gem update --system
  3. 2.切换cocoapods的数据源
  4. 【先删除,再添加,查看】
  5. gem sources --remove https://rubygems.org/
  6. gem sources -a https://ruby.taobao.org/
  7. gem sources -l
  8. 3.安装cocoapods
  9. sudo gem install cocoapods
  10. 或者(如10.11系统)sudo gem install -n /usr/local/bin cocoapods
  11. 4.Podspec文件托管地址从github切换到国内的oschina
  12. 【先删除,再添加,再更新】
  13. pod repo remove master
  14. pod repo add master https://gitcafe.com/akuandev/Specs.git
  15. pod repo update
  16. 5.设置pod仓库
  17. pod setup
  18. 6.测试
  19. 【如果有版本号,则说明已经安装成功】
  20. pod --version
  21. 7.利用cocoapods来安装第三方框架
  22. 01 进入要安装框架的项目的.xcodeproj同级文件夹
  23. 02 在该文件夹中新建一个文件podfile
  24. 03 在文件中告诉cocoapods需要安装的框架信息
  25. a.该框架支持的平台
  26. b.适用的iOS版本
  27. c.框架的名称
  28. d.框架的版本
  29. 8.安装
  30. pod install --no-repo-update
  31. pod update --no-repo-update
  32. 9.说明
  33. platform :ios, '8.0' 用来设置所有第三方库所支持的iOS最低版本
  34. pod 'SDWebImage','~>2.6' 设置框架的名称和版本号
  35. 版本号的规则:
  36. '>1.0' 可以安装任何高于1.0的版本
  37. '>=1.0' 可以安装任何高于或等于1.0的版本
  38. '<1.0' 任何低于1.0的版本
  39. '<=1.0' 任何低于或等于1.0的版本
  40. '~>0.1' 任何高于或等于0.1的版本,但是不包含高于1.0的版本
  41. '~>0' 任何版本,相当于不指定版本,默认采用最新版本号
  42. 10.使用pod install命令安装框架后的大致过程:
  43. 01 分析依赖:该步骤会分析Podfile,查看不同类库之间的依赖情况。如果有多个类库依赖于同一个类库,但是依赖于不同的版本,那么cocoaPods会自动设置一个兼容的版本。
  44. 02 下载依赖:根据分析依赖的结果,下载指定版本的类库到本地项目中。
  45. 03 生成Pods项目:创建一个Pods项目专门用来编译和管理第三方框架,CocoaPods会将所需的框架,库等内容添加到项目中,并且进行相应的配置。
  46. 04 整合Pods项目:将Pods和项目整合到一个工作空间中,并且设置文件链接。
文/RoYu(简书作者)
原文链接:http://www.jianshu.com/p/944ead5924a0
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

AFN框架基本使用的更多相关文章

  1. Swift -- 对AFN框架的封装

    Swift -- 对AFN框架的封装 一.封装AFN的目的 简单的说: 解耦 日常工作中,我们一般都不会去直接使用AFNetWorking来直接发送网络请求,因为耦合性太强,假设有多个控制器都使用AF ...

  2. AFN框架

    0.AFN框架基本使用 0.1 AFN内部结构 AFN结构体 - NSURLConnection + AFURLConnectionOperation(已经被废弃) + AFHTTPRequestOp ...

  3. AFN框架内部结构

    AFN结构体 - NSURLConnection + AFURLConnectionOperation + AFHTTPRequestOperation + AFHTTPRequestOperatio ...

  4. [iOS 多线程 & 网络 - 4.0] - AFN框架简单使用

    A.AFN基本知识 1.概念 AFNetworking 是对NSURLConnection的封装 运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单 AFN支持ARC     B. ...

  5. ios开发网络学习AFN框架的使用一:get和post请求

    #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...

  6. iOS开发中的错误整理,AFN框架和MJRefresh框架搭配应该注意的问题

    注意问题一:每次请求之前先将之前的请求取消                            注意问题二:请求成功之后要判断footer或者header的显示状态 首次下拉刷新,要判断是否已经全部 ...

  7. AFN解析器里的坑

    AFN框架是用来用来发送网络请求的,它的好处是可以自动给你解析JSON数据,还可以发送带参数的请求AFN框架还可以监测当前的网络状态,还支持HTTPS请求,分别对用的类为AFNetworkReacha ...

  8. [iOS AFNetworking框架实现HTTP请求、多文件图片上传下载]

    简单的JSON的HTTP传输就不说了,看一个简单的DEMO吧. 主要明白parameters是所填参数,类型是字典型.我把这部分代码封装起来了,以便多次调用.也许写在一起更清楚点. #pragma m ...

  9. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

随机推荐

  1. Snort - manual 笔记(三)

    1.6 Reading pcap files Snort 不仅可以监听interface, 还可以读取和分析已经捕获的数据包. 1.6.1 Command line arguments 下面的命令都可 ...

  2. 使用NPOI将多张图片导入execl

    protected void btn_Export_Click(object sender, EventArgs e) { List<BNXX_SJXJ_XJSJ> list = View ...

  3. Sharepoint增加修改密码功能

    Sharepoint中没有自带的修改密码的功能. 如果使用的是AD验证,修改密码,只要修改域帐号的用户名密码就可以了.以下代码可以修改本机密码和域帐号密码. 做法是,添加一个webpart,做一个页面 ...

  4. SharePoint 2010 External List Paging – Server Side

    http://lightningtools.com/bcs/sharepoint-2010-external-list-paging-server-side/ When you are using a ...

  5. iOS开发笔记2:单例模式(singleton)

    每一个app有且仅有一个UIApplication,类似UIApplication“ [UIApplication sharedApplication]”这种一个类有且仅有唯一实例的设计即单例模式. ...

  6. iOSQuartz2D-01-核心要点

    简介 作用 绘制 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件(通常为内部结构较复杂的控件) UIKit中的绝大部分控 ...

  7. iOS开发网络篇—Reachability检测网络状态

    前言:当应用程序需要访问网络的时候,它首先应该检查设备的网络状态,确认设备的网络环境及连接情况,并针对这些情况提醒用户做出相应的处理.最好能监听设备的网络状态的改变,当设备网络状态连接.断开时,程序也 ...

  8. linq扩展之动态排序

    前两天看QQ群里面,一位朋友问的问题,说在linq中怎么实现动态排序呢,自己想了半天,没有头绪,网上找了下相关的资料,看了下,收益挺多,记录下来. 之前我们没有如果不知道动态排序的方法的话,我们可能会 ...

  9. jhljx跑跑跑(找规律)

    题目来源:https://biancheng.love/contest/41/problem/D/index jhljx跑跑跑 题目描述 数学不好的jhljx又在和别人打牌,他们一共m人每人n张牌,牌 ...

  10. UVa 100 - The 3n + 1 problem(函数循环长度)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...