如何獲取Public IP

之前一朋友問如何獲取Public IP,并沒有發(fā)現(xiàn)很好的方法,直到看到一文章(文章在這兒),才突然恍然大迷瞪,本地獲取Public IP或許并不是特別方便,但是在我們給后臺服務(wù)器發(fā)送請求時,后臺確是很容易可以獲取到Public IP的。因?yàn)樯掀恼率褂玫腁FNetworking的3.0之前的版本且依賴于AFNetworking,所以打算將其抽離重新總結(jié)一下。

如果還想了解一下獲取局域網(wǎng)IP的方法,之前在這里總結(jié)過

注意:這里使用還是HTTP的接口,在iOS9之后默認(rèn)是只支持HTTPS的,所以看之前的《iOS9總結(jié)》解決

使用NSURLSession來獲取數(shù)據(jù),還是借用上篇文章中的地址(用人家的東西要說一聲),在stackoverflow尋找解決方案時有幾個地址,但是畢竟有偉大的防火墻的存在,所以還是用這個國內(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];
}

使用時將其放到工具類中然后調(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上這兒

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,008評論 25 709
  • 名詞延伸 通俗的說,域名就相當(dāng)于一個家庭的門牌號碼,別人通過這個號碼可以很容易的找到你。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,805評論 2 56
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,616評論 30 472
  • 直接調(diào)用即可.h .m
    EnjoyWT閱讀 138評論 0 0

友情鏈接更多精彩內(nèi)容