ไม่สามารถโหลดทรัพยากรได้เนื่องจากนโยบายความปลอดภัยการขนส่งของแอปต้องการการเชื่อมต่อที่ปลอดภัย


491

ฉันกำลังประสบปัญหาเมื่อฉันอัปเดต Xcode เป็น 7.0 หรือ iOS 9.0 อย่างใดมันเริ่มให้ฉันข้อผิดพลาด Titled

"ไม่สามารถโหลดทรัพยากรได้เนื่องจากนโยบายความปลอดภัยในการขนส่งของแอปจำเป็นต้องใช้การเชื่อมต่อที่ปลอดภัย"

วิธีการบริการเว็บเซอร์:

-(void)ServiceCall:(NSString*)ServiceName :(NSString *)DataString
{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setAllowsCellularAccess:YES];
    [sessionConfiguration setHTTPAdditionalHeaders:@{ @"Accept" : @"application/json" }];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",ServiceURL]];
    NSLog(@"URl %@%@",url,DataString);
    // Configure the Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:[NSString stringWithFormat:@"%@=%@", strSessName, strSessVal] forHTTPHeaderField:@"Cookie"];
    request.HTTPBody = [DataString dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPMethod = @"Post";

    // post the request and handle response
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
                                          {
                                              // Handle the Response
                                              if(error)
                                              {
                                                  NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]);

                                                  // Update the View
                                                  dispatch_async(dispatch_get_main_queue(), ^{

                                                      // Hide the Loader
                                                      [MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] delegate].window animated:YES];


                                                  });
                                                  return;
                                              }
                                              NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL];
                                              for (NSHTTPCookie * cookie in cookies)
                                              {
                                                  NSLog(@"%@=%@", cookie.name, cookie.value);
                                                  strSessName=cookie.name;
                                                  strSessVal=cookie.value;

                                              }

                                              NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}];
[postDataTask resume];

}

บริการทำงานได้ดีสำหรับ Xcode รุ่นก่อนหน้าและ iOS รุ่นก่อนหน้า แต่เมื่อฉันได้อัปเดตเป็น Xcode 7.0 ที่อยู่ใน iOS 9.0 ฉันเริ่มมีปัญหาเช่นนี้เมื่อฉันเรียกใช้วิธีการบริการเว็บด้านบน บันทึกข้อผิดพลาดที่ฉันได้รับคือ:

การเชื่อมต่อล้มเหลว: ข้อผิดพลาดโดเมน = NSURLErrorDomain Code = -1022 "ไม่สามารถโหลดทรัพยากรได้เนื่องจากนโยบายความปลอดภัยในการขนส่งของแอปจำเป็นต้องใช้การเชื่อมต่อที่ปลอดภัย" UserInfo = {NSUnderlyingError = 0x7fada0f31880 {โดเมนข้อผิดพลาด = kCFErrorDomainCFNetwork รหัสความปลอดภัยของแอปพลิเคชัน= -1022 "(null)", NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURLการเชื่อมต่อ.}

ฉันได้ลองคำถามและคำตอบจากการติดตาม แต่ไม่ได้ผลลัพธ์ใด ๆ ที่นั่นมีความคิดล่วงหน้าว่าฉันจะลบข้อผิดพลาดการโทรได้หรือไม่

  1. ไม่สามารถโหลดทรัพยากรได้คือ ios9
  2. แอพ Transport Security Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

อาจเป็นไปได้ซ้ำซ้อนกับApp Transport Security Xcode 7 beta 6
AiOsN

คำตอบ:


935

ฉันแก้ไขมันด้วยการเพิ่มคีย์ใน info.plist ขั้นตอนที่ฉันติดตามคือ:

  1. เปิดinfo.plistไฟล์เป้าหมายของโครงการของฉัน

  2. เพิ่มความสำคัญที่เรียกว่าเป็นNSAppTransportSecurityDictionary

  3. เพิ่มคีย์ย่อยที่เรียกว่าNSAllowsArbitraryLoadsเป็นBooleanและการตั้งค่าของมันจะYESเป็นเหมือนภาพต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่

ทำความสะอาดโครงการและตอนนี้ทุกอย่างทำงานได้ดีเหมือนเมื่อก่อน

ลิงก์อ้างอิง: https://stackoverflow.com/a/32609970

แก้ไข: หรือในซอร์สโค้ดของinfo.plistไฟล์เราสามารถเพิ่ม:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>yourdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
       </dict>
  </dict>

5
มันไม่ทำงานในตอนแรก คุณต้องเพิ่มคีย์ภายในโครงการ> กำหนดเป้าหมายด้วย
orafaelreis


1
@MihirOza: ใช่ความปลอดภัยการขนส่งเป็นคุณลักษณะใหม่ของ iOS 9
Dominic K

2
หากคุณไม่มีโดเมนข้อยกเว้นให้ลบคีย์ใด ๆNSExceptionDomainsข้างล่าง มิฉะนั้นจะเป็นข้อยกเว้นNSAllowArbitraryLoadsจากนั้นคุณต้องใช้ https เพื่อเข้าชมเว็บไซต์นี้exception
DawnSong

7
สำหรับ Xcode 8.3 / Swift 3 เป็นApp Transport Security SettingsและAllow Arbitrary Loadsตามลำดับ
Swapna Lekshmanan

280

ระวังการใช้งานNSAllowsArbitraryLoads = trueในโปรเจ็กต์info.plistจะทำให้การเชื่อมต่อกับเซิร์ฟเวอร์ใด ๆ ไม่ปลอดภัย หากคุณต้องการให้แน่ใจว่าสามารถเข้าถึงได้เฉพาะโดเมนที่เฉพาะเจาะจงผ่านการเชื่อมต่อที่ไม่ปลอดภัยลองสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

หรือเป็นรหัสที่มา:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>domain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

ล้างข้อมูลและสร้างโครงการหลังจากแก้ไข


ขอบคุณสำหรับคำตอบของคุณเพียงแค่ NSAllowArbitaryLoads ไม่ได้ผลสำหรับฉันเพิ่ม NSExceptionAllowsInsecureHTTPLoads ได้หลอกลวง
neeta

1
ฉันยังเพิ่มสองคีย์เหล่านี้: <! - รวมเพื่ออนุญาตคำขอ HTTP -> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </key> <true /> <! - รวมถึงการระบุรุ่น TLS ขั้นต่ำ -> <key> NSTemporaryExceptionMinimumTLSVersion คีย์> <string> TLSv1.1 </string> มันทำให้โหลดเร็วขึ้นมากเช่นกัน
Sandy D.

หมายเหตุ: ฉันกำลังใช้ XCode 8 อยู่ตอนนี้: หากคุณกำลังทำสิ่งนี้ด้วยตนเองตรวจสอบให้แน่ใจว่าได้คลิกขวาที่โดเมน> ประเภทค่า> พจนานุกรมเพื่อเพิ่ม "..AllowsInsecure ... " และ "...
IncludeSubdomains

ไม่ทำงานหากฉันระบุหมายเลขพอร์ตหลัง domain.com (เช่น domain.com:3001)
Shamsiddin

43

ความปลอดภัยในการขนส่งมีให้ใน iOS 9.0 หรือใหม่กว่าและใน OS X v10.11 และใหม่กว่า

ดังนั้นโดยค่าเริ่มต้นการโทรแบบhttpsเท่านั้นที่ได้รับอนุญาตในแอพเท่านั้น หากต้องการปิด App Transport Security ให้เพิ่มบรรทัดต่อไปนี้ในไฟล์info.plist ...

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

สำหรับข้อมูลเพิ่มเติม:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33


แต่นี่ยังไม่อนุญาตให้ฉันทำการโทร HTTP ไปยังโดเมนใด ๆ มีเงื่อนงำทำไมมันเกิดขึ้น?
Mrug

แม้จะเป็น HTTP URL ก็ตาม URL shoulb จะได้รับการ bverified หรือควรมีใบรับรอง SSL แบบ vlid
Teja Kumar Bethina

35

สำหรับ iOS 10.x และ Swift 3.x [รองรับเวอร์ชันด้านล่างด้วย] เพียงเพิ่มบรรทัดต่อไปนี้ใน 'info.plist'

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

1
สำหรับ 10.x และ Swift 3.x ฉันเคยเห็นที่อื่น ๆ ว่ากุญแจคือ AppTransportSecurity และ AllowArbitraryLoads แต่มันผิด ส่วนนำหน้า NS ยังจำเป็นสำหรับปุ่มเหล่านี้แม้กระทั่ง Swift 3.x ข้อผิดพลาดหายไปเมื่อฉันอาศัยคำนำหน้า NS สำหรับคีย์เหล่านี้
Jazzmine

27

ใน Swift 4 คุณสามารถใช้ได้

-> Go Info.plist

-> คลิกที่เครื่องหมายบวกของรายการคุณสมบัติข้อมูล

-> เพิ่มการตั้งค่าความปลอดภัยการขนส่งแอพเป็นพจนานุกรม

-> คลิกที่ไอคอน Plus การตั้งค่าความปลอดภัยของการขนส่งแอพ

-> เพิ่มอนุญาตให้โหลดโดยพลการตั้งYES

ภาพร้องดูเหมือน

ป้อนคำอธิบายรูปภาพที่นี่


23

ฉันแก้ไขเป็นไฟล์ plist แล้ว

เพิ่ม NSAppTransportSecurity: พจนานุกรม

เพิ่มคีย์ย่อยชื่อ "NSAllowsArbitraryLoads" เป็น Boolean: YES

ป้อนคำอธิบายรูปภาพที่นี่


18

ไม่สามารถโหลดทรัพยากรได้เนื่องจากนโยบายความปลอดภัยการขนส่งของแอปต้องการการเชื่อมต่อที่ปลอดภัยซึ่งทำงานใน Swift 4.03

เปิด pList.info ของคุณเป็นซอร์สโค้ดและวาง:

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

13

จากเอกสารของ Apple

หากคุณกำลังพัฒนาแอพใหม่คุณควรใช้ HTTPS โดยเฉพาะ หากคุณมีแอพที่มีอยู่คุณควรใช้ HTTPS ให้มากที่สุดในตอนนี้และสร้างแผนสำหรับการโอนย้ายแอปที่เหลือของคุณโดยเร็วที่สุด นอกจากนี้การสื่อสารของคุณผ่าน API ระดับสูงต้องเข้ารหัสโดยใช้ TLS เวอร์ชัน 1.2 พร้อมการส่งต่อความลับ หากคุณพยายามเชื่อมต่อที่ไม่เป็นไปตามข้อกำหนดนี้จะเกิดข้อผิดพลาดขึ้น หากแอปของคุณต้องการขอโดเมนที่ไม่ปลอดภัยคุณต้องระบุโดเมนนี้ในไฟล์ Info.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>

เพื่ออนุญาตโดเมนที่ไม่ปลอดภัยทั้งหมด

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

อ่านเพิ่มเติม: การกำหนดค่าข้อยกเว้นด้านความปลอดภัยของแอพใน iOS 9 และ OSX 10.11




9

นี่เป็นวิธีบังคับให้ Apple รักษาความปลอดภัยให้แน่นขึ้นบน apis ของคุณ (บังคับให้ใช้ https ผ่าน http) ฉันจะอธิบายวิธีลบการตั้งค่าความปลอดภัยนี้


คำตอบส่วนใหญ่ที่นี่ชี้ให้เห็นการเพิ่มคีย์นี้ใน info.plist ของคุณ ป้อนคำอธิบายรูปภาพที่นี่

เพียงอย่างเดียวไม่ได้แก้ปัญหานี้ให้ฉัน ฉันต้องเพิ่มคีย์เดียวกันเข้าไปข้างใน

Project -> Targets -> Info -> Custom iOS Target Properties ป้อนคำอธิบายรูปภาพที่นี่


สิ่งนี้จะช่วยให้การเชื่อมต่อที่ไม่ปลอดภัยเกิดขึ้นจากใครก็ตาม หากคุณต้องการอนุญาตให้เฉพาะโดเมนที่ระบุเพื่อทำการเชื่อมต่อที่ไม่ปลอดภัยคุณสามารถเพิ่มข้อมูลต่อไปนี้ในข้อมูลของคุณได้

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณสิ่งนี้ใช้ได้สำหรับฉัน! ฉันแก้ไขไฟล์ plist ก่อนซึ่งไม่ได้ผล ฉันประหลาดใจว่าคนอื่นทำงานอย่างนั้นได้อย่างไร
โจนส์

8

คุณเพียงแค่ต้องใช้ HTTPS ไม่ใช่ HTTP ใน URL ของคุณและใช้งานได้


3
เว้นแต่คุณจะไม่สามารถใช้ HTTPS ได้เนื่องจาก Apple ไม่ชอบใบรับรองที่ลงชื่อด้วยตนเอง คุณไม่มีปัญหานั้นเหรอ?
Tony B

1
ในกรณีของฉันมันทำงานได้อย่างสมบูรณ์ตั้งแต่ฉันเปลี่ยนเป็น HTTPS
pierre23

1
แต่คุณใช้ใบรับรองที่ลงนามเองหรือ CA ที่ลงนามหรือไม่ แค่สงสัย. แน่นอนว่าเป็นปัญหาที่แยกต่างหาก แต่คิดว่าฉันจะถาม
Tony B

ฉันไม่ได้ทำงานบนฝั่งเซิร์ฟเวอร์ฉันไม่รู้จะซื่อสัตย์ :(
pierre23

การตั้งค่าการเชื่อมต่อ HTTPS ในสภาพแวดล้อมเซิร์ฟเวอร์ (โฮสติ้งที่ใช้ร่วมกัน) อาจเป็นเรื่องยาก
Raptor

7

หากคุณไม่ใช่แฟนตัวยงของ XML ให้เพิ่มแท็กด้านล่างลงในไฟล์ plist ของคุณ

ป้อนคำอธิบายรูปภาพที่นี่


5

iOS 9 (อาจ) บังคับให้นักพัฒนาใช้App Transport Securityโดยเฉพาะ ฉันได้ยินที่นี่แบบสุ่มดังนั้นฉันไม่รู้ว่านี่เป็นเรื่องจริงหรือเปล่า แต่ฉันสงสัยและได้มาถึงข้อสรุปนี้:

แอพที่รันบน iOS 9 จะ (อาจ) ไม่ได้เชื่อมต่อกับเซิร์ฟเวอร์ Meteor อีกต่อไปหากไม่มี SSL

ซึ่งหมายความว่าการใช้งาน meteor run ios หรือ run ios-meteor จะไม่ทำงานอีกต่อไป

ใน info.plist ของแอปNSAppTransportSecurity [Dictionary]จะต้องมีคีย์NSAllowsArbitraryLoads [Boolean]ที่จะตั้งค่าYESหรือ Meteor จะต้องใช้งานhttpsในlocalhost serverไม่ช้า


5

หากคุณใช้ Xcode 8.0 ถึง 8.3.3 และรวดเร็ว 2.2 ถึง 3.0

ในกรณีของฉันต้องเปลี่ยนใน URL http: //เป็นhttps: // (หากไม่ทำงานให้ลอง)

Add an App Transport Security Setting: Dictionary.
Add a NSAppTransportSecurity: Dictionary.
Add a NSExceptionDomains: Dictionary.
Add a yourdomain.com: Dictionary.  (Ex: stackoverflow.com)

Add Subkey named " NSIncludesSubdomains" as Boolean: YES
Add Subkey named " NSExceptionAllowsInsecureHTTPLoads" as Boolean: YES

ป้อนคำอธิบายรูปภาพที่นี่


3

เปิดpList.infoของคุณเป็นซอร์สโค้ดและที่ด้านล่างก่อน</dict>เพิ่มโค้ดต่อไปนี้

 <!--By Passing-->
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>your.domain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>1.0</string>
                <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
    </dict>
    <!--End Passing-->

และสุดท้ายเปลี่ยนyour.domain.comด้วย Url ฐานของคุณ ขอบคุณ


3

สำหรับผู้ที่คุณพัฒนาบน localhost ให้ทำตามขั้นตอนเหล่านี้:

  1. แตะปุ่ม "+" ถัดจากInformation Property Listและเพิ่มApp Transport Security SettingsและกำหนดDictionaryประเภท
  2. แตะที่ปุ่ม "+" ถัดจากที่สร้างขึ้นใหม่App Transport Security Settingsรายการและเพิ่มNSExceptionAllowsInsecureHTTPLoadsประเภทและการตั้งค่าของBooleanYES
  3. คลิกขวาที่NSExceptionAllowsInsecureHTTPLoadsรายการแล้วคลิกตัวเลือก "Shift Row Right" เพื่อทำให้รายการย่อยเป็นรายการด้านบน
  4. แตะปุ่ม "+" ถัดจากNSExceptionAllowsInsecureHTTPLoadsรายการและเพิ่มAllow Arbitrary LoadsประเภทBooleanแล้วตั้งค่าเป็นYES

หมายเหตุ: ในที่สุดควรมีลักษณะเหมือนนำเสนอในภาพต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่


2

ฉันจัดการเพื่อแก้ปัญหานี้ด้วยการผสมผสานของตัวเลือกที่กล่าวถึงมากมาย ฉันจะรวมรายการตรวจสอบของทุกสิ่งที่ฉันต้องทำเพื่อให้มันใช้งานได้

ในระยะสั้น:

  1. ตั้งค่าNSAllowsArbitraryLoadsเป็นจริงสำหรับส่วนขยายนาฬิกาของฉัน (ไม่ใช่แอปนาฬิกาของฉัน)
  2. ตรวจสอบให้แน่ใจฉันถูกใช้และไม่ได้httpshttp

ขั้นตอนแรก:

ประการแรกและชัดเจนที่สุดฉันต้องเพิ่มNSAppTransportSecurityคีย์เป็นพจนานุกรมในส่วนขยายนาฬิกาของฉันinfo.plistด้วยคีย์ย่อยที่เรียกว่าNSAllowsArbitraryLoadsเป็นบูลีนตั้งค่าเป็นจริง ตั้งค่านี้ในส่วนขยายนาฬิกาเท่านั้นไม่ใช่ตั้งค่า plist ของแอพนาฬิกา แม้ว่าจะรับทราบว่าสิ่งนี้อนุญาตการเชื่อมต่อทั้งหมดและอาจไม่ปลอดภัย

ป้อนคำอธิบายรูปภาพที่นี่

หรือ

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

ขั้นตอนที่สอง:

จากนั้นฉันต้องตรวจสอบให้แน่ใจว่า URL ที่ฉันพยายามโหลดนั้นhttpsไม่ใช่httpเท่านั้น สำหรับ URL ใด ๆ ที่ยังคงเป็น http ฉันใช้:

รวดเร็ว :

let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")

Obj-C:

NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];


2

ให้แน่ใจว่าคุณเปลี่ยนไฟล์ info.plist ขวา

นี่เป็นครั้งที่สองที่ฉันเสียเวลากับปัญหานี้เพราะฉันไม่ได้สังเกตว่าฉันกำลังเปลี่ยน info.plist ภายใต้ MyProjectNameUITests


1

ถ้าคุณใช้ firebase มันจะเพิ่มNSAllowsArbitraryLoadsInWebContent = trueในNSAppTransportSecurityส่วนและNSAllowsArbitraryLoads = trueจะไม่ทำงาน


ขอบคุณสำหรับข้อมูลนี้ คุณช่วยฉันแก้ไขปัญหาได้หลายชั่วโมง
pAkY88

0

ฉันได้แก้ไขปัญหานี้ในกรณีของการแยกวิเคราะห์เซิร์ฟเวอร์ที่โฮสต์ด้วยตนเองโดยใช้ใบรับรองที่ลงชื่อหนึ่งปีแทนที่จะใช้ตัวเลือก "NSAllowsArbitraryLoads"

แยกวิเคราะห์เซิร์ฟเวอร์เป็นเซิร์ฟเวอร์ใด ๆ node.js แสดงURL สาธารณะที่คุณต้องระบุ ตัวอย่างเช่น

แยกเซิร์ฟเวอร์ --appId - MasterKey --publicServerURL https: //your.public.url/some_nodejs

รู้สึกฟรีเพื่อดูไฟล์การกำหนดค่าของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.