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.