网站建设资讯

NEWS

网站建设资讯

ios开发代理的使用,ios 配置代理

iOS 设计模式(一)-代理模式

代理模式是一种消息传递方式,一个完整的代理模式包括:委托对象、代理对象和协议。

创新互联建站2013年至今,先为南江等服务建站,南江等地企业,进行企业商务咨询服务。为南江企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

协议:用来指定代理双方可以做什么,必须做什么。

委托对象:根据指定的协议,指定代理去完成什么功能。

代理对象:根据指定的协议,完成委托方需要实现的功能。

从上图中可以看到三方之间的关系,在实际应用中通过协议来规定代理双方的行为,协议中的内容一般都是方法列表,当然也可以定义属性。

协议是公共的定义,如果只是某个类使用,我们常做的就是写在某个类中。如果是多个类都是用同一个协议,建议创建一个Protocol文件,在这个文件中定义协议。遵循的协议可以被继承,例如我们常用的 UITableView ,由于继承自 UIScrollView 的缘故,所以也将 UIScrollViewDelegate 继承了过来,我们可以通过代理方法获取 UITableView 偏移量等状态参数。

协议只能定义公用的一套接口,类似于一个约束代理双方的作用。但不能提供具体的实现方法,实现方法需要代理对象去实现。协议可以继承其他协议,并且可以继承多个协议,在iOS中对象是不支持多继承的,而协议可以多继承。

协议有两个修饰符 @optional 和 @required ,创建一个协议如果没有声明,默认是 @required 状态的。这两个修饰符只是约定代理是否强制需要遵守协议,如果 @required 状态的方法代理没有遵守,会报一个黄色的警告,只是起一个约束的作用,没有其他功能。

无论是 @optional 还是 @required ,在委托方调用代理方法时都需要做一个判断,判断代理是否实现当前方法,否则会导致崩溃。

在iOS中代理的本质就是代理对象内存的传递和操作,我们在委托类设置代理对象后,实际上只是用一个id类型的指针将代理对象进行了一个弱引用。委托方让代理方执行操作,实际上是在委托类中向这个id类型指针指向的对象发送消息,而这个id类型指针指向的对象,就是代理对象。

通过上面这张图我们发现,其实委托方的代理属性本质上就是代理对象自身,设置委托代理就是代理属性指针指向代理对象,相当于代理对象只是在委托方中调用自己的方法,如果方法没有实现就会导致崩溃。从崩溃的信息上来看,就可以看出来是代理方没有实现协议中的方法导致的崩溃。

而协议只是一种语法,是声明委托方中的代理属性可以调用协议中声明的方法,而协议中方法的实现还是有代理方完成,而协议方和委托方都不知道代理方有没有完成,也不需要知道怎么完成。

由于代理对象使用强引用指针,引用创建的委托方对象,并且成为委托对象的代理。这就会导致委托对象的delegate属性强引用代理对象,导致循环引用的问题,最终两个对象都无法正常释放。

我们将委托对象的delegate属性,设置为弱引用属性。

weak 和 assign 是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后, weak 会自动将指针指向 nil ,而 assign 则不会。在iOS中,向 nil 发送消息时不会导致崩溃的,所以 assign 就会导致野指针的错误 unrecognized selector sent to instance 。

所以我们如果修饰代理属性,还是用 weak 修饰,比较安全。

【iOS】协议(Protocol)和代理(Delegate)

协议(Protocol)类似Java中的接口,它是一个功能方法的集合。协议本身不是一个类,不能自己实现协议里的方法,而是委托其他类去实现。通常用来实现委托代理设计模式,实现不同类对象之间的时间消息通信。协议中的方法默认都是@required,即使用该协议的类必须实现协议里的这些方法。开发者也可以使用@optional来选择性地实现某个方法。

代理(Delegate)是一种设计模式,在Objective-C中通过协议(Protocol)来实现。可以使一个对象在特定时刻通知其他类的对象去实现任务,不需要获取那些对象的指针,实现不同对象之间的通行。

IOS开发笔记整理

在项目功能中有一个定位CLLocation的需求,遇到了一些知识难点,经过各位大侠的帮助,问题解决,特此分享供大家学习,希望大家共同学习进步。

一、简单说明

1.CLLocationManager

CLLocationManager的常用操作和属性

开始用户定位- (void)startUpdatingLocation;

停止用户定位- (void) stopUpdatingLocation;

说明:当调用了startUpdatingLocation方法后,就开始不断地定位用户的'位置,中途会频繁地调用代理的下面方法

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

每隔多少米定位一次

@property(assign, nonatomic) CLLocationDistance distanceFilter;

定位精确度(越精确就越耗电)

@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

使用定位功能,首先要导入框架,遵守CLLocationManagerDelegate协议,再创建位置管理器CLLocationManager

在iOS8.0后,定位功能需要在info.plist中加入NSLocationWhenInUseUsageDescription和NSLocationAlwaysUsageDescription这两个NSString类型字段,才能够使用定位功能

代码贴出来与大家共勉,各位看官自行研究

{ self.locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; if([CLLocationManager locationServicesEnabled] == NO) { // NSLog(@"没有GPS服务"); } //地理位置精确度 _locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters; //设置距离筛选器,double类型,只要距离变化多少,就调用委托代理 self.locationManager.distanceFilter = kCLDistanceFilterNone; // meters [_locationManager requestWhenInUseAuthorization];// 前台定位 [_locationManager startUpdatingLocation];}- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ NSLog(@"longitude = %f", ((CLLocation *)[locations lastObject]).coordinate.longitude); NSLog(@"latitude = %f", ((CLLocation *)[locations lastObject]).coordinate.latitude); CGFloat longTI=((CLLocation *)[locations lastObject]).coordinate.longitude; CGFloat latTI=((CLLocation *)[locations lastObject]).coordinate.latitude; //将经度显示到label上 _longitudeLabel.text = [NSString stringWithFormat:@"%f",longTI]; //将纬度现实到label上 _latitudeLabel.text = [NSString stringWithFormat:@"%f",latTI]; // 获取当前所在的城市名 CLGeocoder *geocoder = [[CLGeocoder alloc] init]; //根据经纬度反向地理编译出地址信息 [geocoder reverseGeocodeLocation:locations.lastObject completionHandler:^(NSArray *array, NSError *error) { if (array.count 0) { CLPlacemark *placemark = [array objectAtIndex:0];// //将获得的所有信息显示到label上// self.location.text = placemark.name; //获取城市 NSString *city = placemark.locality; if (!city) { //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市) city = placemark.administrativeArea; } // NSLog(@"city = %@", city); _cityName=city; } else if (error == nil [array count] == 0) { // NSLog(@"No results were returned."); } else if (error != nil) { // NSLog(@"An error occurred = %@", error); } }]; //系统会一直更新数据,直到选择停止更新,因为我们只需要获得一次经纬度即可,所以获取之后就停止更新 [manager stopUpdatingLocation];}

以上是关于我给大家整理的IOS开发之详解定位CLLocation,后续还会持续更新,希望大家能够喜欢。

iOS开发 为app配置代理

由于对某款app的租房信息的筛选条件不满意,所以爬取了它的api以便能够根据自己的需求进行筛选。根据自己的初级爬虫经验,为了防止app封禁我的ip,所以准备通过代理服务器去访问。

过程是相当纠结啊,尝试的太多,这里就只放结论了。

笔者使用的 URLSession ,初始化前配置 URLSessionConfiguration 对象的 connectionProxyDictionary 即可。

特别提醒: host 类型为 String , 而 port 类型为 Int .

ps:使用http时,需要添加ATS白名单

注: 两种代理方式貌似不能同时使用。不确定是因为我测试时上一秒代理还好好的,下一秒就挂了。

一般服务器对于爬虫是不欢迎的。真正的用户操作再快都需要一定的时间,而爬虫访问时间很短,因此相当规模的爬虫对服务器造成的负担就更大。所以服务器会对爬虫做检测,如果被抓到则可能被封掉ip或像本例一样返回其他网站。

针对检测,我们的做法就是要伪装成真正的用户。以笔者目前的理解有两点:

1. 修改请求头。通过Charles抓包可以看到一次请求的头部信息,对照修改

2. 设定访问延时。手速再快你也快不过自动运行的程序吧。

参考链接:

ps: 一个不错的爬虫学习系列

过程中遇到最多的就是1200错误码:无法与服务器建立安全连接。网上大多数意见是服务器SSL版本不够,因为iOS最低要求使用TLSv1.2的版本。对于更低一点的,就需要特别指定版本。( 由于我这里是代理字典https key用错了,才导致的1200。所以只能先在这mark一下 )

以下是网上给出的解决方法:

这是一个测试TLS的控制台命令:

nscurl --ats-diagnostics --verbose

这里能自动测试哪种key能通过,随便找个https的网站试一下吧。

附上 connectionProxyDictionary keys 参见 Table 3-7


网站标题:ios开发代理的使用,ios 配置代理
URL网址:http://njwzjz.com/article/dscdpsh.html