编写网络客户端主要有四个步骤:

(1)项目中引入Accounts和Social框架

Accounts框架中有进行用户账户认证所需类,Social框架提供了我们所需要的SLRequest类。

(2)用户账户认证

用户账户认证使用ACAccount、ACAccountStore和ACAccountType类,ACAccount类是封装用户账户信息,这些信息存储在账户数据库中。ACAccountStore类用来管理用户账户数据库,ACAccountType类用来描述账户类型。

(3)发送请求

用户认证通过就可以进行发送,使用SLRequest对象发送请求。

(4)处理请求结果

处理请求结果,解析数据更新ui

具体代码使用通过一个新浪微博例子:

微博列表类:

  1. #import "WeiboListController.h"
  2. #import <Social/Social.h>
  3. #import <Accounts/Accounts.h>
  4.  
  5. #define WEIBO_LIST @"https://api.weibo.com/2/statuses/user_timeline.json"
  6.  
  7. @interface WeiboListController ()
  8. /*
  9. * 返回的微博列表
  10. */
  11. @property (nonatomic, strong) NSArray *listData;
  12.  
  13. @end
  14.  
  15. @implementation WeiboListController
  16.  
  17. - (void)viewDidLoad {
  18. [super viewDidLoad];
  19. //初始化UIRefreshControl
  20. UIRefreshControl *rc = [[UIRefreshControl alloc] init];
  21. rc.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
  22. [rc addTarget:self action:@selector(refreshTableView) forControlEvents:UIControlEventValueChanged];
  23. self.refreshControl = rc;
  24. }
  25.  
  26. - (void)refreshTableView
  27. {
  28. if (self.refreshControl.isRefreshing){
  29. self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"加载中..."];
  30. //创建一个ACAccountStore对象用来查询用户信息
  31. ACAccountStore *account = [[ACAccountStore alloc] init];
  32. //获得ACAccountType对象,参数为账户类型标识
  33. ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierSinaWeibo];
  34. //请求访问用户账户信息,请求完成回调代码块
  35. [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
  36. if (granted == YES){//认证通过
  37. //返回所有特定类型标识账户信息
  38. NSArray *arrayOfAccounts = [account accountsWithAccountType:accountType];
  39. if ([arrayOfAccounts count] > ) {
  40. ACAccount *weiboAccount = [arrayOfAccounts lastObject];
  41. //设置请求参数 由社交网站提供
  42. NSDictionary *parameters = [NSDictionary dictionaryWithObject:@"" forKey:@"count"];
  43. NSURL *requestURL = [NSURL URLWithString:WEIBO_LIST];
  44. //发送请求
  45. SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeSinaWeibo requestMethod:SLRequestMethodGET URL:requestURL parameters:parameters];
  46. request.account = weiboAccount;//为请求对象设置账户信息
  47. [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
  48. //处理请求结果
  49. NSError *err;
  50. if (!responseData){
  51. return ;
  52. }
  53. id jsonObj = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:&err];
  54. if (!err) {
  55. _listData = [jsonObj objectForKey:@"statuses"];
  56. [self.tableView reloadData];
  57. }
  58. //停止下拉刷新
  59. if (self.refreshControl) {
  60. [self.refreshControl endRefreshing];
  61. self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
  62. }
  63. }];
  64. }
  65. }
  66. }];
  67. }
  68. }
  69.  
  70. #pragma mark - Table view data source
  71.  
  72. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  73. return self.listData.count;
  74. }
  75.  
  76. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  77. {
  78. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
  79. NSDictionary *dict = self.listData[indexPath.row];
  80. cell.textLabel.text = [dict objectForKey:@"text"];
  81. cell.detailTextLabel.text = [dict objectForKey:@"created_at"];
  82. return cell;
  83. }
  84.  
  85. @end

微博发送类:

  1. //
  2. // WeiboSendController.m
  3. // Weibo
  4. //
  5. // Created by 王凯 on 17/3/1.
  6. // Copyright © 2017年 王凯. All rights reserved.
  7. //
  8.  
  9. #import "WeiboSendController.h"
  10. #import <Social/Social.h>
  11. #import <Accounts/Accounts.h>
  12.  
  13. @interface WeiboSendController ()<UITextViewDelegate>
  14. @property (weak, nonatomic) IBOutlet UITextView *textView;
  15. @property (weak, nonatomic) IBOutlet UILabel *countLabel;
  16.  
  17. @end
  18.  
  19. @implementation WeiboSendController
  20.  
  21. - (void)viewDidLoad {
  22. [super viewDidLoad];
  23. }
  24.  
  25. #pragma mark -<UITextViewDelegate>
  26.  
  27. - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
  28. {
  29. NSString *content = _textView.text;
  30. NSInteger count = - [content length];
  31. if (count < ) {
  32. _countLabel.text = @"";
  33. return NO;
  34. }
  35. _countLabel.text = [NSString stringWithFormat:@"%ld",count];
  36. return YES;
  37. }
  38.  
  39. - (IBAction)sendBtnClick:(id)sender {
  40. ACAccountStore *account = [[ACAccountStore alloc] init];
  41. ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierSinaWeibo];
  42. [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
  43. if (granted == YES) {
  44. NSArray *arrayOfAccounts = [account accountsWithAccountType:accountType];
  45. if ([arrayOfAccounts count] > ) {
  46. ACAccount *weiboAccount = [arrayOfAccounts lastObject];
  47. NSDictionary *parameters = [NSDictionary dictionaryWithObject:_textView.text forKey:@"status"];
  48. NSURL *requestURL = [NSURL URLWithString:@"https://api.weibo.com/2/statuses/update.json"];
  49. SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeSinaWeibo requestMethod:SLRequestMethodPOST URL:requestURL parameters:parameters];
  50. request.account = weiboAccount;
  51. [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
  52. NSLog(@"weibo http response:%ld",[urlResponse statusCode]);
  53. }];
  54. }
  55. }
  56. }];
  57. //放弃第一响应者
  58. [_textView resignFirstResponder];
  59. //关闭模态视图
  60. [self dismissViewControllerAnimated:YES completion:nil];
  61. }
  62.  
  63. - (IBAction)cancelBtnClick:(id)sender {
  64. //放弃第一响应者
  65. [_textView resignFirstResponder];
  66. //关闭模态视图
  67. [self dismissViewControllerAnimated:YES completion:nil];
  68. }

iOS网络编程笔记——编写自己的网络客户端的更多相关文章

  1. Java基础知识强化之网络编程笔记10:TCP之客户端读取文本文件服务器控制台输出

    1. TCP之客户端读取文本文件服务器控制台输出 (1)客户端:(发送数据到服务端) package cn.itcast_10; import java.io.BufferedReader; impo ...

  2. Java基础知识强化之网络编程笔记09:TCP之客户端键盘录入服务器写到文本文件中

    1. TCP之客户端键盘录入服务器写到文本文件中 (1)客户端: package cn.itcast_09; import java.io.BufferedReader; import java.io ...

  3. Java基础知识强化之网络编程笔记08:TCP之客户端键盘录入服务器控制台输出

    1. 客户端: package cn.itcast_08; import java.io.BufferedReader; import java.io.BufferedWriter; import j ...

  4. Linux网络编程笔记(修订版)

    我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1.   基本概念 2.   基本接口 2.1.   打开一个socket 2.2.   将 ...

  5. [C#网络编程系列]专题一:网络协议简介

    转自:http://www.cnblogs.com/zhili/archive/2012/08/11/NetWorkProgramming.html 因为这段时间都在研究C#网络编程的一些知识, 所以 ...

  6. 【TCP/IP网络编程】:01理解网络编程和套接字

    1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...

  7. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  8. Winsock网络编程笔记(1)----入门

    今天第一次接触winsock网络编程,看的资料是Windows网络编程第二版.通过博客记住自己的看书笔记.. 在这里贴出第一个程序,虽然程序什么都没做,但以此作为入门,熟悉其网络编程风格.. #inc ...

  9. Go 网络编程笔记

    前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...

随机推荐

  1. KB奇遇记(10):终章

    本来还想写一篇关于前CIO的著名言论,不过想想还是算了.博客空间宝贵,不乱恶心人了. 这篇博文是本系列<KB奇遇记>的最后一篇了. 虽然在KB公司有这么多的苦,但毕竟收获也很多,至少让我懂 ...

  2. ubuntu下安装ssh服务器方法

    由于xshell远程连接ubuntu是通过ssh协议的,所以,需要给ubuntu安装ssh服务器. 1)ubuntu安装ssh服务器 sudo apt-get install openssh-serv ...

  3. js精要之构造函数

    // 枚举对象 var obj = {} obj.name = "bob"; obj.age = "; obj.sex = "boy"; consol ...

  4. 前端基本知识(二):JS的原始链的理解

    之前一直对于前端的基本知识不是了解很详细,基本功不扎实,但是前端开发中的基本知识才是以后职业发展的根基,虽然自己总是以一种实践是检验真理的唯一标准,写代码实践项目才是唯一,但是经常遇到知道怎么去解决这 ...

  5. Swift 内存管理详解

    Swift内存管理: Swift 和 OC 用的都是ARC的内存管理机制,它们通过 ARC 可以很好的管理对象的回收,大部分的时候,程序猿无需关心 Swift 对象的回收. 注意: 只有引用类型变量所 ...

  6. CSS3中选择器

    ::selection选择器 <style type="text/css"> .selectColor::selection{color:#fff;background ...

  7. Javascript—①你好,世界!

    新手Perfect教程之Javascript教程①-你好,世界! 前言:不知道Javascript是什么东东的自行度娘或google一下 Javascript在html<head>和< ...

  8. c#算两个火星坐标的距离(高德or百度)

    /// <summary> /// 获取两个坐标之间的距离 /// </summary> /// <param name="lat1">第一个坐 ...

  9. BZOJ 3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者(贪心)

    这= =,就是线段覆盖对了= =直接贪心就行了= = CODE: #include<cstdio>#include<iostream>#include<cstring&g ...

  10. R系列:关联分析;某电商平台的数据;做捆绑销售和商品关联推荐

    附注:不要问我为什么写这么快,是16年写的. 一.分析目的 I用户在某电商平台买了A,那么平台接下来应该给用户推荐什么,即用户在买了商品A之后接下来买什么的倾向性最大: II应该把哪些商品在一起做捆绑 ...