如何利用中国气象局的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℃","。