Error Domain = NSURLErrorDomain Code = -1005“ การเชื่อมต่อเครือข่ายขาดหายไป”


268

ฉันมีแอปพลิเคชั่นที่ทำงานได้ดีบน Xcode6-Beta1 และ Xcode6-Beta2 ทั้ง iOS7 และ iOS8 แต่ด้วย Xcode6-Beta3, Beta4, Beta5 ฉันประสบปัญหาเครือข่ายกับ iOS8 แต่ทุกอย่างทำงานได้ดีบน iOS7 "The network connection was lost."ฉันได้รับข้อผิดพลาด ข้อผิดพลาดมีดังนี้:

ข้อผิดพลาด: Error Domain = NSURLErrorDomain Code = -1005 "การเชื่อมต่อเครือข่ายขาดหาย" UserInfo = 0x7ba8e5b0 {NSErrorFailingURLStringKey =, _kCFStreamErrorCodeKey = 57, NSErrorFailingURLKey =, NSLocalizedDescription = การเชื่อมต่อเครือข่ายขาดหายไป

ฉันใช้ AFNetworking 2.x และข้อมูลโค้ดต่อไปนี้เพื่อทำการโทรเครือข่าย:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setSecurityPolicy:policy];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager POST:<example-url>
   parameters:<parameteres>
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSLog(@“Success: %@", responseObject);
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          NSLog(@"Error: %@", error);
      }];

ฉันพยายามNSURLSessionแต่ยังคงได้รับข้อผิดพลาดเดียวกัน


มีอะไรอัพเดตไหม ? มันเกิดขึ้นบน iOS 8 บน Wifi สำหรับฉันเท่านั้นยังคงพยายามหาวิธีแก้ปัญหา
— Dimillian


ทุกคนสามารถช่วยฉันแก้ปัญหาของฉันได้เกือบเหมือนกัน แต่เป็นรหัสข้อผิดพลาดที่แตกต่างกัน stackoverflow.com/questions/26972822/…
— iYoung

1
กำลังเผชิญกับปัญหาเดียวกันกับ iOS 10.0.1 และ Xcode 8
— Satheeshwaran

1
ฉันได้รับข้อผิดพลาดในเช้าวันนี้และแก้ไขมันตอนนี้ด้วยวิธีที่ง่ายและแปลก ที่อยู่เซิร์ฟเวอร์ที่ร้องขอไม่ถูกต้องไม่มีรหัสสถานะ 4xx หรือ 5xx ถูกส่งกลับพบปัญหานี้ไม่แน่ใจว่าสาเหตุหลักคืออะไร ดังนั้นโปรดยืนยันกับผู้พัฒนาแบ็กเอนด์ในทีมของคุณหรือคุณจะเสียเวลาสองสามชั่วโมง
— Itachi

คำตอบ:


414

การรีสตาร์ทเครื่องมือช่วยแก้ไขปัญหาสำหรับฉัน


3
จะเกิดอะไรขึ้นหากปัญหานี้เกิดขึ้นบนอุปกรณ์ไม่ใช่ซิม พยายามรีสตาร์ทอุปกรณ์แล้วยังมีข้อผิดพลาดเหมือนเดิม
— ฌอนคลาร์ก

2
@SeanClark: ดูคำตอบถัดไป: การรีบูตเครื่องจำลองทำงานเนื่องจากระบบปฏิบัติการจำเป็นต้องยกเลิกการเชื่อมต่อที่ตายแล้วแทนที่จะพยายามใช้งานซ้ำอีกครั้งหลังจากเซิร์ฟเวอร์ถูกทิ้ง เมื่อต้องการแก้ไขปัญหานี้คุณสามารถปิดใช้งานกลไก Keep-alive บนเซิร์ฟเวอร์สำหรับไคลเอนต์ iOS หรือหากคุณไม่สามารถเข้าถึงเซิร์ฟเวอร์คุณสามารถลองคำขอเดียวกันซ้ำอีกครั้งเมื่อล้มเหลว (ควรจะล้มเหลว ระบบปฏิบัติการหล่นการเชื่อมต่อและระบบใหม่จะถูกสร้างอินสแตนซ์เมื่อส่งการลองใหม่)
— Arthur

ปัจจุบันฉันใช้ Xcode 6.2 และสิ่งที่แก้ไขได้คือการคลิกบน iOS Simulator> รีเซ็ตการตั้งค่าและเนื้อหา เมื่อเสร็จแล้วฉันออกจากโปรแกรมจำลองและสร้างใหม่และรันโครงการของฉัน ... ทุกอย่างทำงานได้อย่างสมบูรณ์แบบหลังจากนั้น
— KingPolygon

มันใช้งานได้สำหรับฉันในการรีเซ็ตเครื่องจำลอง แต่เพียง 10% ของเวลา ฉันเพิ่งได้รับ ISP ใหม่และมันก็แปลกดี สิ่งนี้เกิดขึ้นตลอดเวลาในโปรแกรมจำลอง อาจเป็นเครือข่าย
— noobsmcgoobs

1
การรีเซ็ตเครื่องจำลองใช้งานไม่ได้สำหรับฉัน อย่างไรก็ตามการเริ่มต้นของ Charles ทำให้ปัญหาหายไป ดูstackoverflow.com/a/26066764/598057ซึ่งแนะนำให้ใช้ Charles แปลกมาก แต่ใช้งานได้ ...
— Stanislav Pankevich

231

เราพบข้อผิดพลาดที่แน่นอนนี้และกลายเป็นปัญหากับการใช้ HTTP พื้นฐานของNSURLRequest:

เท่าที่เราสามารถบอกได้ว่าเมื่อ iOS 8/9/10/11 ได้รับการตอบกลับ HTTP ที่มีKeep-Aliveส่วนหัวมันจะทำให้การเชื่อมต่อนี้กลับมาใช้อีกครั้งในภายหลัง (เท่าที่ควร) แต่มันทำให้มันมากกว่าtimeoutพารามิเตอร์ของ ส่วนหัว Keep-Alive (ดูเหมือนว่าจะทำให้การเชื่อมต่อยังคงอยู่ตลอดเวลาเป็นเวลา 30 วินาที) จากนั้นเมื่อแอปส่งคำขอครั้งที่สองน้อยกว่า 30 วินาทีในภายหลังก็พยายามที่จะใช้การเชื่อมต่อที่อาจถูกทิ้งโดยเซิร์ฟเวอร์อีกครั้ง (ถ้าเกินจริงKeep-Aliveได้ผ่านไป)

นี่คือวิธีแก้ปัญหาที่เราพบจนถึงตอนนี้:

  • เพิ่มพารามิเตอร์การหมดเวลาของเซิร์ฟเวอร์ที่สูงกว่า 30 วินาที ดูเหมือนว่า iOS จะทำงานเหมือนว่าเซิร์ฟเวอร์จะเปิดการเชื่อมต่อเป็นเวลา 30 วินาทีโดยไม่คำนึงถึงค่าที่ให้ไว้ในส่วนหัว Keep-Alive (สามารถทำได้สำหรับ Apache โดยการตั้งค่าKeepAliveTimeoutตัวเลือก
  • คุณสามารถปิดใช้งานกลไก keep alive สำหรับไคลเอนต์ iOS โดยอิงตาม User-Agent ของแอพของคุณ (เช่น Apache: BrowserMatch "iOS 8\." nokeepaliveในไฟล์ mod setenvif.conf)
  • หากคุณไม่สามารถเข้าถึงเซิร์ฟเวอร์คุณสามารถลองส่งคำขอโดยใช้Connection: closeส่วนหัวซึ่งจะเป็นการบอกให้เซิร์ฟเวอร์ทำการเชื่อมต่อทันทีและตอบกลับโดยไม่ต้องมีส่วนหัวที่ยังมีชีวิตอยู่ แต่ในขณะนี้ NSURLSession ดูเหมือนจะแทนที่Connectionส่วนหัวเมื่อมีการส่งคำขอ (เราไม่ได้ทดสอบโซลูชันนี้อย่างกว้างขวางเนื่องจากเราสามารถปรับแต่งการตั้งค่า Apache ได้)

7
นี่เป็นโครงการตัวอย่างที่แสดงให้เห็นถึงปัญหารายงานข้อผิดพลาดได้ถูกส่งไปยัง Apple เช่นกัน cl.ly/Xgkl/keep-alive-fail.zipเปิดตัวโครงการคลิกที่ปุ่มโพสต์แรก (ด้านบนบนหน้าจอ) รอ 5 วินาทีคลิกอีกครั้งข้อผิดพลาด
— Dimillian

5
ยังมีชีวิตอยู่คือทวิภาคี ลูกค้าจะเพิ่มส่วนหัว http "การเชื่อมต่อ: Keep-Alive" โดยค่าเริ่มต้นการเพิ่มพารามิเตอร์แบบ keep-alive ในคำขอของไคลเอ็นต์อาจช่วยได้ เช่น "Keep-Alive: max = 1" ความคิดเห็นของ Arthur มีประโยชน์มาก แต่ยังบ่งชี้ว่ามีปัญหามากกว่า 1 ปัญหาในระบบเครือข่ายจำลอง iOS8 ฉันต้องใช้ https เพื่อรับการเชื่อมต่อเนื่องจาก http ล้มเหลวก่อนที่จะส่งคำขอ
— ptc

5
เฮ้ฉันมีปัญหาเดียวกันนี้บนอุปกรณ์ มีการแก้ไขสำหรับสิ่งนี้หรือไม่? แม้ว่าจะไม่มีปัญหากับ iOS 7
— Andres C

9
เคล็ดลับ: คุณสามารถใช้อย่างต่อเนื่องแทนฮาร์ดการเข้ารหัสNSURLErrorNetworkConnectionLost -1005
— Vincent Tourraine

6
ปัญหานี้ยังคงมีอยู่ใน iOS 11.2.6
— Makalele

47

สำหรับฉันแล้วResetting content and settingsSimulator ทำงานได้ ในการรีเซ็ตเครื่องจำลองทำตามขั้นตอน:

iOS Simulator -> รีเซ็ตเนื้อหาและการตั้งค่า -> กดรีเซ็ต (ตามคำเตือนที่จะมา)


29

รันไทม์จำลองของ iOS 8.0 นั้นมีข้อผิดพลาดหากการกำหนดค่าเครือข่ายของคุณเปลี่ยนแปลงในขณะที่อุปกรณ์จำลองถูกบู๊ต API ระดับสูงขึ้น (เช่น: CFNetwork) ในรันไทม์จำลองจะคิดว่าการเชื่อมต่อเครือข่ายขาดหายไป ในปัจจุบันการแก้ปัญหาที่แนะนำคือเพียงแค่รีบูตอุปกรณ์จำลองเมื่อการกำหนดค่าเครือข่ายของคุณเปลี่ยนไป

หากคุณได้รับผลกระทบจากปัญหานี้โปรดส่ง radars ที่ซ้ำกันเพิ่มเติมที่http://bugreport.apple.comเพื่อรับลำดับความสำคัญเพิ่มขึ้น

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


7
ฉันมีปัญหานี้ในอุปกรณ์ด้วย
— Darren

@darren แล้วมันไม่ใช่ปัญหาที่ฉันอ้างถึง ฉันแนะนำให้คุณยื่นเรดาร์
— Jeremy Huddleston Sequoia

4
โปรดใส่ ID เรดาร์ของคุณเพื่อให้การทำสำเนาซ้ำง่ายขึ้น
— Daniel Galasko

11

สิ่งที่แก้ไขปัญหาให้ฉันคือรีสตาร์ทเครื่องจำลองและรีเซ็ตเนื้อหาและการตั้งค่า


นอกจากนี้ยังช่วยในการฆ่าแอพก่อนที่ตัวจำลองจะรีเซ็ตและรีสตาร์ท Mac ฉันมักจะเปลี่ยนสถานที่ที่มีจุด wifi ที่แตกต่างกันและนี่เป็นขั้นตอนที่แก้ไขปัญหาให้ฉันได้
— VladimírSlavík

11

ยังมีปัญหากับเบต้า 5 และ AFNetworking 1.3 เมื่อใช้งานบน iOS 8 simulator ซึ่งส่งผลให้เกิดข้อผิดพลาดในการเชื่อมต่อ:

โดเมน = NSURLErrorDomain Code = -1005 "การเชื่อมต่อเครือข่ายขาดหาย"

รหัสเดียวกันนั้นใช้งานได้ดีบนเครื่องจำลอง iOS 7 และ 7.1 และพร็อกซีการดีบักของฉันแสดงว่าเกิดความล้มเหลวก่อนที่จะพยายามเชื่อมต่อจริง ๆ (เช่นไม่มีการร้องขอการบันทึก)

ฉันติดตามความล้มเหลวในการเชื่อมต่อ NSURLC และรายงานข้อผิดพลาดไปยัง Apple ดูบรรทัดที่ 5 ในรูปภาพที่แนบมา:

ผู้รับมอบสิทธิ์ไคลเอ็นต์ NSURLConnection ล้มเหลวผิดพลาด.

การเปลี่ยนเป็นการใช้httpsอนุญาตการเชื่อมต่อจากเครื่องจำลอง iOS 8 แม้ว่าจะมีข้อผิดพลาดเป็นระยะ ๆ

ปัญหายังคงมีอยู่ใน Xcode 6.01 (กรัม)


ฉันเห็นปัญหาเดียวกันกับ NSURLSession และ NSURLConnection นั่นเป็นปัญหาที่เกิดขึ้นกับ AFNetworking ฉันก็พบว่ามันใช้งานได้กับ https และล้มเหลวด้วย http ฉันยังหาวิธีแก้ปัญหาไม่พบคุณได้รับการแก้ไขไหม?
— VoidStack

ไม่มีการรายงานความละเอียดเป็นข้อผิดพลาด (18072300) จะเพิ่มความคิดเห็นเกี่ยวกับ https การทำงานที่เป็นข้อมูลที่ดี
— ptc

คุณสามารถวางลิงค์บั๊กที่นี่ได้ไหม? ขอบคุณเพราะฉันคิดว่าฉันมีปัญหาเดียวกัน แต่ฉันใช้เฉพาะ NSURLConnection (และผู้ได้รับมอบหมาย) แต่ฉันได้รับข้อความแสดงข้อผิดพลาดเดียวกัน
— szuniverse

ไม่สามารถแชร์รายงานข้อผิดพลาดของ Apple ยังคงเปิดอยู่และยังคงอยู่ใน XCODE 6 เบต้า 7 หากคุณยื่นรายงานข้อผิดพลาดด้วยซึ่งจะช่วยในการให้ความสำคัญ
— ptc

ดูเหมือนว่าปัญหานี้อยู่ในตัวจำลอง iOS และฉันเหนื่อยกับอุปกรณ์จริงมันใช้งานได้ดี การแก้จุดบกพร่องเพิ่มเติมฉันพบว่าปัญหาเกี่ยวกับพอร์ตในโปรแกรมจำลอง iOS, https พอร์ต 443 ทำงานได้ดีและฉันใช้ 8080 สำหรับ http มันใช้ล้มเหลว ฉันลองใช้พอร์ตอื่นและสามารถโทร http บนตัวจำลอง iOS ได้ ดูเหมือนข้อผิดพลาดในเบต้า Xcode 6 ต้องรอเสถียร Xcode 6
— VoidStack

10

ฉันประสบปัญหานี้ขณะใช้ Alamofire ความผิดพลาดของฉันคือฉันกำลังส่งพจนานุกรมเปล่า[:]สำหรับพารามิเตอร์ในGETคำขอแทนที่จะส่งnilพารามิเตอร์

หวังว่านี่จะช่วยได้!


รับและโพสต์ด้วยพจนานุกรมเนื้อความว่างเปล่า [:] จะทำให้เกิดข้อผิดพลาดนี้แบบสุ่ม ฉันใช้ Python Flask สำหรับ backend REST APIs ซึ่งอาจมีประโยชน์เช่นกัน
— Mahmoud Fayez

10

การเปิดชาร์ลส์แก้ไขปัญหาให้ฉันซึ่งดูเหมือนว่าแปลกมาก ...

Charles เป็น HTTP proxy / HTTP monitor / Reverse Proxy ที่ช่วยให้นักพัฒนาสามารถดูทราฟฟิก HTTP และ SSL / HTTPS ทั้งหมดระหว่างเครื่องกับอินเทอร์เน็ต ซึ่งรวมถึงคำขอการตอบกลับและส่วนหัว HTTP (ซึ่งมีคุกกี้และข้อมูลแคช)


1
สิ่งนี้ก็ใช้ได้กับฉันเช่นกันฉันคิดว่าเพราะ charles ใช้ใบรับรอง SSL เพื่อพร็อกซีการรวมตัวขอมันคล้ายกับการใช้ https
— thisispete

1
สิ่งนี้ใช้ได้กับฉันทุกครั้ง! ได้ลองแล้ว 30 ครั้งและใช้งานได้ 30 จาก 30 ฉันคิดว่ามันเป็นความบังเอิญ แต่ดีใจที่รู้ว่ามันไม่ใช่ตัวฉัน
— jdog

2
Charles เป็นเครื่องมือพร็อกซี่ที่ให้คุณรับชมปริมาณข้อมูลจากเครื่องของคุณ ตรวจสอบcharlesproxy.comเพื่อดูรายละเอียด ใบรับรอง SSL SSL สามารถยุ่งกับความสามารถของเครื่องจำลองในการสร้างคำขอเครือข่าย
— โคลิน Tremblay

@ColinTremblay ฉันคิดว่าอุปกรณ์จำลอง / คุณได้รับการกำหนดค่าให้ใช้พร็อกซี การลบพรอกซีจะทำงานได้เช่นกัน
— bikram990

มันก็ใช้ได้กับฉันเช่นกัน ต้องการให้ Charles เปิดแล้วรีเซ็ตการตั้งค่า iOS Simulator
— Matt Andrews

6

ดูความคิดเห็น pjebs เมื่อวันที่ 5 มกราคมใน Github

วิธีที่ 1:

if (error.code == -1005)
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

        dispatch_group_t downloadGroup = dispatch_group_create();
        dispatch_group_enter(downloadGroup);
        dispatch_group_wait(downloadGroup, dispatch_time(DISPATCH_TIME_NOW, 5000000000)); // Wait 5 seconds before trying again.
        dispatch_group_leave(downloadGroup);
        dispatch_async(dispatch_get_main_queue(), ^{
            //Main Queue stuff here
            [self redoRequest]; //Redo the function that made the Request.
        });
    });

    return;
}

บางคนแนะนำให้เชื่อมต่อกับเว็บไซต์อีกครั้ง

เช่นการยิงคำขอ POST สองครั้ง

วิธีแก้ไข: ใช้วิธีการเชื่อมต่อกับไซต์คืน (id) หากการเชื่อมต่อเครือข่ายขาดหายให้กลับไปใช้วิธีเดียวกัน

วิธีที่ 2

-(id) connectionSitePost:(NSString *) postSender Url:(NSString *) URL {
     // here set NSMutableURLRequest =>  Request

    NSHTTPURLResponse *UrlResponse = nil;
    NSData *ResponseData = [[NSData alloc] init];

    ResponseData = [NSURLConnection sendSynchronousRequest:Request returningResponse:&UrlResponse error:&ErrorReturn];

     if ([UrlResponse statusCode] != 200) {

          if ([UrlResponse statusCode] == 0) {

                  /**** here re-use method ****/
                  return [self connectionSitePost: postSender Url: URL];
          }

     } else {
          return ResponseData;
     }

}

วิธีที่ 1 ช่วยฉันได้มาก .. ขอบคุณ
— Abhishek Mitra

4

ฉันได้รับข้อผิดพลาดนี้เช่นกัน แต่ในอุปกรณ์จริงมากกว่าตัวจำลอง เราสังเกตเห็นข้อผิดพลาดเมื่อเข้าถึงแบ็กเอนด์ heroku ของเราบน HTTPS (เซิร์ฟเวอร์ gunicorn) และทำ POSTS ด้วย bodys ขนาดใหญ่ (มากกว่า 64Kb) เราใช้ HTTP ตรวจสอบสิทธิ์พื้นฐานสำหรับการตรวจสอบและพบข้อผิดพลาดได้รับการแก้ไขโดยไม่ได้ใช้didReceiveChallenge:วิธีการผู้รับมอบสิทธิ์ใน NSURLSession Authentiation: Basic <Base64Encoded UserName:Password>แต่อบในการตรวจสอบสิทธิ์ลงในส่วนหัวของคำขอเดิมผ่านทางเพิ่ม สิ่งนี้จะป้องกันไม่ให้ 401 จำเป็นต้องเรียกใช้didReceiveChallenge:ข้อความผู้รับมอบสิทธิ์และการเชื่อมต่อเครือข่ายที่ตามมาหายไป


ขอบคุณมากสำหรับความคิดเห็นอันมีค่าของคุณ คุณถูกต้องถ้าฉันอัปโหลดสตริง base64 ของอิมเมจ 64 kb รูปภาพจะอัปโหลดสำเร็จ
— Vinayak Bhor

3

ฉันมีปัญหาเดียวกัน วิธีการแก้ปัญหาได้ง่ายฉันได้ตั้งHTTPBodyแต่ยังไม่ได้ตั้งเพื่อHTTPMethod POSTหลังจากแก้ไขสิ่งนี้ทุกอย่างเรียบร้อยดี


3

ผมมีปัญหาเหมือนกัน. ฉันไม่ทราบว่า AFNetworking ใช้การร้องขอ https ได้อย่างไร แต่เหตุผลสำหรับฉันคือปัญหาแคชของ NSURLSession

หลังจากที่แอปพลิเคชันของฉันติดตามกลับจาก Safari แล้วโพสต์คำขอ http ข้อผิดพลาด "http load failed 1005" จะปรากฏขึ้น ถ้าฉันหยุดใช้"[NSURLSession sharedSession]"แต่ใช้อินสแตนซ์ NSURLSession ที่กำหนดค่าได้เพื่อเรียกใช้เมธอด "dataTaskWithRequest:" ดังต่อไปนี้ปัญหาจะได้รับการแก้ไข

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
config.URLCache = nil;
self.session = [NSURLSession sessionWithConfiguration:config];

config.URLCache = nil;ก็อย่าลืมชุด


1
ฉันคิดว่าอุปกรณ์ / ตัวจำลองการรีสตาร์ทหรือการรีเซ็ตข้อมูลควรดูคำตอบนี้ สำหรับฉันการกระทำทั้งหมดของพวกเขาดูเหมือนว่าจะล้างแคชซึ่งแก้ไขปัญหาได้จริง ดังนั้นปัญหาแคช URL อาจเป็นไปได้ ฉันกำลังจะทดสอบตอนนี้
— Kamran Khan

2

ฉันต้องออกจาก XCode ลบเนื้อหาโฟลเดอร์ DerivedData (~ / Library / Developer / Xcode / DerivedData หรือ / Library / Developer / Xcode / DerivedData) และออกจากโปรแกรมจำลองเพื่อทำงานนี้


1
การกระทำที่เกี่ยวข้องเฉพาะในรายการนั้นได้เริ่มการจำลองใหม่ การรีสตาร์ท Xcode และการลบข้อมูลที่ได้มานั้นมากเกินไป
— Jeremy Huddleston Sequoia

2

ฉันมีปัญหานี้เช่นกันที่ทำงานบนอุปกรณ์ iOS 8 รายละเอียดเพิ่มเติมได้ที่นี่และดูเหมือนว่าเป็นกรณีของ iOS ที่พยายามใช้การเชื่อมต่อที่หมดเวลาไปแล้ว ปัญหาของฉันไม่เหมือนกับปัญหา Keep-Alive ที่อธิบายในลิงก์นั้นอย่างไรก็ตามดูเหมือนว่าจะเป็นผลลัพธ์สุดท้ายเดียวกัน

ฉันแก้ไขปัญหาของฉันด้วยการเรียกใช้บล็อกแบบเรียกซ้ำเมื่อใดก็ตามที่ฉันได้รับข้อผิดพลาด -1005 และนี่ทำให้การเชื่อมต่อผ่านในที่สุดแม้ว่าบางครั้งการวนรอบสามารถวนซ้ำ 100 ครั้งก่อนการเชื่อมต่อใช้งานได้ ครั้งและฉันเดิมพันว่าเป็นเวลาใช้ดีบักเกอร์พิมพ์ NSLog ของฉัน

นี่คือวิธีที่ฉันเรียกใช้บล็อกแบบเรียกซ้ำด้วย AFNetworking: เพิ่มรหัสนี้ในไฟล์คลาสการเชื่อมต่อของคุณ

// From Mike Ash's recursive block fixed-point-combinator strategy https://gist.github.com/1254684
dispatch_block_t recursiveBlockVehicle(void (^block)(dispatch_block_t recurse))
{
    // assuming ARC, so no explicit copy
    return ^{ block(recursiveBlockVehicle(block)); };
}
typedef void (^OneParameterBlock)(id parameter);
OneParameterBlock recursiveOneParameterBlockVehicle(void (^block)(OneParameterBlock recurse, id parameter))
{
    return ^(id parameter){ block(recursiveOneParameterBlockVehicle(block), parameter); };
}

จากนั้นใช้แบบนี้:

+ (void)runOperationWithURLPath:(NSString *)urlPath
            andStringDataToSend:(NSString *)stringData
                    withTimeOut:(NSString *)timeOut
     completionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
    OneParameterBlock run = recursiveOneParameterBlockVehicle(^(OneParameterBlock recurse, id parameter) {
        // Put the request operation here that you want to keep trying
        NSNumber *offset = parameter;
        NSLog(@"--------------- Attempt number: %@ ---------------", offset);

        MyAFHTTPRequestOperation *operation =
            [[MyAFHTTPRequestOperation alloc] initWithURLPath:urlPath
            andStringDataToSend:stringData
            withTimeOut:timeOut];

        [operation setCompletionBlockWithSuccess:
            ^(AFHTTPRequestOperation *operation, id responseObject) {
                success(operation, responseObject);
            }
            failure:^(AFHTTPRequestOperation *operation2, NSError *error) {
                if (error.code == -1005) {
                    if (offset.intValue >= numberOfRetryAttempts) {
                        // Tried too many times, so fail
                        NSLog(@"Error during connection: %@",error.description);
                        failure(operation2, error);
                    } else {
                        // Failed because of an iOS bug using timed out connections, so try again
                        recurse(@(offset.intValue+1));
                    }
                } else {
                    NSLog(@"Error during connection: %@",error.description);
                    failure(operation2, error);
                }
            }];
        [[NSOperationQueue mainQueue] addOperation:operation];
    });
    run(@0);
}

คุณจะเห็นว่าฉันใช้ AFHTTPRequestOperationคลาสย่อย แต่เพิ่มรหัสคำขอของคุณเอง ส่วนที่สำคัญคือการเรียกrecurse(@offset.intValue+1));เพื่อให้บล็อกถูกเรียกอีกครั้ง


คลาส MyAFHTTPRequestOperation คืออะไร
— jdog

มันเป็นเพียงคลาสย่อย AFHTTPRequestOperation ฉันใช้เพื่อกำหนดสิ่งต่าง ๆ เช่นไทม์เอาต์และการพิสูจน์ตัวตน
— Darren

2

หากเกิดปัญหาบนอุปกรณ์ให้ตรวจสอบว่าทราฟฟิกกำลังผ่านพร็อกซี (การตั้งค่า> Wi-Fi> (ข้อมูล)> พร็อกซี HTTP หรือไม่ ฉันมีการตั้งค่าอุปกรณ์เพื่อใช้กับ Charles แต่ลืมเกี่ยวกับพร็อกซี ดูเหมือนว่าไม่มี Charles ที่ใช้งานจริงข้อผิดพลาดนี้เกิดขึ้น


2

หากใครก็ตามได้รับข้อผิดพลาดนี้ขณะอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์เบื้องหลังให้ตรวจสอบว่าเซิร์ฟเวอร์ที่รับมีขนาดเนื้อหาสูงสุดที่อนุญาตสำหรับสื่อของคุณ ในกรณีของฉัน NGINX client_max_body_sizeต้องสูงขึ้น NGINX จะปฏิเสธคำขอก่อนที่การอัปโหลดจะเสร็จสิ้นดังนั้นจึงไม่มีรหัสข้อผิดพลาดกลับมา


2

ฉันได้รับข้อผิดพลาดบนอุปกรณ์ iOS 7 เมื่อฉันใช้ Xcode 6.2 เบต้า

การสลับกลับจาก Xcode 6.2 เบต้าเป็น 6.1.1 แก้ไขปัญหาอย่างน้อยในอุปกรณ์ iOS 7


ฉันไม่คิดว่าจะมีสิ่งใดที่ต้องแก้ปัญหา: ระบบปฏิบัติการที่ใช้งานไม่ได้เชื่อมต่อด้วยเหตุผลที่ถูกต้องหรือไม่ แอปควรเตรียมที่จะจัดการกับมัน (ทำงานแบบออฟไลน์หรืออะไรก็ตาม) สมมติว่า SDK ใน xcode รุ่นเฉพาะของคุณไม่ใช่รถม้าเนื่องจากคำตอบของฉันชี้ให้เห็นว่า 6.2 นั้นมีแนวโน้มที่จะเป็นบั๊กซีในขณะที่ 6.1.1 นั้นดี สิ่งที่คล้ายกันสามารถสังเกตได้ในขณะนี้เมื่อ xcode 6.4 มีเสถียรภาพพอสมควรขณะที่ 7.0.1 เป็นซอฟต์แวร์เกรดอัลฟ่า หรือดังนั้นดูเหมือนว่า
— Anton Tropashko

2

ใน2017-01-25Apple เปิดตัวคำถาม & คำตอบทางเทคนิคเกี่ยวกับข้อผิดพลาดนี้:

Apple Q&A QA1941 ด้านเทคนิค

การจัดการข้อผิดพลาด“ การเชื่อมต่อเครือข่ายขาดหายไป”

ตอบ: NSURLErrorNetworkConnectionLost เป็นข้อผิดพลาด -1005 ในโดเมนข้อผิดพลาด NSURLErrorDomain และแสดงต่อผู้ใช้ว่า“ การเชื่อมต่อเครือข่ายขาดหายไป” ข้อผิดพลาดนี้หมายความว่าการเชื่อมต่อ TCP พื้นฐานที่มีการร้องขอ HTTP ถูกตัดการเชื่อมต่อในขณะที่คำขอ HTTP กำลังดำเนินการอยู่ (ดูด้านล่างสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้) ในบางสถานการณ์ NSURLSession อาจลองคำขอดังกล่าวอีกครั้งโดยอัตโนมัติ (โดยเฉพาะถ้าคำขอเป็น idempotent) แต่ในสถานการณ์อื่นที่ไม่ได้รับอนุญาตตามมาตรฐาน HTTP

https://developer.apple.com/library/archive/qa/qa1941/_index.html#//apple_ref/doc/uid/DTS40017602


1

ได้รับปัญหามาหลายเดือนและในที่สุดก็ค้นพบว่าเมื่อเราปิดการใช้งาน DNSSEC ในโดเมน api ของเราทุกอย่างก็โอเค: simple_smile:


2
คุณช่วยอธิบายรายละเอียดได้ไหม?
— Groot


1

ฉันถูกตีข้อผิดพลาดนี้เมื่อส่งผ่านไปยัง NSURLRequest NSURLSession โดยไม่ต้องตั้งคำขอของ HTTPMethod

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];

Error Domain = NSURLErrorDomain Code = -1005 "การเชื่อมต่อเครือข่ายขาดหาย"

เพิ่มHTTPMethodแม้ว่าและการเชื่อมต่อทำงานได้ดี

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
[request setHTTPMethod:@"PUT"];

1

ทดสอบว่าคุณสามารถขอได้จากแอพอื่น ๆ (เช่นซาฟารี) ถ้าไม่ใช่อาจเป็นอะไรในคอมพิวเตอร์ของคุณ ในกรณีของฉันฉันมีปัญหากับ Avast Antivirus ซึ่งกำลังบล็อกคำขอจำลองของฉัน (อย่าถามฉันว่าทำไม)


1

การรีสตาร์ทคอมพิวเตอร์แก้ไขปัญหาให้ฉันด้วย Xcode9.1 ฉันรีสตาร์ทเครื่องมือจำลองและ Xcode แล้วมันไม่ทำงาน


1

ฉันกำลังเผชิญปัญหาเดียวกันฉันได้เปิดใช้งาน Network Link Conditioner สำหรับการทดสอบเครือข่ายที่ช้าสำหรับแอป นั่นคือการสร้างข้อผิดพลาดนี้บางครั้งเมื่อฉันปิดการใช้งานมันSettings > Developer > Network Link Conditionerจะแก้ไขปัญหาของฉัน

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

หวังว่าจะช่วยคนได้


1

ในกรณีของฉันมันเป็นเพราะฉันกำลังเชื่อมต่อกับ HTTP และมันก็ทำงานบน HTTPS


0

ฉันมีปัญหานี้ด้วยเหตุผลดังต่อไปนี้

TLDR:ตรวจสอบว่าคุณกำลังส่งGETคำขอที่ควรจะส่งพารามิเตอร์ใน URL แทนที่จะเป็นบนNSURLRequest's HTTBodyคุณสมบัติ

==================================================

ฉันติดตั้งเครือข่ายที่เป็นนามธรรมในแอพของฉันและมันทำงานได้ดีสำหรับคำขอทั้งหมดของฉัน

ฉันเพิ่มคำขอใหม่ไปยังบริการเว็บอื่น (ไม่ใช่ของฉันเอง) และมันเริ่มส่งข้อผิดพลาดนี้ให้ฉัน

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

การติดตั้งนามธรรมของฉันมีข้อผิดพลาด: ฉันกำลังส่งคำขอที่ควรจะส่งพารามิเตอร์ที่เข้ารหัสใน URL และฉันก็เติมNSURLRequest's HTTBodyคุณสมบัติด้วยพารามิเตอร์แบบสอบถามเช่นกัน ทันทีที่ฉันลบHTTPBodyมันก็ใช้งานได้


0

ฉันได้รับข้อผิดพลาดนี้และพบว่าแอปพลิเคชันบุรุษไปรษณีย์ก็ตก แต่ทำงานในแอป Advanced Rest Client (ARC) และทำงานใน Android ดังนั้นฉันต้องติดตั้ง Charles เพื่อแก้ปัญหาการสื่อสารและฉันสังเกตเห็นว่ารหัสการตอบสนองคือ -1 ปัญหาคือโปรแกรมเมอร์ REST ลืมส่งคืนรหัสตอบกลับ 200

ฉันหวังว่านี่จะช่วยนักพัฒนาคนอื่น ๆ


0

เมื่อใดก็ตามที่มีข้อผิดพลาด -1005 ต้องเรียก API อีกครั้ง

AFHTTPRequestOperationManager *manager = 
[AFHTTPRequestOperationManager manager];
[manager setSecurityPolicy:policy];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager POST:<example-url>
   parameters:<parameteres>
    success:^(AFHTTPRequestOperation *operation, id responseObject) {
      NSLog(@“Success: %@", responseObject);
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      NSLog(@"Error: %@", error);
      if (error.code == -1005) {
          // Call method again... 
       }
  }];

คุณต้องเพิ่มรหัสของคุณเพื่อเรียกใช้ฟังก์ชันอีกครั้ง ทำให้แน่ใจว่าคุณเป็นวิธีการโทรหนึ่งครั้งมิฉะนั้นการโทรวนซ้ำแบบวนซ้ำ


0

ด้านบนของคำตอบทั้งหมดฉันพบทางออกที่ดีหนึ่ง ที่จริงปัญหาที่เกี่ยวข้องกับการเชื่อมต่อเครือข่ายล้มเหลวสำหรับ iOS 12 onword เป็นเพราะมีข้อผิดพลาดใน onword iOS 12.0 และมันยังไม่ได้รับการแก้ไข ฉันเคยผ่านชุมชนศูนย์กลางคอมไพล์สำหรับปัญหาที่เกี่ยวข้องกับเครือข่าย AFN เมื่อแอปมาจากพื้นหลังและพยายามทำการโทรผ่านเครือข่ายและไม่สามารถเชื่อมต่อได้ ฉันใช้เวลา 3 วันในการทำสิ่งนี้และพยายามทำหลายอย่างเพื่อหาสาเหตุของสิ่งนี้และไม่พบอะไรเลย ในที่สุดฉันก็ได้แสงในที่มืดเมื่อฉันบล็อกนี้ https://github.com/AFNetworking/AFNetworking/issues/4279

มันบอกว่ามีข้อผิดพลาดใน iOS 12 โดยทั่วไปคุณไม่สามารถคาดหวังว่าการโทรผ่านเครือข่ายจะสมบูรณ์หากแอพไม่ได้ทำงานในเบื้องหน้า และเนื่องจากข้อผิดพลาดนี้การโทรผ่านเครือข่ายลดลงและเราได้รับเครือข่ายล้มเหลวในบันทึก

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

อย่ารอให้แอปเปิ้ลปล่อยให้ปัญหานี้แก้ปัญหาสำหรับ iOS 12 เพราะยังคงต้องแก้ไข คุณอาจใช้วิธีแก้ปัญหานี้โดยให้การหน่วงเวลาสำหรับคำขอเครือข่ายของคุณคือ NSURLConnection, NSURLSession หรือ AFNetworking หรือ ALAMOFIRE ไชโย :)


0

ฉันประสบปัญหาเดียวกันในขณะที่โทรโดยใช้เซิร์ฟเวอร์ของ บริษัท ของฉันจากแอพ iOS 12 ด้วยอุปกรณ์ทางกายภาพ ปัญหาคือว่าเซิร์ฟเวอร์ฮาร์ดดิสก์เต็ม การเพิ่มพื้นที่ว่างในเซิร์ฟเวอร์แก้ปัญหาได้

ฉันพบข้อผิดพลาดเดียวกันในอีกสถานการณ์หนึ่งที่ฉันคิดว่าเนื่องจากการหมดเวลาใช้งานไม่สามารถผ่านเครือข่าย API มาตรฐานที่จัดทำโดย Apple ( URLSession.timeoutIntervalForRequestและURLSession.timeoutIntervalForResource) แม้ที่นั่น .. ทำให้เซิร์ฟเวอร์ตอบได้เร็วขึ้นแก้ปัญหาได้

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