之前一朋友問如何獲取Public IP述吸,并沒有發(fā)現(xiàn)很好的方法剩彬,直到看到一文章(文章在這兒),才突然恍然大迷瞪阿纤,本地獲取Public IP或許并不是特別方便凳厢,但是在我們給后臺服務(wù)器發(fā)送請求時(shí)雾叭,后臺確是很容易可以獲取到Public IP的悟耘。因?yàn)樯掀恼率褂玫腁FNetworking的3.0之前的版本且依賴于AFNetworking,所以打算將其抽離重新總結(jié)一下织狐。
如果還想了解一下獲取局域網(wǎng)IP的方法暂幼,之前在這里總結(jié)過
注意:這里使用還是HTTP的接口,在iOS9之后默認(rèn)是只支持HTTPS的移迫,所以看之前的《iOS9總結(jié)》解決
使用NSURLSession來獲取數(shù)據(jù)旺嬉,還是借用上篇文章中的地址(用人家的東西要說一聲),在stackoverflow尋找解決方案時(shí)有幾個(gè)地址厨埋,但是畢竟有偉大的防火墻的存在邪媳,所以還是用這個(gè)國內(nèi)的地址比較靠譜,當(dāng)然最好還是自己后臺實(shí)現(xiàn)荡陷。
最直接的方式 show you the code
/*!
* @author JYFang
*
* @brief 獲取Public IP及其附加信息
*
* @param withInfo 是否需要IP的附加信息雨效,YES,則返回废赞,NO徽龟,則只返回IP
* @param completionBlock 返回信息的回調(diào)
*/
+ (void)requestPublicIPWithInfo:(BOOL)withInfo completionBlock:(void(^)(NSString * _Nullable publicIP, NSDictionary * _Nullable info, NSError * _Nullable error))completionBlock
{
[[[NSURLSession sharedSession]dataTaskWithURL:[NSURL URLWithString:@"http://ip.taobao.com/service/getIpInfo.php?ip=myip"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
completionBlock(nil,nil,error);
return ;
}
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
if (error) {
completionBlock(nil,nil,error);
return;
}
NSInteger code = [dataDict[@"code"]integerValue];
NSAssert(code == 0, @"The service response is wrong");
NSDictionary *info = dataDict[@"data"];
NSString *publicIp = info[@"ip"];
if (withInfo) {
completionBlock(publicIp,info,nil);
}else{
completionBlock(publicIp,nil,nil);
}
}]resume];
}
使用時(shí)將其放到工具類中然后調(diào)用就可以了
[Util requestPublicIPWithInfo:YES completionBlock:^(NSString * _Nullable publicIP, NSDictionary * _Nullable info, NSError * _Nullable error) {
if (error) {
NSLog(@"error = %@",[error description]);
return ;
}
NSLog(@"IP = %@ ,info = %@",publicIP,info);
}];
還有其他的一些處理方式,在stackoverflow上唉地,可以看這兒据悔,還有這兒
最后,代碼片段放到Github上這兒了