Red de conocimiento informático - Material del sitio web - Cómo utilizar la API de la Administración Meteorológica de China para desarrollar una aplicación meteorológica

Cómo utilizar la API de la Administración Meteorológica de China para desarrollar una aplicación meteorológica

Preparación temprana:

1. Solicite API (traiga appid y private_key)

2 Lea "SmartWeatherAPIlt; Litegt; Manual de usuario de la interfaz de la versión WebAPI"

3. Prepare areaid, type, date, appid, urlencode ($key) (tenga en cuenta que la clave cifrada debe codificarse en una URL para formar parte del enlace de la interfaz)

Bien, comencemos a codificar:<. /p> p>

1. Busque el areaid del lugar donde desea verificar el clima en el areaid_list adjunto y seleccione el tipo

NSString *areaid = @"101010100";

NSString *type =

@"index_f";

/**

* El documento oficial ha actualizado el número de tipo de datos

* Índice: index_f (interfaz base); index_v (interfaz normal)

Previsión de 3 días: Forecast_f (interfaz base Forecast_v (interfaz normal)

*

*/

*/

2. Obtener la fecha meteorológica actual

NSDate

*_date = [ fecha NSDate];

NSDateFormatter *dateFormatter =

[[NSDateFormatter alloc] init]

[dateFormatter

setDateFormat: @; " yyyyyMMddHHmmss"]; //Tenga en cuenta el formato de la fecha

NSString *date =

[[dateFormatter stringFromDate:_date]

substringToIndex: 12]; //Utilizado para el minuto exacto, sistema de 24 horas, sistema de 60 minutos

3, la aplicación del appid y la clave_privada

NSString *appid =

@ "15ds45s13a465s"; //Aquí está el Enter aleatorio del propietario, compilado

NSString *private_key =

@"46s4ds_SmartWeatherAPI_45s44d6" //También compilado

4. Calcule el código de URL La última clave, este paso es más importante, hay muchos pasos, léalo con paciencia.

Sobre la base original, se calcula en el entorno PHP. El código es el siguiente, que se puede encontrar en "

/data/?areaid=101010100amp; type=index_famp. ; date=201409041509amp; appid = 15ds45s13a465s",

"46s4ds_SmartWeatherAPI_45s44d6",

TRUE)));

Primero, defina el método para obtener la clave_pública y API y realice la operación de codificación en los métodos clave

Tenga en cuenta que todos los métodos aquí están definidos por mí en la clase getTime, de la que se creará una instancia en main más adelante

//Get publicky

- (NSString*)

getPublicKey: (NSString*)areaid: (NSString *)tipo: (NSString*)fecha

: (NSString* )appid {

NSString *Key = [[NSString alloc]]

initWithFormat:@"/data/?areaid=@amp.type=@amp;date=@amp; appid=@" ,

areaid, tipo, [fecha substringToIndex: 12], appid];

return

Clave;

}

//Obtener API completa

- (NSString*) getAPI: (NSString*)areaid

: (NSString*)type: (NSString*) fecha: (NSString *)appid: (NSString*)clave

{

NSString *API = [[NSString alloc]]

initWithFormat:@"/ data/?areaid =@amp;type=@amp;date=@amp;appid=@amp;key=@",

areaid, tipo, [fecha substringToIndex: 12], [appid substringToIndex: 6],

key];

//------------- Lo principal a recordar aquí es que solo se requiere el appid ¡¡¡Primeros 6 dígitos!!!!!

Retorno

API;

}

// Urlencode la clave obtenida

- ( NSString

*)stringByEncodingURLFormat: (NSString*)_key{

NSString *encodedString

= (__bridge NSString

*)CFURLCreateStringByAddingPercentEscapes (kCFAllocatorDefault, (CFStringRef)_key,

nil, (CFStringRef) @"!$amp;'()*

, -./:;=?@_~#[]",

kCFStringEncodingUTF8);

// Debido a ARC, la conversión aquí necesita agregar el puente __, yo No sé el motivo. Por favor, explique

return

encodedString;

}

El punto es que el algoritmo bajo oc. es el siguiente, recuerde agregar el Base64 h adjunto

y consulte el proyecto

//Cifrado de clave pública y clave privada

- (NSString *)

hmacSha1: (NSString*)public_key: NSUTF8StringEncoding];

const void* keyBytes =

[secretData bytes]

const void; * dataBytes = [stringData

bytes];

///#define CC_SHA1_DIGEST_LENGTH 20 /* Resumen

Longitud (bytes)*/

void* outs =

p>

malloc(CC_SHA1_DIGEST_LENGTH);

CCHmac(kCCHmacAlgSHA1, keyBytes,

[longitud de datos secretos], bytes de datos, [longitud de datos de cadena] , salidas);

//

Solución 1

NSData* SignatureData = [NSData dataWithBytesNoCopy: salidas

longitud: CC_SHA1_DIGEST_LENGTH freeWhenDone: YES];

return

[ SignatureData

base64EncodedString]

}

Esto es solo la inicial. clave, y el encodeurl aún no se ha procesado, por lo que el enlace no puede ser reconocido por el navegador, por lo que ahora hay un paso para obtener la clave real después de obtener _key a través del algoritmo: <

NSString *_key = [getTime hmacSha1: [ getTime

getPublicKey: areaid: type: date: appid]: private_key]

NSString *key =

[ getTime

stringByEncodingURLFormat : _key];

El último paso, ¿está bien? API de empalme

NSString *weatherAPI = [getTime getAPI: areaid: tipo: fecha

: appid

: clave]; /OK, nuestra API está lista para usar.

Finalmente, el valor devuelto por la API es un archivo JSON y, al analizar el archivo, podemos obtener los datos requeridos.

El siguiente es un ejemplo de una interfaz desarrollada

NSDictionary *weatherDic = [getTime

getWeatherDic:@"/data/ cityinfo/101010100.html"];

// Los datos almacenados en el diccionario WeatherDic también son un tipo de palabra y el valor se obtiene de ella a través del valor clave

NSDictionary

*weatherInfo = [weatherDic

objectForKey: @"weatherinfo"];

NSLog(@"Hoy es @ @ @ La condición meteorológica es: @ @ -

@", [newDateOne substringWithRange: NSMakeRange(0, 4) ], [ newDateOne

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

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

objectForKey :@"weather"], [weatherInfo objectForKey: @"temp1"], [weatherInfo

objectForKey: @"temp2"]);

Salida: 2014-09-04 23 :40:.23.243

WeatherAPP[5688:201108] Hoy es 2014-09-04, las condiciones climáticas son: soleado 17°C - 30°C

Contenido del diccionario WeatherInfo Sí----gt; {"weatherinfo": {"city": "Beijing", "cityid": "101010100", "temp1": "17°C", "temp2": "30°C", " tiempo": "soleado", "img1": "n0.gif", "img2": "d0.gif", "ptime": "18:00"}}