Cómo utilizar la API de la Administración Meteorológica de China para desarrollar una aplicación meteorológica
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"; p>
NSString *type =
@"index_f";
/**
* El documento oficial ha actualizado el número de tipo de datos p>
* Índice: index_f (interfaz base); index_v (interfaz normal)
Previsión de 3 días: Forecast_f (interfaz base Forecast_v (interfaz normal)
*
*/ p>
*/
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 p>
*)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 p>
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"}}