2015-09-06 14 views
31

मैं वर्तमान में एक्सकोड 7 बीटा 6 पर काम कर रहा हूं। मैं http://mySubdomain.herokuapp.comऐप ट्रांसपोर्ट सिक्योरिटी एक्सकोड 7 बीटा 6

त्रुटि मैं प्राप्त है करने के लिए एक "हटाएँ" अनुरोध भेजने के लिए कोशिश कर रहा हूँ:

अनुप्रयोग परिवहन सुरक्षा एक क्लियर HTTP (http: //) अवरुद्ध कर दिया है संसाधन लोड के बाद से यह असुरक्षित है। अस्थायी अपवादों को आपके ऐप की Info.plist फ़ाइल के माध्यम से कॉन्फ़िगर किया जा सकता है।
एपीआई कॉल करने में त्रुटि: त्रुटि डोमेन = NSURLErrorDomain कोड = -1022 संसाधन लोड नहीं किया जा सका क्योंकि ऐप ट्रांसपोर्ट सुरक्षा नीति को एक सुरक्षित कनेक्शन के उपयोग की आवश्यकता है।
NSLocalizedDescription = संसाधन लोड नहीं किया जा सका क्योंकि अनुप्रयोग परिवहन सुरक्षा नीति एक सुरक्षित कनेक्शन के उपयोग की आवश्यकता है।, NSUnderlyingError = 0x796f7ef0 {त्रुटि डोमेन = kCFErrorDomainCFNetwork कोड = -1022 "(शून्य)"}}

मेरे वास्तविक एपीआई कॉल में मैंने "http" के बजाय "https" रखा और वास्तव में मेरे POST अनुरोधों के लिए काम किया। लेकिन DELETE अनुरोध उपर्युक्त त्रुटि फेंकता है।

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

प्रथम प्रयास:

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

दूसरा कोशिश:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>herokuapp.com</key> 
     <dict> 
      <key>NSIncludesSubdomains</key> 
      <true/> 
      <key>NSExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
      <key>NSExceptionRequiresForwardSecrecy</key> 
      <false/> 
      <key>NSExceptionMinimumTLSVersion</key> 
      <string>TLSv1.2</string> 
      <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
      <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> 
      <false/> 
      <key>NSThirdPartyExceptionMinimumTLSVersion</key> 
      <string>TLSv1.2</string> 
      <key>NSRequiresCertificateTransparency</key> 
      <false/> 
     </dict> 
    </dict> 
</dict> 

और अंत में, मैं भी तरह तो में इन सभी अस्थायी चाबियाँ डाल:

<key>NSAppTransportSecurity</key> 
    <dict> 
     <key>NSExceptionDomains</key> 
     <dict> 
      <key>herokuapp.com</key> 
      <dict> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
       <key>NSTemporaryIncludesSubdomains</key> 
       <true/> 
       <key>NSExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
       <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
       <key>NSExceptionRequiresForwardSecrecy</key> 
       <false/> 
       <key>NSTemporaryExceptionRequiresForwardSecrecy</key> 
       <false/> 
       <key>NSExceptionMinimumTLSVersion</key> 
       <string>TLSv1.2</string> 
       <key>NSTemporaryExceptionMinimumTLSVersion</key> 
       <string>TLSv1.2</string> 
       <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
       <key>NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
       <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> 
       <false/> 
       <key>NSTemporaryThirdPartyExceptionRequiresForwardSecrecy</key> 
       <false/> 
       <key>NSThirdPartyExceptionMinimumTLSVersion</key> 
       <string>TLSv1.2</string> 
       <key>NSTemporaryThirdPartyExceptionMinimumTLSVersion</key> 
       <string>TLSv1.2</string> 
       <key>NSRequiresCertificateTransparency</key> 
       <false/> 
       <key>NSTemporaryRequiresCertificateTransparency</key> 
       <false/> 
      </dict> 
     </dict> 
    </dict> 
कोई भाग्य के साथ

सब! मुझे हमेशा एक ही त्रुटि मिलती है। DELETE अनुरोध सही रूप से स्वरूपित किया गया है क्योंकि जब मैं मैन्युअल रूप से पोस्टमैन से करता हूं, तो मुझे वांछित परिणाम मिलते हैं।

class func makeDELETEALLRequest(completion: (error:Bool) -> Void) { 
     let session = NSURLSession.sharedSession() 
     let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean") 
     let request = NSMutableURLRequest(URL: url!) 
     request.HTTPMethod = "DELETE" 

     let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in 

      if (error != nil) { 
       print("Error making API call: \(error!)") 
       completion(error: true) 
      } else { 
       let HTTPResponse = response as! NSHTTPURLResponse 
       let statusCode = HTTPResponse.statusCode 
       if (statusCode == 200){ 
        print("Successfully deleted!") 
        completion(error: false) 
       } else { 
        print("Different status code: \(statusCode)") 
        completion(error: true) 
       } 
      } 
     } 
     task.resume() 
    } 

बार फिर, मैं उपयोग कर रहा हूँ Xcode 7 बीटा 6:

यहाँ मेरी वास्तविक API कॉल विधि कैसा दिखता है, अगर वहाँ यहाँ में समस्या हो सकती है।

मेरी चयनित उत्तर जवाब मैं के रूप में सही चयन किया क्योंकि मैं अपने प्रोजेक्ट में गलत plist फाइल करने के लिए सभी ये परिवर्तन किए और कहा कि इस सवाल का जवाब केवल एक ही है कि संभावना को संबोधित किया था मेरे लिए सही था के बारे में । अन्य उत्तरों द्वारा प्रदान किए गए समाधान गलत नहीं हैं, इसलिए इस समस्या का सामना करने वाले किसी अन्य व्यक्ति को उन्हें आज़माएं, क्योंकि वे मान्य हैं। मुझे आशा है कि इससे किसी को भी इसी तरह के मुद्दों में मदद मिलेगी।

+0

एक गाइड की जांच करने के वेब यूआरएल की स्वीकार्यता उपलब्ध है https://medium.com/@Mrugraj/app-transport-security-b7910c4fc70f। यह भविष्य के लिए समझने में मदद कर सकता है – Mrug

+0

पहला प्रयास मेरे मामले में काम करता है किसी भी तरह से मुझे यह उपयोगी लगता है इसलिए मेरे पास –

उत्तर

12

मुझे भी एक्सकोड 7.0 में अपग्रेड करने के बाद ऐप ट्रांसपोर्ट सिक्योरिटी को ओवरराइड करने में परेशानी थी, और उसी तरह के समाधानों का प्रयास करने के लिए आपको कोई फायदा नहीं हुआ। थोड़ी देर के लिए इससे दूर चलने के बाद, मैंने देखा कि मैंने प्रोजेक्ट में से किसी एक के बजाय "MyAppName टेस्ट" की सहायक फ़ाइलों के तहत Info.plist में परिवर्तन किए हैं। मेरी प्रोजेक्ट में सहायक फाइल फ़ोल्डर का विस्तार नहीं किया गया था, इसलिए मैंने इसमें Info.plist भी नहीं देखा था।

विशिष्ट शौकिया गलती, मुझे यकीन है, लेकिन वे प्रोजेक्ट नेविगेटर में केवल कुछ पंक्तियां हैं और जब तक मैंने भेदभाव नहीं देखा, तब तक मुझे निराशा हुई। सोचा कि अगर आपको एक ही समस्या हो रही है तो मैं इसका उल्लेख करूंगा।

37

की सराहना आप निम्नलिखित जोड़ने की कोशिश की है अपने plist फाइल करने के लिए,:

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

... आप अपने लाइन को बदलने की कोशिश करना चाह सकते हैं:

let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean") 

रहे हैं:

let url = NSURL(string:"http://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean") 

क्षमा करें यदि आपने यह कोशिश की है।मैं समझ सकता हूं कि जब आप सोचते हैं कि आपने सभी रास्ते समाप्त कर दिए हैं तो यह कितना निराशाजनक है।

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

44

मैंने इसे info.plist में कुछ कुंजी जोड़ने के साथ हल किया है। जैसा कि मैं कुछ देशी आवेदन के लिए उद्देश्य सी का उपयोग कर रहा हूं।

चरणों मैं पीछा कर रहे हैं:

  1. जोड़ा एक कुंजी एक Dictionary रूप NSAppTransportSecurity बुलाया खोला मेरी परियोजनाओं info.plist फ़ाइल।

  2. NSAllowsArbitraryLoads नामक एक उपकुंजी को Boolean के रूप में जोड़ा गया और इसके मान को YES पर निम्न छवि की तरह सेट करें।

enter image description here

स्वच्छ परियोजना और अब सब कुछ पहले की तरह के रूप में ठीक चल रहा है।

रेफरी लिंक:

  1. https://stackoverflow.com/a/32631185/2905967

  2. https://stackoverflow.com/a/32609970

4

मैं plist फ़ाइल के रूप में हल कर लिया है।
1. NSAppTransportSecurity : Dictionary जोड़ें।
2. NSAllowsArbitraryLoads के रूप में Boolean : YES

यह सबकुछ अच्छी तरह से काम करता है।

+0

के लिए अंगूठे हैं मेरे लिए अच्छी तरह से काम किया –

4

Xcode 8 में

  1. खोलें मेरी परियोजनाओं Info.plist फ़ाइल
  2. एक कुंजी एक शब्दकोश के रूप में AppTransportSecurity बुलाया जोड़ें।
  3. AllowsArbitraryLoads नामक एक उपकुंजी को बुलीयन के रूप में जोड़ें और इसके मान को निम्न छवि की तरह YES पर सेट करें।

enter image description here

संबंधित मुद्दे