iOS 支持 IPv6

来源:http://www.cnblogs.com/dahe007/archive/2016/05/26/5527086.html
-Advertisement-
Play Games

蘋果的規定:2016年6月1日提交到App Store必須支持IPv6-only網路。 官方說明:https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOver ...


 

蘋果的規定:2016年6月1日提交到App Store必須支持IPv6-only網路。

 官方文檔:https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1

 

大多數應用APP 不需要任何改變,因為IPv6的已經被NSURLSession、CFNetwork、NSURLConnection 支持。

 

一、是否需要修改代碼

1、如果線上環境的APP 只使用功能變數名稱訪問,沒有使用IP地址,並且沒有使用底層socket API ,就不用修改代碼。

直接訪問IP地址 主要是用在測試環境中。

大多數app使用的:NSURLSession、NSURLConnection、UIWebView、WKWebView、CFNetwork。所以可以不用修改網路代碼,AFNetworking2.x、reachability 這些 都 不用做任何的改變。 

不過還是 推薦 大家升級AFNetworking到最新版本,畢竟NSURLConnection遲早要被淘汰。

用Swift寫的 就直接用 Alamofire吧。

 

2、Reachability不用IP地址,可以固定寫死為 線上功能變數名稱。也可以用 AFNetworking 的Reachability來判斷網路連接狀態(是非同步的,不用輸入功能變數名稱或IP)。

Reachability 最新版本 官方 聲明iOS8以上系統可以使用,經測試,iOS 7.0以上系統都可以使用。

 

3、iOS 9.0、OS X 10.11 以上的系統 在IPv6的環境下 是支持IP地址訪問網路的。所以大家測試機如果是 iOS9.0以上的系統,可以直接通過IP訪問。這是因為iOS 9.0之後 NSURLSession和CFNetwork能把IPv4的地址 合成IPv6的地址(在DNS64/NAT64網路環境中)。

iOS 9.0以下的系統 就會報錯,這和是否升級 AFNetworking 沒有關係。就算升級AFNetworking到3.x,也是一樣會報:Error Domain=NSURLErrorDomain Code=-1001 等錯誤。

 

 官方圖片:

 

 

 

4、分享SDK

微信SDK、新浪微博SDK 都更新了版本,並聲明支持IPv6。

但是因為微信本身不支持IPv6,所以即使更新SDK到最新版本,分享到微信時,在微信的APP 還是會一直顯示網路無法連接。

測試發現,不更新 這些分享的SDK,也能相容IPv6。(等微信支持IPv6後,是否必須更新SDK 還不清楚)

友盟分享 官網建議升級SDK,個人也是推薦升級,如果實在不想升,應該也沒問題。

來個小插曲:

上星期友盟新發的5.2版本 的SDK 有 郵件、簡訊分享崩潰的bug,給他們提出了。他們昨天下午進行了升級。

 

 

 

二、現有APP支持IPv6的情況

1、絕大多數 都是支持IPv6的,比如:QQ,淘寶、大眾點評。

1.1、因為絕大多數的app 都使用的功能變數名稱,而不是ip地址。

1.2、並且沒有調用底層的socket api。

1.3、不需要進行DNS查找。


2、極少數app不支持IPv6,比如:微信。

 

 

三、DNS64/ NAT64

 DNS64/ NAT64過渡工作流程:

1、提供獨立的IPv4和IPv6連接 的 蜂窩網路,把IPv4的網路升級到IPv6

 

上圖只是理想狀態下,升級到IPv6的情況,但是現在絕大多數都是IPv4的伺服器,所以一些大的供應商開始實施DNS64/NAT64 的過度 來支持IPv6.

 

2、部署DNS64/NAT64 IPv6的蜂窩網路

 

客戶端請求 網站功能變數名稱,首先會通過DNS64伺服器 查詢該功能變數名稱是否存在 IPv6的地址,如果存在,就返回IPv6的地址。如果不存在,就去查找該功能變數名稱對應的IPv4地址,並返回。

下麵是詳細流程圖:

 

3、DNS64/NAT64 轉換 流程:

DNS64/NAT64 可以 將IPv4地址 轉換為IPv6,將IPv6地址解析成IPv4。

IPv4地址 轉換為IPv6:
客戶端訪問網站功能變數名稱 ,如果網站只有 IPv4 地址:56.111.211.22,轉成16進位: 38 6F D3 16,該16進位為IPv6的最後2位:   64:ff9b::386F:D316

 

 

 

四、搭建 IPv6 環境

MAC 的系統為 OS 10.11 及以上系統。

1、進入MAC 電腦的 “系統偏好設置”--》按住option/alt 鍵--》 點擊 “共用”

 

2、選中“創建NAT64網路”,然後打開熱點。

3、手機 連接 熱點後,查看網路的 DNS 為:XX:XX:XX:XX:XX:XX ,說明網路為IPv6。

 

下圖為MAC搭建IPv6 的原理圖:

 

 目前,一個網卡會同時使用這兩張地址;以後 一個網卡僅有IPv6 地址。 兩種設備不能直接訪問,需要DNS64/NAT64 這種 過渡技術才能 互相訪問。

 

五、升級AFNetworking2.X到最新版本

1、將  AFHTTPRequestOperationManager 替換為:  AFHTTPSessionManager

2、將  AFHTTPRequestOperation  替換為:NSURLSessionTask

3、如果通過IP訪問,或者允許https證書之外的功能變數名稱訪問,需要設置 validatesDomainName 為false:

AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];

manager.securityPolicy = [AFSecurityPolicy defaultPolicy];

manager.securityPolicy.allowInvalidCertificates = YES;  //忽略https證書

manager.securityPolicy.validatesDomainName = NO;    //是否驗證功能變數名稱

 

 

六、系統相容IPv6代碼

1、下麵的方法 只適用於IPv4,不能相容IPv6:

  • inet_addr()

  • inet_aton()

  • inet_lnaof()

  • inet_makeaddr()

  • inet_netof()

  • inet_network()

  • inet_ntoa()

  • inet_ntoa_r()

  • bindresvport()

  • getipv4sourcefilter()

  • setipv4sourcefilter()

 

2、如果有以下代碼處理IPv4類型,要確保IPv6的形式也被處理過:

IPv4

IPv6

AF_INET

AF_INET6

PF_INET

PF_INET6

struct in_addr

struct in_addr6

struct sockaddr_in

struct sockaddr_in6

kDNSServiceProtocol_IPv4

kDNSServiceProtocol_IPv6


3、使用系統API合成IPv6:

如果你的APP需要連接的伺服器 只有IPv4地址,沒有功能變數名稱,可以用 getaddrinfo 來解決。下麵的代碼,將IPv4地址(如:192.0.2.1) 地址轉換為IPv6地址(如:包含  64:ff9b::192.0.2.1  的struct sockaddr_in6 )

 

#include <sys/socket.h>

#include <netdb.h>

#include <arpa/inet.h>

#include <err.h>

 

 

    uint8_t ipv4[4] = {192, 0, 2, 1};

    struct addrinfo hints, *res, *res0;

    int error, s;

    const char *cause = NULL;

    

    char ipv4_str_buf[INET_ADDRSTRLEN] = { 0 };

    const char *ipv4_str = inet_ntop(AF_INET, &ipv4, ipv4_str_buf, sizeof(ipv4_str_buf));

    

    memset(&hints, 0, sizeof(hints));

    hints.ai_family = PF_UNSPEC;

    hints.ai_socktype = SOCK_STREAM;

    hints.ai_flags = AI_DEFAULT;

    error = getaddrinfo(ipv4_str, "http", &hints, &res0);

    if (error) {

        errx(1, "%s", gai_strerror(error));

        /*NOTREACHED*/

    }

    s = -1;

    for (res = res0; res; res = res->ai_next) {

        s = socket(res->ai_family, res->ai_socktype,

                   res->ai_protocol);

        if (s < 0) {

            cause = "socket";

            continue;

        }

        

        if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {

            cause = "connect";

            close(s);

            s = -1;

            continue;

        }

        

        break;  /* okay we got one */

    }

    if (s < 0) {

        err(1, "%s", cause);

        /*NOTREACHED*/

    }

    freeaddrinfo(res0);

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 利用PL/SQL可以進行模塊化程式設計。 在一個PL/SQL塊中,可以定義若幹個子程式。 把一些功能相對獨立、需要經常執行的代碼定義為一個子程式,在需要時根據子程式的名字進行調用。這樣不僅便於程式設計和編碼,而且利於程式的調試。PL/SQL有兩種形式的子程式,即過程和函數。 在子程式中也可以定義變數 ...
  • 談完並行執行的原理,咱們再來談談優化,到底並行執行能給我們帶來哪些好處,我們又應該註意什麼呢,下麵展開. Amdahl’s Law 再談並行優化前我想有必要談談阿姆達爾定律,可惜老爺子去年已經駕鶴先去了. 其中P:可以並行的百分比 N:演算法並行計算使用的”CPU” 這裡我們舉個簡單的例子,我們來做一 ...
  • 編寫PL/SQL塊的主要目的是對資料庫進行訪問,因此,在PL/SQL塊中可以包含SELECT語句、DML語句,還可以包含DCL語句。需要註意的是,在PL/SQL塊中不能直接包含DDL語句,如果要利用PL/SQL塊完成諸如創建表、修改表結構等操作,需要通過其他方法。通過SQL語句以及流控制語句,可以編 ...
  • 1.下載 mysql-mysql-5.1.55-win32.zip 2. 解壓縮到任何一個目錄,最好目錄名稱不要有空格; 例如:C:\mysql 3. 刪除Embedded,include,lib,mysql-test 這四個目錄。 註:這四個目錄占了300多M,刪除後,只有不到100M。 3,在c... ...
  • 1 NSURLConnettion NSURLConnettion是 Core Foundation/CFNetwork框架 API 之上的一個抽象. NSURLConnettion是用來指代 Foundation 框架中的一系列組件: NSURLRequest,NSURLResponse,NSUR ...
  • 1.效果圖 2.源代碼 MainActivity.java public class MainActivity extends AppCompatActivity { public enum ChartType { LINE_CHART, COLUMN_CHART, PIE_CHART, BUBBL... ...
  • BaseControl按鈕合集 效果 源碼 https://github.com/YouXianMing/Animations 說明 本人一共封裝了3種按鈕的基類控制項,以上是一個示例演示,演示如何通過繼承來實現想要的效果. ...
  • Most tools require installation on your computer before you can use them. If the installation is easy, you may think that’s fine. But it can be an unn ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...