IOS - 位置及天气获取解析

参考网址:

经纬度定位:http://blog.csdn.net/whaomian/article/details/6807739

位置解析:http://www.cocoachina.com/bbs/read.php?tid=134893&keyword=%B5%D8%C0%ED%CE%BB%D6%C3

百度天气免费API:http://www.cnblogs.com/txw1958/p/baidu-weather-forecast-api.html

AFNetworking访问网络和简单JSON解析:http://e673.com/index.php/afnetworking-conclu-json/

解决URL中中文编码不被识别:http://blog.csdn.net/typingios/article/details/9136005

最近心血来潮,就想学习一下定位和获取天气。刚开始感觉挺难的,做下来花费了将近四天的时间,收货颇多。像我这种新手,刚开始是有需求但不知道怎么实现,很多时间都花费在找资料上了。其实熟练了就几不花时间了。

进入正题:

1.定位。

首先在项目中加入库CoreLocaltion.framework。单单是定位的话,用CoreLocaltion.framework和mapkit.framework是没有区别的,但是mapkit.framework支持地图方面的扩展也更臃肿。

在.h文件中加入引用:

1 #import <CoreLocaltion/CoreLocaltion.h>

实现代理:CLLocationManagerDelegate

并定义两个变量:

1 CLLocationManager *localManager;
2 CLLocation *newLocation;

在.m文件中的viewDidLoad方法中初始化localManager并设置代理为自己:

1 //初始化LocationManager
2 locationManager = [[CLLocationManager alloc] init];
3 //设置定位精度
4 locationManager.desiredAccuracy = kCLLocationAccuracyBest;
5 //设置代理
6 locationManager.delegate = self;

并实现方法locationManager:didUpdateLocations:,用于在定位成功时进行处理事务

1 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
2 {
3     newLocation = [locations firstObject];//第一个是当前的位置,第二个是原先的位置
4
5     //定位成功后的处理,如显示到视图中去
6     //纬度:newLocation.coordinate.latitude, 经度:newLocation.coordinate.longitude
7
8     [localManager stopUpdatingLocation];//关闭定位
9 }

顺便提一下以前的方法locationManager:didUpdateToLocation:fromLocation:,建议用上面的新的方法!

1 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
2     newLocation = newLocation;
3     //定位成功后的处理,如上
4 }

上面的方法从函数名上应该能看出来,是位置更新后自动调用的方法,但是位置更新却是要程序控制的,比如,程序中的一个按钮被点击时开始更新位置,则要在点击事件中加入对定位服务的判断和对更新位置的请求:

 1 if ([CLLocationManager locationServicesEnabled]) {
 2     //如果是iOS8的话则要手动请求一下定位的授权
 3     if (CurrentVesion >= 8.0) {
 4         [locationManager requestWhenInUseAuthorization];
 5     }
 6     //更新位置
 7     [locationManager startUpdatingLocation];
 8 }else{
 9     //给出提示,定位服务不可用或没有授权获取位置信息
10 }

2.解析位置

刚只是获取了位置信息,下面来对位置信息(上面定义的location)进行解码,这样就可以得到位置信息的文字描述,如“河南省开封市金明区***街道***号”。

在.h文件中加入一个变量:CLPlacemark *placemark;//这里不是特别必要非要在这里建这个变量,但是后面通过天气API获取天气数据要用到

在.m文件中,开始进行解码。可加到上面“定位成功后的处理”部分:

 1 //位置的文字串描述
 2 __block NSString *locationInfo = @"";
 3
 4 CLGeocoder *geocoder = [[CLGeocoder alloc] init];
 5 [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
 6     if (placemarks.count > 0) {
 7         placemark = [placemarks objectAtIndex:0];
 8
 9         locationInfo = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
10
11         //打印placemark的各个字段信息
12         NSLog(@"I am currently at %@",locationInfo);
13         NSLog(@"placemark.ISOcountryCode %@",placemark.ISOcountryCode);
14         NSLog(@"placemark.country %@",placemark.country);
15         NSLog(@"placemark.postalCode %@",placemark.postalCode);
16         NSLog(@"placemark.administrativeArea %@",placemark.administrativeArea);
17         NSLog(@"placemark.locality %@",placemark.locality);
18         NSLog(@"placemark.subLocality %@",placemark.subLocality);
19         NSLog(@"placemark.subThoroughfare %@",placemark.subThoroughfare);
20     }
21 }];

3.使用天气接口获取天气

在网上搜了好久的天气接口,发现还是百度的好用(稳定,免费),就果断用了百度。

使用接口时要访问网络获取数据的,所以这里还要注意联网的。网上说AFNetworking不错,也是果断用了,先实现出来再挑好坏。

在AFNetworking官网下载好zip包,把其中的AFNetworking文件夹加入到项目中去。

在.h文件中加入引用:

1 #import "AFHTTPRequestOperation.h"

添加变量:

1 //存储结构化的天气数据,为了程序中复用,建议使用Model,然后方便操作再封上一层ModelService
2 NSDictionary *responseDic;

然后在设置参数请求数据(如在另一个button事件中):

 1 //注意参数“ak”后面的数据在自己做应用时一定自己去百度申请
 2 //参数“location”,有说能用经纬度的,但是我测试失败,不知道是不是我当时处理时写错了
 3 //参数“output”,指定返回数据类型,json或者xml
 4
 5 //链接字符串
 6 NSString *RequestStr = [NSString stringWithFormat:@"http://api.map.baidu.com/telematics/v3/weather?location=%@&output=json&ak=******", placemark.locality];
 7 //链接字符串,utf8格式,这个我在另一个demo中没有特意设置为utf8也正常使用
 8 NSString *weatherRequestStr = [RequestStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 9 //URL链接
10 NSURL *weatherRequestUrl = [NSURL URLWithString:weatherRequestStr];
11 //请求
12 NSURLRequest *weatherRequest = [NSURLRequest requestWithURL:weatherRequestUrl];
13
14 //AF库提供的请求操作,初始化
15 AFHTTPRequestOperation *weatherRequestOperation = [[AFHTTPRequestOperation alloc]initWithRequest:weatherRequest];
16 //设置请求操作成功和失败的回调函数
17 [weatherRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){
18     NSLog(@"请求成功!");
19
20     //用NSJSONSerialization解析JSON
21     NSString *responseStr = [NSString stringWithString:operation.responseString];
22     NSLog(@"%@", responseStr);
23     NSData *responseData = [[NSData alloc] initWithData:[responseStr dataUsingEncoding:NSUTF8StringEncoding]];
24     responseDic = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:nil];
25 } failure:^(AFHTTPRequestOperation *operation, NSError *error){
26     NSLog(@"请求失败: %@", error);
27 }];
28 //开始请求操作
29 [weatherRequestOperation start];

4.解析天气数据

得到结构化的天气数据后,就可以进行数据读取了,这里采用的是JSON。JSON的解析其实就是对NSArray和NSDictionary的取值操作。建议封装到相应Model的Service中去,方便使用。

初学者注意一下:在存取数据时一定要仔细分析JSON(XML)的结构,否则你会耗好久时间找错误,中间可能还会以为是函数方法写错误了。在JSON文件中,“{”和“}”中间的数据是NSDictionary类型的数据,“[”和“]”中间的数据是NSArray类型的,特别是当好几个“{”或“}”和“[”或“]”挨着时,一定分析好再写。

OK,至此,就可以写一个自己的天气小应用了。

时间: 2024-10-04 09:51:07

IOS - 位置及天气获取解析的相关文章

iOS 网络数据之XML解析

<pre name="code" class="objc"><span style="font-family:Arial, Helvetica, sans-serif;"><span style="font-size:14px;"><span style="background-color: rgb(255, 255, 255);"></span>

iOS -数据库网络之xml解析

XML文件有2种解析方式 1.基于文档(document) 2.基于事件(sax) 1.IOS中XML文件获取 首先要将XML导入工程中 在ViewController的按钮事件中,代码如下: //获取xml完整路径 NSString * path=[[NSBundle mainBundle] [email protected]"xml文件名称" ofType:@"xml"]; //读取文件到内存 NSData* data=[NSData dataWithConte

[转]iOS中UITextField 使用全面解析

001//初始化textfield并设置位置及大小002  UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)];003  004//设置边框样式,只有设置了才会显示边框样式 005  text.borderStyle = UITextBorderStyleRoundedRect;006 typedef enum {007    UITextBorderStyleNone,008   

iOS开发——网络篇&amp;数据解析

数据解析 关于iOS开发的中数据解析的方法有两种JSON和XML,这里只做简单的介绍,会使用就可以了. JSON—— 关于JSON的解析经过很多爱好者的分析使用相同自带的还是最好的,不管是从使用的容易度还是性能方面 NSJSONSerialization 1 -(void)start 2 { 3 4 NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; 5

ios设备唯一标识获取策略

英文原文:In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the value 02:00:00:00:00:00. If you need to identify the device, use the identifierForVendor property of UIDevice instead. (Apps that need an identifier for

iOS网络编程开发—JSON解析与XML解析

一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的注意点:key必须用双引号 要想从

IOS 设备 iTunesCDB 文件详细解析(一)

IOS 移动设备里面有一个媒体数据库文件,这个文件保存了当前设备的媒体信息,比如音乐,视频,电子书,铃声等等,都保存在这里,废话不多说了 iTunesCDB 是一个二进制的文件,其中是用节点来组织的,每个节点都包含特定的信息,比如节点类型,节点头大小,子节点个数等等.有点像xml,但是和xml 又不一样,xml 是闭合的. 用二进制编辑器打开这个文件可以看到 MHBD 头 二进制文件的头四个字节mhbd 是一个标识,根据特定的标识不同的解析,在解析的时候只要关心自己需要的字段,其他不明白的字段读

李洪强iOS开发之动态获取UILabel的bounds

李洪强iOS开发之动态获取UILabel的bounds 在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法. 1.获取宽度,获取字符串不折行单行显示时所需要的长度  CGSize labelBounds = [str sizeWithFont:font constrainedToSize:CGSizeMake(MAXFLOAT, 30)]; 注:如果想得到宽度的话,size的width应该设为MAXFLOAT. 2.获取高度,获取字符串在指定的siz

Use GraceNote SDK in iOS(二)获取音乐的完整信息

在需求彻底明朗化,外加从MusicFans转到GraceNote,再从GraceNote的GNSDK转到iOS SDK后,终于完成了在iOS上通过音乐的部分信息获取完整信息的功能了.(好吧,我承认是相对完整...) 首先介绍下在项目中配置GraceNote的iOS SDK. SDK的下载地址:Mobile Client 注意要先登录才能见到文件的下载链接.另外官网还给出来一个SDK的配置文档,完全跟着走在Xcode 5是走不通的,不过也具有一定的指导作用,建议看一看. 下载解压后,新建一个工程,