当我将它们添加到浏览器时,我有2个图像URL和2个图像URL显示图像。 当我从URL获取图像并将其放入数组时出错。
案例2:我使用了stringURL2,然后,如你所见,它崩溃了!
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);
}
你能解释一下这个错误吗?
答案 0 :(得分:3)
这是因为iOS9引起的。 iOS9需要安全连接,这是由https而不是http和足够强大的证书提供的。
有两种方法可以实现这一目标。
您需要访问https端点而不是http或仅修改.plist文件以绕过它们。
.plist中有一个名为NSAppTransportSecurity
的词典,下面有NSAllowsArbitraryLoads
布尔值。将此更改为YES
将允许您绕过它们。
请记住,旁路是一种临时解决方案,会导致安全问题。
根据评论编辑
崩溃是因为连接永远不会发生。图像保持为零,并且您尝试将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 显示键及其类型,并使用缩进指示 结构
答案 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);
然后添加
答案 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];
}