¿Cómo utilizar la API de la Administración Meteorológica de China para desarrollar una aplicación meteorológica?
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℃", "