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

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

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

(2)用户账户认证

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

(3)发送请求

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

(4)处理请求结果

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

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

微博列表类:

#import "WeiboListController.h"
#import <Social/Social.h>
#import <Accounts/Accounts.h> #define WEIBO_LIST @"https://api.weibo.com/2/statuses/user_timeline.json" @interface WeiboListController ()
/*
* 返回的微博列表
*/
@property (nonatomic, strong) NSArray *listData; @end @implementation WeiboListController - (void)viewDidLoad {
[super viewDidLoad];
//初始化UIRefreshControl
UIRefreshControl *rc = [[UIRefreshControl alloc] init];
rc.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
[rc addTarget:self action:@selector(refreshTableView) forControlEvents:UIControlEventValueChanged];
self.refreshControl = rc;
} - (void)refreshTableView
{
if (self.refreshControl.isRefreshing){
self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"加载中..."];
//创建一个ACAccountStore对象用来查询用户信息
ACAccountStore *account = [[ACAccountStore alloc] init];
//获得ACAccountType对象,参数为账户类型标识
ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierSinaWeibo];
//请求访问用户账户信息,请求完成回调代码块
[account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
if (granted == YES){//认证通过
//返回所有特定类型标识账户信息
NSArray *arrayOfAccounts = [account accountsWithAccountType:accountType];
if ([arrayOfAccounts count] > ) {
ACAccount *weiboAccount = [arrayOfAccounts lastObject];
//设置请求参数 由社交网站提供
NSDictionary *parameters = [NSDictionary dictionaryWithObject:@"" forKey:@"count"];
NSURL *requestURL = [NSURL URLWithString:WEIBO_LIST];
//发送请求
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeSinaWeibo requestMethod:SLRequestMethodGET URL:requestURL parameters:parameters];
request.account = weiboAccount;//为请求对象设置账户信息
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
//处理请求结果
NSError *err;
if (!responseData){
return ;
}
id jsonObj = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:&err];
if (!err) {
_listData = [jsonObj objectForKey:@"statuses"];
[self.tableView reloadData];
}
//停止下拉刷新
if (self.refreshControl) {
[self.refreshControl endRefreshing];
self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
}
}];
}
}
}];
}
} #pragma mark - Table view data source - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.listData.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
NSDictionary *dict = self.listData[indexPath.row];
cell.textLabel.text = [dict objectForKey:@"text"];
cell.detailTextLabel.text = [dict objectForKey:@"created_at"];
return cell;
} @end

微博发送类:

//
// WeiboSendController.m
// Weibo
//
// Created by 王凯 on 17/3/1.
// Copyright © 2017年 王凯. All rights reserved.
// #import "WeiboSendController.h"
#import <Social/Social.h>
#import <Accounts/Accounts.h> @interface WeiboSendController ()<UITextViewDelegate>
@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (weak, nonatomic) IBOutlet UILabel *countLabel; @end @implementation WeiboSendController - (void)viewDidLoad {
[super viewDidLoad];
} #pragma mark -<UITextViewDelegate> - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
NSString *content = _textView.text;
NSInteger count = - [content length];
if (count < ) {
_countLabel.text = @"";
return NO;
}
_countLabel.text = [NSString stringWithFormat:@"%ld",count];
return YES;
} - (IBAction)sendBtnClick:(id)sender {
ACAccountStore *account = [[ACAccountStore alloc] init];
ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierSinaWeibo];
[account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
if (granted == YES) {
NSArray *arrayOfAccounts = [account accountsWithAccountType:accountType];
if ([arrayOfAccounts count] > ) {
ACAccount *weiboAccount = [arrayOfAccounts lastObject];
NSDictionary *parameters = [NSDictionary dictionaryWithObject:_textView.text forKey:@"status"];
NSURL *requestURL = [NSURL URLWithString:@"https://api.weibo.com/2/statuses/update.json"];
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeSinaWeibo requestMethod:SLRequestMethodPOST URL:requestURL parameters:parameters];
request.account = weiboAccount;
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
NSLog(@"weibo http response:%ld",[urlResponse statusCode]);
}];
}
}
}];
//放弃第一响应者
[_textView resignFirstResponder];
//关闭模态视图
[self dismissViewControllerAnimated:YES completion:nil];
} - (IBAction)cancelBtnClick:(id)sender {
//放弃第一响应者
[_textView resignFirstResponder];
//关闭模态视图
[self dismissViewControllerAnimated:YES completion:nil];
}

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. 开源OSS.Social项目进阶介绍和使用展示

    在开源OSS.Social微信项目解析的随笔中,我简单给大家分享了进行中微信项目的概要设计,没有全局介绍,没有详细讲解,也没有如何使用,很多朋友估计匆匆一瞥就忙着抢开工红包去了.本着不能马虎的态度,这 ...

  2. [CSS3] 学习笔记-CSS3盒子样式

    1.盒子的类型 在CSS3中,使用display来定义盒子的类型,包括block,inline,inline-block类型.div元素和P元素,属于block类型,span元素和a元素,属于inli ...

  3. js精要之模块模式

    // 模块模式是一种用于创建拥有私有数据的单件对象的模式,基本做法是使用立调函数(IIFE)来返回一个对象 var yourObjet = (function(){ // 私有数据 return { ...

  4. Mcaca+Python 测试环境搭建及上手

    Macaca是一套面向用户端软件的测试解决方案,提供了自动化驱动,周边工具,集成方案,旨在解决终端上的测试.自动化.性能等方面的问题,很多人选择它的原因简单:轻量化(相比于appium),跨平台(wi ...

  5. 不是技术牛人,如何拿到国内IT巨头的Offer (转载)

    原文地址:http://blog.csdn.net/lsldd/article/details/13506263 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这 ...

  6. 如何增强ArcGIS插值图出图效果

    如何增强ArcGIS插值图出图效果 by 李远祥 在一些科研领域,经常会遇到使用插值的方式进行处理,并生成最终的插值图.插值图在ArcGIS里面非常容易生成,只要具备了采用点数据,通过ArcToolB ...

  7. yii2 邮件发送(有图有真相)

    经典的密码找回方案是发送邮件到用户邮箱然后修改密码,下面利用yii2 高级版的mail功能,进行邮件的发送,如下图 1.在comm/config/main-local.php中添加 'mailer' ...

  8. setObject:forKey和setValue:forKey的区别

    setObject:forKey: 是NSMutableDictionary类的方法                              key参数类型可以是任意类型对象             ...

  9. Orcale 之基本术语二

    表空间 表空间是 Orcale 数据库最大的逻辑结构.表空间就是一个或者多个数据文件的集合.所有的数据文件都被逻辑的存放在表空间中. 一个数据库包括 SYSTEM.SYSAUX和TMP三个默认表空间, ...

  10. Jenkins在windows上的安装配置

     今天是2月14号,所谓西方情人节,下班回来发现,2月14过的比七夕还火热.于是上网百度百科查询了"情人节". 毕竟是中国的百度啊.是这么解释的.我感到很欣慰.过得每一个节日都应该 ...