Colección de citas famosas - Colección de firmas - ¿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?

Trabajo de preparación inicial:

Primero, solicitar API (obtener appid y clave_privada)

Segundo, explicación de SmartWeatherAPI

Tercero, preparar área de ayuda, tipo, fecha, appid y urlencode($key) (tenga en cuenta que la clave de cifrado aquí necesita encodeurl para ser parte del enlace de la interfaz).

Bien, el código es el siguiente:

1. Busque el areaid del lugar que desea en areaid_list en el archivo adjunto y seleccione el tipo de clima que desea consultar.

ns string *areaid = @"10101010100";

NSString *type =

@"index_f";

/ **

*Número de tipo de datos de actualización del documento oficial

* índice: index_f (interfaz básica)

Previsión de 3 días: Forecast_f (interfaz básica) );

* _ fecha =[ns fecha fecha];

NSDateFormatter *dateFormatter =

[[nsdate formatter alloc]init];

[Formateador de fecha

setdate format:@"yyyymmdd hhmmss"] //Presta atención al formato de la fecha.

NSString *date =

[[Date formatting string date:_date]

substring index:12] //Uso preciso al minuto 24 horas y Reloj de 60 minutos.

3. La clave appid y privada de la aplicación.

NSString *appid =

@“15ds 45s 13a 465s”; // Lo siguiente fue ingresado casualmente por el cartel original y está inventado.

NSString *private_key =

@“46s 4ds _ SmartWeatherAPI _ 45s 44d 6” // También editado.

4. Calcule la clave después del código de URL. Este paso es más importante y tiene muchos pasos. Por favor léelo con paciencia.

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

/data/?areaid=101010100&type=index_f.date=201409041509&appid=15ds 45s 13a 465s",

"46s4ds_SmartWeatherAPI_45s44d6 " ,

TRUE)));

En primer lugar, se define el método para obtener la clave_pública y la API, y se define el método para realizar la operación de codificación en la clave.

Tenga en cuenta que todos los métodos aquí están definidos por mí en la clase getTime, seguidos de la creación de instancias en main.

//get publicky

-(NSString *)

getPublicKey: (ns string *) areaid: (ns string *) tipo: (ns string * )fecha

:(ns string *)appid {

ns string * Key =【[ns string alloc】

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

areaid, tipo, [índice de subcadena de fecha: 12], appid]; Return

Key;

}

//Obtener la API completa

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

: (NSString*) tipo: (NSString*) fecha: (ns string *) appid: (ns string *) clave

{

ns string * API =【[ns string alloc】

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

areaid, tipo, [índice de subcadena de fecha: 12], [índice de subcadena de appid: 6],

clave];

// - El ¡Lo principal que se necesita aquí es que solo se necesitan los primeros 6 dígitos del appid! ! !

Regresar

API

}

//Se obtendrá la operación clave de código de URL progresivo.

-(String

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

NSString *encodedString

= (_ _ puente NSString

*) cfurlccreatestringbyaddingpercentescapes(kCFAllocatorDefault, (CFStringRef)_key,

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

kcfstringencodingutf 8);

// Debido a la existencia de ARC, la conversión aquí necesita agregar __bridge, la razón es que no puedo' No lo sé. Por favor explique

Return

encodedString

}

El punto clave es que el algoritmo bajo oc es el siguiente, recuerde adjuntar Base64 .h

Agregarlo y hacer referencia al proyecto

//Cifrar la clave pública y la clave privada.

-(NSString *)

hmacsha 1: (ns cadena *) clave_ pública: (ns cadena *) clave_privada {

NSData*

secretData =【clave_privada

datos usando codificación: codificación de cadena nsu TF 8】;

datos ns * datos de cadena =【clave_pública

datos usando codificación: codificación de cadena nsu TF 8];

Constant void* keyBytes =

[secretData bytes];

const void * dataBytes =【datos de cadena

bytes】;

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

longitud del byte */

void * outs =

malloc(CC_sha 1_DIGEST_LENGTH);

CCH MAC(kcchmacalgsha 1, keyBytes,

[longitud de datos secretos], dataBytes, [stringData length], outs);

//

Solución 1

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

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

Volver

[Datos de firma

p>

codificado en base 64 string];

}

Esta es solo una clave preliminar, no ha sido codificada y el navegador no puede reconocer el enlace, por lo que el algoritmo La _key obtenida ahora tiene una paso más para obtener la clave real.

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

obtener clave pública:areaid:type:date:appid]:private_key];

NSString *key =

[getTime

stringyencodingurlformat:_ key];

¡El último paso! API de empalme

ns cadena * API meteorológica =[getTime getAPI:areaid:type:date

:appid

:key];

//Está bien, se puede utilizar nuestra API.

Finalmente, el valor devuelto a través de la API es un archivo JSON y podemos obtener los datos que queremos mediante el análisis. Tomemos como ejemplo una interfaz desarrollada.

diccionario ns * clima DIC =【getTime

getweather DIC:@"/data/city info/101010100 .html"】;

//Almacenado en Los datos del diccionario WeatherDIC también son una palabra típica de la que se toma el valor clave.

NSDictionary

* información meteorológica =[tiempo DIC

objectForKey:@"información meteorológica"];

NSLog(@"Hoy Sí% @% @ @La condición climática es:% @% @-

%@“, [nueva fecha uno subcadena con rango:nsmakerage (0, 4)] [nueva fecha uno

substringWithRange:NSMakeRange (4, 2)] [nueva fecha uno

substringWithRange:NSMakeRange (6, 2)] [información meteorológica

objectForKey:@"weather"], [ WeatherInfo objectForKey:@"temp 1"], [información meteorológica

objectForKey:@"temp 2"]);

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

Aplicación del tiempo [5688:201108] Hoy es 04/09/2014, las condiciones meteorológicas son: soleado 17℃-30℃.

El contenido del diccionario WeatherInfo es-》{"weather info":{"city":"Beijing","city id":"101010100","temp 1":"17℃", "