2017-08-02 44 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