2017-08-02 109 views
0

昨天,我在使用我的應用時發現了一個錯誤,當我嘗試下載AGPS文件並更新我的自行車電腦以便更快地定位時。 AGPS cound不能下載。iOS10 http請求成爲https請求,但有一些不是

步驟是我做檢查的bug。

  1. 檢查Safari上的AGPS文件(在我的Macbook Pro上),它可以成功下載。
  2. 在Chrome中打開的AGPS文件的URL,但不能下載,它讓我看到:

您的連線不是私人

攻擊者可能會試圖從alp.u-竊取你的信息blox.com(例如,密碼,消息或信用卡)。 NET :: ERR_CERT_DATE_INVALID

自動將一些系統信息和頁面內容發送給Google,以幫助檢測危險的應用程序和網站。隱私政策

  1. 在我的Android手機瀏覽器上打開AGPS URL,下載文件成功。
  2. 在我的iPhone Safari上打開AGPS URL,無法打開網頁。

然後我捕捉使用查爾斯的應用要求,它讓我看到真正的URL請求變更爲:

https://alp.u-blox.com/current_14d.alp 
-- http changed to https 

有人說這個問題是因爲iOS10的強制使用HTTPS所有HTTP請求。所以我在Info.plist上添加了一些設置。

<key>NSAllowsArbitraryLoads</key> 
<true/> 
<key>NSExceptionDomains</key> 
<key>sina.com.cn</key> 
<dict> 
    <key>NSExceptionAllowsInsecureHTTPLoads</key> 
    <true/> 
    <key>NSExceptionMinimumTLSVersion</key> 
    <string>TLSv1.0</string> 
    <key>NSExceptionRequiresForwardSecrecy</key> 
    <false/> 
    <key>NSIncludesSubdomains</key> 
    <true/> 
</dict> 

或類似這樣的

<key>NSAllowsArbitraryLoads</key> 
<true/> 
<key>NSExceptionDomains</key> 
<key>twitter.com</key> 
<dict> 
    <key>NSExceptionAllowsInsecureHTTPLoads</key> 
    <true/> 
    <key>NSExceptionRequiresForwardSecrecy</key> 
    <false/> 
    <key>NSIncludesSubdomains</key> 
    <true/> 
</dict> 

然後再捕捉要求,既沒有工作。

網絡要求如下代碼:

@property (nonatomic, strong) AFHTTPSessionManager *sessionManager; 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; 
NSURLSessionDownloadTask *downloadTask = [self.sessionManager 
              downloadTaskWithRequest:request 
              progress:^(NSProgress *_Nonnull downloadProgress) { 
               if (progressBlock) { 
                progressBlock((int64_t)downloadProgress.completedUnitCount, downloadProgress.totalUnitCount); 
               } 
              } 
              destination:^NSURL *_Nonnull (NSURL *_Nonnull targetPath, NSURLResponse *_Nonnull response) { 
               NSString *otaFilePath = [NSString stringWithFormat:@"%@/%@", kOTA_FIRMWARE_DOWNLOAD_DIR, [response suggestedFilename]]; 
               return [NSURL fileURLWithPath:otaFilePath]; 
              } 
              completionHandler:^(NSURLResponse *_Nonnull response, NSURL *_Nullable filePath, NSError *_Nullable error) { 
               if (error) { 
                xLog_error(@"[Error] 下載固件失敗, Error Message: %@", error.localizedDescription); 
                completeHandler(NO, nil); 
               } else { 
                completeHandler(YES, filePath.path); 
               } 
              }]; 
[downloadTask resume]; 

請求由NSURLSession也不能正常工作。

#import <Foundation/Foundation.h> 
NSDictionary *headers = @{ @"cache-control": @"no-cache", 
         @"postman-token": @"aa15f00a-bc58-082a-c8e3-e636537b7fa7" }; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL 
URLWithString:@"http://alp.u-blox.com/current_14d.alp"] 
              cachePolicy:NSURLRequestUseProtocolCachePolicy 
               timeoutInterval:10.0]; 
[request setHTTPMethod:@"GET"]; 
[request setAllHTTPHeaderFields:headers]; 

NSURLSession *session = [NSURLSession sharedSession]; 
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request 
             completionHandler:^(NSData *data, 
NSURLResponse *response, NSError *error) { 
              if (error) { 
               NSLog(@"%@", error); 
              } else { 
               NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
               NSLog(@"%@", httpResponse); 
              } 
             }]; 
[dataTask resume]; 

我的問題

  1. 不iOS10改變從http網址爲https?或由網絡服務器更改?
  2. 爲什麼url可以通過Safari(在PC上)打開,並且無法在Safari上打開(在iPhone上)?
  3. 爲什麼可以在Android上打開?

更多我做什麼

我從服務器獲取的文件,並將其上傳到一個文件中主機服務器:

http://okzqhpqwj.bkt.clouddn.com/current_14d.alp

https://www.qiniu.com/,複製這樣的文件地址

將網址放入代碼中,一切都很好,請求不會更改爲https。爲什麼??!!

任何幫助感謝,提前感謝。

+0

首先,如何使用iOS10發送http請求... –

+1

HTTP到HTTPS的轉發由Web服務器完成,與應用程序本身無關。另外,爲什麼要標籤Android?最後,請向我們展示您編寫的下載代碼。 – Raptor

+0

謝謝你,猛禽。我也測試Android版本的應用程序,請求相同的網址,並正常工作。 Android版本7.0。這也是一個我不能理解的問題,如果同一個網址,爲什麼Android可以訪問,但iOS10.0不能。 Android安全級別不同? –

回答

0

讓我來解釋一下NSAllowsArbitraryLoads究竟做了什麼。自的iOS 9,應用服務,而不NSAllowsArbitraryLoads或顯式地設置NSAllowsArbitraryLoadsfalse(缺省值)將阻止下列網址:

  1. 不安全HTTP連接(即HTTP://)
  2. HTTPS與TLS版本V1.2 <

不要將其設置爲true在生產環境中,和App評審會問理由將其設置爲true。僅允許使用必要的域名NSExceptionDomains

默認情況下,帶有無效證書的HTTPS也將被阻止AFNetworking。與此問題的方法,你應該使用的有效證書(把所有的證書有效&安全,始終是很重要的),或在你的文件的文件頭使用如下代碼:

#ifdef DEBUG 
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 
#endif 

相關Github上提交here


對於您的問題,下面是正確答案:

  1. 不iOS10變化t他從http到https的網址?或由網絡服務器更改?

它由網絡服務器完成,而不是應用程序本身。

  1. 爲什麼url可以通過Safari(在PC上)打開,並且無法在Safari上打開(在iPhone上)?

它似乎檢查用戶代理。通過改變用戶代理請仔細檢查和重試(提示:最簡單的方法是使用HTTP客戶端瀏覽器擴展/火狐附加組件進行測試)

  • 爲什麼它可以在Android被打開?
  • 相同的答案問題2

    希望它能幫助。

    +0

    謝謝,猛禽。 –

    +0

    如果我在發佈版本中使用AFNetworking,我仍然無法獲取http資源,對吧?我也嘗試使用NSURLSession下載文件,而不是使用AFNetworking,但仍然無法正常工作。 –

    +0

    對於生產環境(a.k.a.發行版),無論您是否使用AFNetworking,您都必須使用'NSExceptionDomains'來設置允許的域。你的問題是,SSL證書是無效的。要求網絡管理員使用有效的證書。 – Raptor