错误:从网址

时间:2015-10-12 09:34:04

标签: ios objective-c

当我将它们添加到浏览器时,我有2个图像URL和2个图像URL显示图像。 当我从URL获取图像并将其放入数组时出错。

案例1:我使用stringURL1,然后确定 enter image description here

案例2:我使用了stringURL2,然后,如你所见,它崩溃了! enter image description here

MyCode:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString* stringURL1 = @"https://www.wonderplugin.com/wp-content/uploads/2014/06/wordpress-lightbox-gallery.png";

    NSString* stringURL2 = @"http://cdn3.vox-cdn.com/uploads/chorus_asset/file/917470/iphone-6-travel-photo-review-mann-header.0.jpg";

    NSURL *url = [NSURL URLWithString:stringURL1];

    NSData* imageData = [[NSData alloc]initWithContentsOfURL:url];

    UIImage* image = [[UIImage alloc] initWithData:imageData];

    NSArray *arrayData = @[@"1", @"2", image];

    NSLog(@"%@",arrayData);


}

你能解释一下这个错误吗?

10 个答案:

答案 0 :(得分:3)

这是因为iOS9引起的。 iOS9需要安全连接,这是由https而不是http和足够强大的证书提供的。

有两种方法可以实现这一目标。

您需要访问https端点而不是http或仅修改.plist文件以绕过它们。

.plist中有一个名为NSAppTransportSecurity的词典,下面有NSAllowsArbitraryLoads布尔值。将此更改为YES将允许您绕过它们。

plist example

请记住,旁路是一种临时解决方案,会导致安全问题。

根据评论编辑

崩溃是因为连接永远不会发生。图像保持为零,并且您尝试将nil对象放入数组中,最终导致崩溃。

答案 1 :(得分:2)

您的问题与App Transport Security有关,其中HTTP被iOS 9阻止。

您需要使用以下内容编辑plist文件:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

在此处获取更多信息:Configuring App Transport Security Exceptions

根据Apple的文件:App Transport Security Technote

  

您可以在Info.plist中指定默认行为的例外   您的应用或扩展程序中的文件。使用属性列表中的键   特定例外或关闭App Transport Security。表1-1   显示键及其类型,并使用缩进指示   结构

enter image description here

答案 2 :(得分:2)

它是iOS 9的问题。 只需在信息列表中添加密钥。

<key>NSAppTransportSecurity</key>  
    <dict>  
        <key>NSAllowsArbitraryLoads</key><true/>  
    </dict> 

然后它的工作完美

答案 3 :(得分:2)

我的建议是不要尝试将图像保存为数组中的数据或图像对象。您最好将其保存为url或NSString,因为这可能会在以后出现大量数据时遇到问题。当您需要显示它时使用

   UIImageView *imgDisplay; // alloc it or take how you want to take it

 // UIImageView *imgDisplay=[[UIImageView alloc] init];

 // i is the index of your array  or if static use the number like 1,2, etc

   imgDisplay.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[arrayData objectAt Index:[i]]]]];

到目前为止,您的应用程序已崩溃,因为您使用的http不被认为是安全的。因此,如果您想要允许它,您必须转到info.plist并添加以下内容:

   <key>NSAppTransportSecurity</key>
   <dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
 </dict>

右键单击您的info.plist并将其作为源代码打开并添加上面的行。 然后你可以获取之前为零的图像和app崩溃。因为数组不能添加nil对象。 希望这可能对你有所帮助。 如果您遇到任何问题,可以报告。

答案 4 :(得分:1)

这是因为Apple在iOS 9中引入了App Transport Policy。我们应该使用安全连接。

第二个URL是“http”类型。所以它显示错误。

您可以通过在info.plist中提及Key来覆盖此行为。请参阅此链接 - https://stackoverflow.com/a/32754976/1423703

答案 5 :(得分:1)

检查您的控制台日志。它说callBackBlock_3

iOS 9.0上提供App Transport安全性。您需要在 plist 文件中的 NSAppTransportSecurity 下将 NSAllowsArbitraryLoads 键添加到YES。

答案 6 :(得分:1)

实际上,您正面临与网络传输安全相关的问题,它最近在iOS 9中引入。您需要在plist中添加以下条目。

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

答案 7 :(得分:1)

使用此代码 -

 NSString* stringURL1 = @"https://www.wonderplugin.com/wp-content/uploads/2014/06/wordpress-lightbox-gallery.png";

    NSString* stringURL2 = @"http://cdn3.vox-cdn.com/uploads/chorus_asset/file/917470/iphone-6-travel-photo-review-mann-header.0.jpg";

    NSURL *url = [NSURL URLWithString:stringURL1];

    NSData* imageData = [[NSData alloc]initWithContentsOfURL:url];

    UIImage* image = [[UIImage alloc] initWithData:imageData];


    NSURL *url1 = [NSURL URLWithString:stringURL2];

    NSData* imageData1 = [[NSData alloc]initWithContentsOfURL:url1];

    UIImage* image1 = [[UIImage alloc] initWithData:imageData1];

    NSMutableArray *arrayData = [[NSMutableArray alloc] initWithObjects:image,image1, nil];

    NSLog(@"%@",arrayData);

然后添加

  1. 添加NSAppTransportSecurity:Dictionary。
  2. 将名为“NSAllowsArbitraryLoads”的子项添加为布尔值:是
  3. enter image description here

    现在,清理您的项目并运行。

答案 8 :(得分:0)

我认为你面临iOS 9问题;所有请求必须是HTTPS。

您应该在plist中添加 NSAppTransportSecurity 并将其设置为 NSAllowsArbitraryLoads ,作为&#39;临时&#39;溶液

答案 9 :(得分:0)

它会解决你的崩溃问题;

UIImage* image = [[UIImage alloc] initWithData:imageData];
if (image) {
    NSArray *arrayData = @[@"1", @"2", image];
}