NSURLSession / NSURLConnection HTTP लोड iOS 9 पर विफल रहा


137

IOS9 पर मेरे मौजूदा ऐप को चलाने की कोशिश की, लेकिन उपयोग करते समय विफलता हो रही है AFURLSessionManager

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

मुझे निम्नलिखित त्रुटि मिलती है:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

इसके अलावा निम्नलिखित लॉग हो रही है:

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

अद्यतन: मैंने अपने समाधान में कई अपडेट जोड़े हैं: NSURLSession / NSURLConnection HTTP लोड iOS 9 पर विफल रहा


आप निश्चित हैं कि पहली पंक्ति में त्रुटि हो रही है?
बीएसएमपी

1
मेरी भी यही समस्या थी। यह मुद्दा कवर करने के लिए लग रहा था: stackoverflow.com/questions/30720813/…
phillies2628

जवाबों:


240

मिला समाधान:

IOS9 में, एटीएस नेटवर्क कॉल के दौरान सर्वोत्तम प्रथाओं को लागू करता है, जिसमें HTTPS का उपयोग भी शामिल है।

Apple प्रलेखन से:

एटीएस आकस्मिक प्रकटीकरण को रोकता है, सुरक्षित डिफ़ॉल्ट व्यवहार प्रदान करता है, और अपनाने में आसान है। आपको जल्द से जल्द एटीएस को अपनाना चाहिए, भले ही आप एक नया ऐप बना रहे हों या किसी मौजूदा को अपडेट कर रहे हों। यदि आप एक नया ऐप विकसित कर रहे हैं, तो आपको विशेष रूप से HTTPS का उपयोग करना चाहिए। यदि आपके पास एक मौजूदा ऐप है, तो आपको HTTPS का उपयोग उतना ही करना चाहिए जितना आप अभी कर सकते हैं, और जितनी जल्दी हो सके अपने बाकी ऐप को माइग्रेट करने के लिए एक योजना बनाएं।

बीटा 1 में, वर्तमान में info.plist में इसे परिभाषित करने का कोई तरीका नहीं है। समाधान इसे मैन्युअल रूप से जोड़ना है:

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

यहां छवि विवरण दर्ज करें

Update1: यह एक अस्थायी वर्कअराउंड है जब तक आप iOS9 ATS सपोर्ट को अपनाने के लिए तैयार नहीं हो जाते।

Update2: अधिक जानकारी के लिए कृपया निम्न लिंक देखें: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3: यदि आप एक होस्ट (ORHOST.COM) से कनेक्ट करने का प्रयास कर रहे हैं जिसमें केवल TLS 1.0 है

इन्हें अपने ऐप के Info.plist में जोड़ें

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOURHOST.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>

10
ज्ञात हो कि आपने अभी-अभी एप्लिकेशन ट्रांसपोर्ट सिक्योरिटी से पूरी तरह छुटकारा पाया है, इसलिए एक प्रमुख iOS 9 फीचर सिर्फ आपके ऐप से चला गया है। यह एक हैक है, और मुझे आश्चर्य नहीं होगा यदि वह हैक आपके एपी को अस्वीकार कर दिया जाएगा। इस शब्दकोशों में विशेष वेबसाइटों को जोड़ने की अधिक संभावना होगी।
gnasher729

2
@StevenPeterson आप केवल ऐप्पल द्वारा केस-दर-मामला के आधार पर एक संपूर्ण ऐप को निकाल पाएंगे। मुझे लगता है कि अगर Apple इस क्षमता के साथ आपके ऐप को आशीर्वाद देता है, तो वे आपको इस कुंजी को शामिल करने का निर्देश देंगे। उम्मीद है कि Apple शायद ही ऐसा करे।
मटियोडे

8
कृपया, कृपया, कृपया, कृपया, कृपया - कृपया अपने प्लिस्ट को अपवाद न जोड़ें और "सिर्फ इसलिए कि यह काम करता है" पर आगे बढ़ें। अपने उपयोगकर्ता के डेटा की सुरक्षा पर विचार करें और SSL और अन्य सुरक्षा सर्वोत्तम प्रथाओं को लागू करें।
सांता क्लॉस

8
@ gnasher729, मैं केवल एटीएस को अक्षम करने के बजाय टीएलएस 1.2 का समर्थन करना बेहतर समझता हूं। हालाँकि, यदि आप तृतीय पक्ष API / वेब सेवा पर भरोसा करते हैं तो आप क्या कर सकते हैं। मैं उन्हें अपग्रेड करने के लिए मजबूर नहीं कर सकता, तो मैं क्या कर सकता हूं ??
वुडस्टॉक

7
इस जवाब में एक सूक्ष्म बग है: NSTemporaryExceptionMinimumTLSVersionउदाहरण के लिए होना चाहिए TLSv1.0 के बजाय 1.0 , NSAppTransportSecurity देख अपवाद डोमेन कुंजी शब्दकोश
एमबीआई

54

आईओएस 9 में एसएसएल से कैसे निपटें deal एक समाधान यह करना है:

जैसा कि Apple कहता है: यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

iOS 9 और OSX 10.11 को उन सभी मेजबानों के लिए TLSv1.2 SSL की आवश्यकता होती है, जब तक आप अपने ऐप की Info.plist फ़ाइल में अपवाद डोमेन निर्दिष्ट नहीं करते, तब तक आपसे डेटा अनुरोध करने की योजना है।

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 insecure 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>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

यदि आप ऐसा कर रहे हैं, तो शायद आपके सर्वर को TLSv1.2 और SSL का उपयोग करने के लिए अपडेट करना सबसे अच्छा है, यदि वे पहले से ही ऐसा नहीं कर रहे हैं। इसे एक अस्थायी समाधान माना जाना चाहिए।

आज तक, प्रीलेरेज प्रलेखन किसी भी विशिष्ट तरीके से इनमें से किसी भी कॉन्फ़िगरेशन विकल्प का उल्लेख नहीं करता है। एक बार ऐसा हो जाने पर, मैं संबंधित दस्तावेज़ से लिंक करने के लिए उत्तर को अपडेट कर दूंगा।

अधिक जानकारी के लिए, iOS9AdaptationTips पर जाएं


4
एसएसएल और टीएलएस एचटीटीपीएस प्रोटोकॉल द्वारा उपयोग की जाने वाली विभिन्न एन्क्रिप्शन परतें हैं। इस प्रकार, एक एसएसएल को पूरी तरह से अक्षम करना चाहिए और टीएलएस v1.2 या बाद में उपयोग करना चाहिए। अधिक जानकारी के लिए, मैं निम्नलिखित संसाधन के साथ शुरू करने की सलाह दूंगा: एसएसएल / टीएलएस सुरक्षा 2015 - एक सरलीकृत त्वरित गाइड
कॉनरोड टेलर

2
मैंने केवल नीचे के उदाहरण के साथ कोई भी भाग्य जोड़ा है जहां आप NSAllowsArbitwindLoads को सही पर सेट करते हैं। मेरा सर्वर टीएलएस v1.2 का विशेष रूप से उपयोग कर रहा है और मुझे इसे काम करने के लिए अभी भी करना है। अधिक निराश।
स्कूटर

1
तो क्या मुझे पता है कि मेरे नए ऐप को ऐप स्टोर में अप्रूव्ड सर्विस, जैसे प्रॉक्सी सर्विस के लिए इस्तेमाल किया जा सकता है, क्या कोई वर्कअराउंड है?
जोश

41

ऐप ट्रांसपोर्ट सिक्योरिटी पर ऐप्पल की तकनीक बहुत आसान है ; इससे हमें अपने मुद्दे का अधिक सुरक्षित समाधान खोजने में मदद मिली।

उम्मीद है कि इससे किसी और को मदद मिलेगी। हम अमेज़न S3 URL से जुड़ने वाले मुद्दे थे जो पूरी तरह से मान्य थे, TLSv12 HTTPS URL। पता NSExceptionRequiresForwardSecrecyचलता है कि हमें S3 का उपयोग करने वाले दूसरे मुट्ठी भर साइफर्स को सक्षम करने के लिए अक्षम करना था ।

हमारे में Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

यह मेरी सटीक समस्या थी, और इसे तुरंत ठीक कर दिया! धन्यवाद! :)
एलेक्स ज़ैक

इस समस्या का हल मेरे पास भी था; अलग-अलग मामलों में अलग-अलग सेटिंग्स की आवश्यकता हो सकती है। अच्छी खबर यह है कि वह टेक्नो में यह भी जानकारी रखता है कि सामान्य रूप से सही सेटिंग्स खोजने में आपकी मदद करने के लिए nsurl का उपयोग कैसे करें।
इकोटेक्स

अगर मुझे Amazon S3 के सामने CDN का उपयोग करना है, तो मुझे Cloudfront.net के लिए भी ऐसा करने की आवश्यकता थी।
रेमंड 26

7

यदि आप मेरे साथ अमेज़न S3 के साथ यह समस्या कर रहे हैं, तो इसे अपनी जानकारी पर चिपकाने का प्रयास करें। अपने शीर्ष स्तर के टैग के प्रत्यक्ष बच्चे के रूप में देखें।

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>

आप अधिक जानकारी यहां पा सकते हैं:

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue


2
भगवान आपको आशीर्वाद दे
Vervatovskis

5

मुझे यहाँ से समाधान मिला और यह मेरे लिए काम कर रहा है।

इसे जांचें, यह आपकी मदद कर सकता है।

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
         <dict>
             <key>myDomain.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>

4

बस अपनी .plist फ़ाइल में निम्न फ़ील्ड जोड़ें

यहां छवि विवरण दर्ज करें

सिंटेक्स इस तरह दिखता है:

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

यह सभी http अनुरोधों को अनुमति देगा। काम करता है, लेकिन अनुशंसित नहीं है।
केविश

2

अपडेट करें:

Xcode 7.1 के रूप में, आपको मैन्युअल रूप से NSAppTransportSecurityशब्दकोश में शब्दकोश दर्ज करने की आवश्यकता नहीं है info.plist

अब यह आपके लिए स्वत: पूर्ण होगा, यह एक शब्दकोष होगा, और इसके बाद Allows Arbitraryभार को भी स्वत: पूर्ण कर देगा । info.plist स्क्रीनशॉट


यह सभी http अनुरोधों को अनुमति देगा। काम करता है, लेकिन अनुशंसित नहीं है।
केविश

2

NSURLConnection का समाधान करें Http लोड विफल बग info.plist में निम्नलिखित निर्णय जोड़ें

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

1

मैंने info.plist में कुछ कुंजी जोड़कर इसे हल किया है। मैंने जिन चरणों का पालन किया है वे हैं:

मैंने अपनी परियोजना की info.plist फ़ाइल खोली

NSAppTransportSecurity नामक एक कुंजी को एक शब्दकोश के रूप में जोड़ा गया।

NSAllowsArbiteathLoads नामक एक उपकुंजी को बूलियन के रूप में जोड़ा गया और निम्न छवि की तरह इसका मान YES पर सेट किया गया। यहां छवि विवरण दर्ज करें

प्रोजेक्ट को साफ करें और अब पहले की तरह सबकुछ ठीक चल रहा है।

Ref Link: https://stackoverflow.com/a/32609970


1

यह त्रुटि होने पर मेरे लिए काम किया है:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

1

आप इस फ़ंक्शन को RCTHTTPRequestHandler.m फ़ाइल में जोड़ने का प्रयास कर सकते हैं

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }


1

उपर्युक्त उत्तरों के अलावा, अपने यूआरएल को फिर से जाँचें


मेरे मामले में मैं .html फ़ाइल लोड करने का प्रयास कर रहा था।
वैष्णवी

0

आप जोड़ना चाहिए App Transport Security Settingsकरने के लिए info.plistऔर जोड़ने Allow Arbitrary Loadsके लिएApp Transport Security Settings

यहां छवि विवरण दर्ज करें

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.