目标C谷歌地图API公钥函数



目前我在为给定的Google Maps Web Services API查询生成公钥时遇到问题。

该文档规定,签名必须在URL的路径和查询部分使用修改后的base-64 HMAC-SHA1哈希生成。

然而,使用该功能并使用该工具进行测试表明,它不能正常工作。

+ (NSString *) hmac:(NSString *)data withKey:(NSString *)key{
    const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
    NSString *hash = [HMAC base64EncodedStringWithOptions:0];
    hash = [hash stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
    hash = [hash stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
    return hash;
}

我调用这个函数时,数据已被预先编码;

[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

我哪里错了?非常感谢您的帮助。

您可以将其用于url签名:https://github.com/youssman/GMUrlSigner

我对您的反馈和意见很感兴趣;-)

Google有一个Objective C代码示例-您没有在代码中使用它们和一些Google函数有什么特别的原因吗?特别是,CKey的等价性不是普通的7位asCII(如您的示例中所编码的),而是Base64(rfc4648Base64WebsafeStringEncoding)。对于不熟悉的人来说,Base64通常在mime Mail中使用,以允许附件在几年前(在HTML Mail之前)通过纯文本电子邮件。问题是,如果谷歌认为你的密钥是Base64,而事实并非如此,解码将更改你的密钥-例如,ascii中的Base64 abcedfg=iy。。。所以谷歌没有从你的URL中获得正确的解码密钥。

还有其他的不同,但我想大多数只是格式上的不同。

最新更新