ios8 - त्रुटि डोमेन=NSURLErrorDomain कोड=-1005 "नेटवर्क कनेक्शन खो गया था।"




ios-simulator xcode6 (16)

Alamofire का उपयोग करते समय मैं इस समस्या का सामना कर रहा था। मेरी गलती यह थी कि मैं nil पैरामीटर भेजने के बजाय GET अनुरोध पर पैरामीटर के लिए एक खाली शब्दकोश [:] भेज रहा था।

उम्मीद है की यह मदद करेगा!

मेरे पास एक ऐसा एप्लिकेशन है जो आईओएस 7 और आईओएस 8 दोनों के साथ एक्सकोड 6-बीटा 1 और एक्सकोड 6-बीटा 2 पर ठीक काम करता है। लेकिन एक्सकोड 6-बीटा 3, बीटा 4, बीटा 5 के साथ मुझे आईओएस 8 के साथ नेटवर्क के मुद्दों का सामना करना पड़ रहा है लेकिन आईओएस 7 पर सब कुछ ठीक काम करता है। मुझे त्रुटि मिलती है "The network connection was lost." । त्रुटि निम्नानुसार है:

त्रुटि: त्रुटि डोमेन = NSURLErrorDomain कोड = -1005 "नेटवर्क कनेक्शन खो गया था।" UserInfo = 0x7ba8e5b0 {NSErrorFailingURLStringKey =, _kCFStreamErrorCodeKey = 57, NSErrorFailingURLKey =, NSLocalizedDescription = नेटवर्क कनेक्शन खो गया था।, _kCFStreamErrorDomainKey = 1, NSUnderlyingError = 0x7a6957e0 "नेटवर्क कनेक्शन खो गया था।"}

मैं नेटवर्क कॉल करने के लिए 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 की कोशिश की लेकिन फिर भी वही त्रुटि प्राप्त हुई।


आईओएस 8 डिवाइस पर चल रहा है, मेरे पास यह समस्या भी है। यह यहां कुछ और विस्तृत है और ऐसा लगता है कि आईओएस का कनेक्शन उन कनेक्शनों का उपयोग करने की कोशिश कर रहा है जो पहले से ही समाप्त हो चुके हैं। मेरी समस्या उस लिंक में रखी गई Keep-Alive समस्या के समान नहीं है, हालांकि यह एक ही अंतिम परिणाम प्रतीत होता है।

जब भी मुझे त्रुटि -1005 मिलती है तो मैंने एक रिकर्सिव ब्लॉक चलाकर अपनी समस्या को सही कर दिया है और कनेक्शन को काम करने से 100 बार पहले रिकर्सन लूप कर सकता है, भले ही कनेक्शन अंततः हो जाता है, हालांकि यह केवल रन पर केवल दूसरा जोड़ता है बार और मैं शर्त लगाता हूं कि एनएसएलओजी को मेरे लिए प्रिंट करने के लिए डीबगर लेता है।

यहां बताया गया है कि मैं 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 subclass का उपयोग करता AFHTTPRequestOperation लेकिन अपना स्वयं का अनुरोध कोड जोड़ता AFHTTPRequestOperation । महत्वपूर्ण हिस्सा recurse(@offset.intValue+1)); को कॉल कर रहा है recurse(@offset.intValue+1)); ब्लॉक को फिर से बुलाया जा सकता है।


आईओएस 8.0 सिम्युलेटर रनटाइम में एक बग है जिससे सिम्युलेट डिवाइस बूट होने पर आपका नेटवर्क कॉन्फ़िगरेशन बदलता है, सिम्युलेटेड रनटाइम में उच्च स्तरीय एपीआई (उदाहरण: सीएफनेटवर्क) को लगता है कि यह नेटवर्क कनेक्टिविटी खो गया है। वर्तमान में, सलाह दी गई है कि जब आपका नेटवर्क कॉन्फ़िगरेशन बदलता है तो सिम्युलेट डिवाइस को रीबूट करना है।

यदि आप इस समस्या से प्रभावित हैं, तो कृपया इसे प्राथमिकता बढ़ाने के लिए http://bugreport.apple.com पर अतिरिक्त डुप्लिकेट रडार दर्ज करें।

यदि आप नेटवर्क कॉन्फ़िगरेशन को बदले बिना इस समस्या को देखते हैं, तो यह ज्ञात बग नहीं है, और आपको निश्चित रूप से एक रडार दर्ज करना चाहिए, यह इंगित करता है कि समस्या ज्ञात नेटवर्क-कॉन्फ़िगरेशन-बदली हुई बग नहीं है।


कंप्यूटर को पुनरारंभ करने से Xcode9.1 के साथ मेरे लिए समस्या ठीक हो गई। मैंने सिम्युलेटर और एक्सकोड को पुनरारंभ किया था, यह काम नहीं करता है।


जब भी त्रुटि -1005 हो तो फिर एपीआई को कॉल करने की आवश्यकता है।

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... 
       }
  }];

आपको फिर से कॉल फ़ंक्शन पर अपना कोड जोड़ना होगा। एक बार अन्यथा कॉल रिकर्सिव लूप के बाद आप कॉल विधि कहें।


जब मैं xcode 6.2 बीटा का उपयोग कर रहा था तो मुझे आईओएस 7 डिवाइस पर त्रुटि भी मिल रही थी। xcode 6.2 बीटा से 6.1.1 पर वापस स्विचिंग इस मुद्दे को ठीक किया गया। कम से कम ios7 डिवाइस पर।


महीनों के लिए समस्या मिली, और आखिरकार पता चला कि जब हम अपने एपीआई डोमेन पर DNSSEC को अक्षम करते हैं, तो सबकुछ ठीक था: simple_smile:


मुझे XCode से बाहर निकलना पड़ा, DerivedData फ़ोल्डर सामग्री (~ / लाइब्रेरी / डेवलपर / एक्सकोड / DerivedData या / लाइब्रेरी / डेवलपर / एक्सकोड / DerivedData) हटाएं और इस काम को करने के लिए बाहर निकलें सिम्युलेटर।


मुझे निम्नलिखित कारणों से यह मुद्दा था।

टीएलडीआर: जांचें कि क्या आप एक GET अनुरोध भेज रहे हैं जो NSURLRequest's HTTBody संपत्ति NSURLRequest's HTTBody बजाय यूआरएल पर पैरामीटर भेजना चाहिए।

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

मैंने अपने ऐप पर एक नेटवर्क एब्स्ट्रक्शन लगाया था, और यह मेरे सभी अनुरोधों के लिए बहुत अच्छी तरह से काम कर रहा था।

मैंने एक और वेब सेवा (मेरा स्वयं नहीं) के लिए एक नया अनुरोध जोड़ा और उसने मुझे यह त्रुटि फेंकना शुरू कर दिया।

मैं एक खेल के मैदान में गया और जमीन से एक बेयरबोन अनुरोध बनाने के लिए शुरू किया, और यह काम किया। इसलिए जब तक मुझे कारण नहीं मिला तब तक मैंने अपने अमूर्तता के करीब घूमना शुरू कर दिया।

मेरे अमूर्त कार्यान्वयन में एक बग था: मैं एक अनुरोध भेज रहा था जो यूआरएल में एन्कोड किए गए पैरामीटर भेजना था और मैं क्वेरी पैरामीटर के साथ NSURLRequest's HTTBody प्रॉपर्टी भी भर रहा था। जैसे ही मैंने HTTPBody हटा दिया, यह काम किया।


मुझे यह त्रुटि भी मिल रही थी, लेकिन सिम्युलेटर की बजाय वास्तविक उपकरणों पर। हमने एचटीटीपीएस (गनिकोर्न सर्वर) पर हमारे हेरोकू बैकएंड तक पहुंचने और बड़ी बोडी (64 केबी से अधिक कुछ) के साथ POSTS करने पर त्रुटि देखी। हम प्रमाणीकरण के लिए HTTP बेसिक एथ का उपयोग करते हैं, और ध्यान दिया कि त्रुटि का उपयोग नहीं किया गया था didReceiveChallenge: पर प्रतिनिधि विधि, बल्कि प्रमाणीकरण में मूल अनुरोध शीर्षलेख में प्रमाणीकरण को बेकिंग के माध्यम से बेकिंग Authentiation: Basic <Base64Encoded UserName:Password> । यह आवश्यक 401 को didReceiveChallenge: ट्रिगर करने के लिए didReceiveChallenge: प्रतिनिधि संदेश, और बाद में नेटवर्क कनेक्शन खो गया।


मेरे लिए समस्या का हल क्या सिम्युलेटर को पुनरारंभ करना था, और सामग्री और सेटिंग्स को रीसेट करना था।


मेरे लिए, सिम्युलेटर कार्यों की Resetting content and settings को Resetting content and settings । सिम्युलेटर रीसेट करने के लिए चरणों का पालन करें:

आईओएस सिम्युलेटर -> सामग्री और सेटिंग्स रीसेट करें -> रीसेट दबाएं (चेतावनी पर जो आएगा)


यदि किसी को बैकएंड सर्वर पर फ़ाइलों को अपलोड करते समय यह त्रुटि मिल रही है, तो सुनिश्चित करें कि प्राप्तकर्ता सर्वर का अधिकतम सामग्री आकार है जो आपके मीडिया के लिए स्वीकार्य है। मेरे मामले में, एनजीआईएनएक्स को एक उच्च client_max_body_size आवश्यकता client_max_body_size । एनजीआईएनएक्स अपलोड करने से पहले अनुरोध को खारिज कर देगा ताकि कोई त्रुटि कोड वापस न आए।


यदि किसी डिवाइस पर समस्या आ रही है, तो जांच करें कि ट्रैफ़िक प्रॉक्सी (सेटिंग्स> वाई-फ़ाई> (जानकारी)> HTTP प्रॉक्सी के माध्यम से जा रहा है या नहीं। चार्ल्स के साथ उपयोग करने के लिए मेरा डिवाइस सेटअप था, लेकिन प्रॉक्सी के बारे में भूल गया। लगता है कि चार्ल्स वास्तव में इस त्रुटि को चलाने के बिना होता है।


हमारे पास यह सटीक त्रुटि थी और यह NSURLRequest के अंतर्निहित HTTP कार्यान्वयन के साथ एक मुद्दा साबित हुआ:

जहां तक ​​हम कह सकते हैं, जब आईओएस 8/9/10/11 को एक Keep-Alive शीर्षलेख के साथ एक HTTP प्रतिक्रिया प्राप्त होती है, तो यह बाद में इस कनेक्शन को फिर से उपयोग करने के लिए रखती है (जैसा कि इसे करना चाहिए), लेकिन यह इसे अधिक से अधिक के लिए रखता है Keep-Alive शीर्षलेख का timeout पैरामीटर (ऐसा लगता है कि यह हमेशा 30 सेकंड के लिए कनेक्शन को जीवंत रखता है।) फिर जब 30 सेकंड से कम समय में ऐप द्वारा दूसरा अनुरोध भेजा जाता है, तो यह उस कनेक्शन को फिर से उपयोग करने का प्रयास करता है जो हो सकता है सर्वर द्वारा गिरा दिया गया (यदि असली Keep-Alive से अधिक हो गया है)।

यहां दिए गए समाधान यहां दिए गए हैं:

  • 30 सेकंड से ऊपर सर्वर के टाइमआउट पैरामीटर बढ़ाएं। ऐसा लगता है कि आईओएस हमेशा व्यवहार कर रहा है जैसे कि सर्वर Keep-Alive शीर्षलेख में दिए गए मान के बावजूद कनेक्शन को 30 सेकंड के लिए खुला रखेगा। (यह KeepAliveTimeout विकल्प को सेट करके अपाचे के लिए किया जा सकता है।
  • आप अपने ऐप के उपयोगकर्ता-एजेंट (उदाहरण के लिए अपाचे: BrowserMatch "iOS 8\." nokeepalive लिए आईओएस क्लाइंट्स के लिए जीवित तंत्र को निष्क्रिय कर सकते हैं BrowserMatch "iOS 8\." nokeepalive Mod file setenvif.conf )
  • यदि आपके पास सर्वर तक पहुंच नहीं है, तो आप Connection: close साथ अपने अनुरोध भेजने का प्रयास कर सकते हैं Connection: close हेडर: यह सर्वर को तुरंत कनेक्शन छोड़ने और जीवित शीर्षलेख रखने के बिना जवाब देने के लिए बताएगा। लेकिन फिलहाल, अनुरोधों को भेजे जाने पर NSURLSession Connection शीर्षलेख को ओवरराइड करना प्रतीत होता है (हमने इस समाधान का व्यापक परीक्षण नहीं किया क्योंकि हम अपाचे कॉन्फ़िगरेशन को ट्विक कर सकते हैं)

5 जनवरी को गिथूब पर pjebs टिप्पणी देखें।

विधि 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 अनुरोध दो बार फायरिंग

समाधान: साइट कनेक्शन से कनेक्शन करने के लिए एक विधि का उपयोग करें, वापसी (आईडी), यदि नेटवर्क कनेक्शन खो गया है, तो उसी विधि का उपयोग करने के लिए वापस आएं।

विधि 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;
     }

}






xcode6-beta5