如何利用中国气象局的API开发天气APP?

前期准备工作:

首先,申请API(获取appid和private_key)

二、SmartWeatherAPI的解读

第三,准备好areaid、type、date、appid和urlencode($key)(注意这里的加密密钥需要encodeurl才能成为接口链接的一部分)。

好吧,代码是这样的:

1.从附件的areaid_list中找到你想要的地方的areaid,选择你想要查询的天气类型。

ns string * areaid = @ " 101010100 ";

NSString *type =

@ " index _ f

/**

*公文更新的数据类型编号

* index: index_f(基本接口);Index_v(通用接口)

3天预测:forecast_f(基本界面);预测_v(通用接口)

*

*/

2.获取当前天气日期

NSDate

* _ date =[ns date date];

NSDateFormatter *dateFormatter =

[[nsdate formatter alloc]init];

[日期格式化程序

setdate format:@ " yyyymmdd hhmmss "];//注意日期的格式。

NSString *date =

[[日期格式化程序字符串日期:_日期]

substring index:12];//使用精确到分钟的24小时60分钟时钟。

3.应用的appid和private_key。

NSString *appid =

@ " 15ds 45s 13a 465s ";//这里是楼主随便进编的。

NSString *private_key =

@ " 46s 4ds _ SmartWeatherAPI _ 45s 44d 6 ";//也是编的。

4.在urlencode之后计算密钥。这一步比较重要,步骤很多。请耐心看完。

在原来的基础上,在PHP环境下计算。代码如下,可在“

/data/?areaid = 101010100 & amp;type = index _ f & amp日期= 201409041509 & amp;appid = 15ds 45s 13a 465s”,

" 46s4ds_SmartWeatherAPI_45s44d6 ",

真)));

首先定义了获取public_key和API的方法,并定义了对key进行encodeurl操作的方法。

注意这里的方法都是我在getTime的类中定义的,后面是main中的实例化。

//获取publicky

- (NSString*)

get public key:(ns string *)areaid:(ns string *)type:(ns string *)date

:(NSString*)appid {

NSString *Key = [[NSString alloc]

initWithFormat:@"/data/?areaid = % @ & amptype = % @ & ampdate = % @ & ampappid=%@ ",

areaid,type,[日期子字符串索引:12],appid];

返回

关键;

}

//获取完整的API

-(ns string *)getAPI:(ns string *)areaid

:(ns string *)type:(ns string *)date:(ns string *)appid:(ns string *)key

{

NSString *API = [[NSString alloc]

initWithFormat:@"/data/?areaid = % @ & amptype = % @ & ampdate = % @ & ampappid = % @ & ampkey=%@ ",

areaid,type,[date substring index:12],[appid substring index:6],

键];

// -这里需要的主要是只需要appid的前6位!!!

返回

API

}

//将获得密钥渐进式urlencode操作。

-(字符串

*)stringByEncodingURLFormat:(ns string *)_ key {

NSString *encodedString

= (__bridge NSString

*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)_key,

nil,(CFStringRef) @ "!美元& amp'()*+,-./:;=?@_~%#[]",

kcfstringencodingutf 8);

//因为ARC的存在,这里的转换需要加上__bridge,原因我也不知道。求大神解释

返回

encodedString

}

重点是,oc下的算法如下,记得附上Base64.h

将其添加到并引用到项目中

//加密publickey和privatekey。

- (NSString *)

hmacsha 1:(ns string *)public _ key:(ns string *)private _ key {

NSData*

secretData = [private_key

data using encoding:nsu TF 8 string encoding];

NSData* stringData = [public_key

data using encoding:nsu TF 8 string encoding];

const void* keyBytes =

[secretData字节];

const void * dataBytes =[string data

字节];

///# define CC _ sha 1 _ DIGEST _ LENGTH 20/* DIGEST

字节长度*/

void* outs =

malloc(CC _ sha 1 _ DIGEST _ LENGTH);

CCHmac(kCCHmacAlgSHA1,keyBytes,

[secretData length],dataBytes,[stringData length],outs);

//

溶液1

ns data * signature data =[ns data dataWithBytesNoCopy:outs

LENGTH:CC _ sha 1 _ DIGEST _ LENGTH free hendone:YES];

返回

[签名数据

base 64 encoded string];

}

这里只是一个初步的key,还没有被encodeurl,链接也无法被浏览器识别,所以算法得到的_key现在多了一步就能得到真正的key。

ns string * _ key =[getTime hmacsha 1:[getTime

get public key:areaid:type:date:appid]:private _ key];

NSString *key =

[getTime

stringByEncodingURLFormat:_ key];

最后一步!拼接API

ns string * weather API =[getTime getAPI:areaid:type:date

:appid

:key];

//好的,我们的API可以用。

最后,通过API返回的值是一个JSON文件,我们可以通过解析得到想要的数据。我们以一个开发的接口为例。

ns dictionary * weather DIC =[getTime

getWeatherDic:@ "/data/city info/101010100 . html "];

WeatherDIC字典中存储的数据也是典型的单词,从中取值的是键值。

NSDictionary

*weatherInfo = [weatherDic

objectForKey:@ " weather info "];

NSLog(@“今天是% @% @ @天气状况是:% @% @-

%@ ",[newDateOne substring with range:nsmakerage(0,4)],[new date one

substringWithRange:NSMakeRange(4,2)],[newDateOne

substringWithRange:NSMakeRange(6,2)],[weatherInfo

objectForKey:@"weather"],[weatherInfo objectForKey:@ " temp 1 "],[weather info

objectForKey:@ " temp 2 "]);

输出:2014-09-04 23:40:23.243

天气app【5688:201108】今天是2014-09-04,天气情况是:晴17℃-30℃。

weatherInfo字典中的内容是-> {"weatherinfo":{"city ":"北京"," city id ":" 101010100 "," temp 1 ":"17℃","。