2015-06-15 12 views
10

मेरे पास एक वेबपृष्ठ पता है जिसमें एक JSON फ़ाइल है। मैं JSON फ़ाइल को स्विफ्ट 2 में NSDictionary के रूप में एक्सेस करने का प्रयास कर रहा हूं। हर बार जब मैं NSData(contentsOfURL:url!) पर कॉल करता हूं, जहां urlNSURL? का प्रकार है, तो यह nil देता है। मैं एक्सकोड 7 बीटा का उपयोग कर रहा हूं, और परियोजना को पहले एक्सकोड 6 में बनाया गया था।स्विफ्ट 2: एनएसडीटा (सामग्रीऑफ्लर: यूआरएल) रिटर्निंग शून्य

निम्नलिखित कोड समस्या का कारण बन रहा है।

let url = NSURL(string:myurl) // myurl is the webpage address. 
let data = NSData(contentsOfURL:url!) // the bit that returns nil 
// data is set to nil 
// I would perform NSJSONSerialization.JSONObjectWithData later. 

क्या मुझे भ्रमित कर रहा है जब मैं टर्मिनल में एक ही कोड का उपयोग कर swift टाइप जब मैं सटीक एक ही बात की कोशिश, निरंतर data शून्य पर सेट नहीं है कि है। मैंने मैक को रीबूट करने का प्रयास किया है, और यह काम नहीं किया। मैंने एक्सकोड को पुनर्स्थापित करने का प्रयास किया, और यह काम नहीं किया।

यह तब होता है जब मैं टर्मिनल पर निम्न कोड टाइप करता हूं, swift कीवर्ड का उपयोग करता हूं।

$> swift 
...... 
Welcome to Apple Swift version 2.0 (700.0.38.1 700.0.53). Type :help for assistance. 

1> import Foundation 
2> var urlstr = "http://mywebsiteaddress/jsonfile.json" 
3> var nsurl = NSURL(string:urlstr) 
nsurl: NSURL? = "http://mywebsiteaddress/jsonfile.json"{ 
    ObjectiveC.NSObject = {...} 
} 
4> var nsdata = NSData(contentsOfURL:nsurl!) 
nsdata: NSData? = 5925 bytes { 
    ObjectiveC.NSObject = {...} 
} 
5> print(nsdata) 
Optional(<Some Values..........>) 

जब मैं टर्मिनल में कोशिश करता हूं तो यह निश्चित रूप से काम करता है। क्या कोई मुझे समस्या हल करने में मदद कर सकता है ??

+0

क्या आप इसे 'स्विफ्ट' से नहीं चलाते समय सैंडबॉक्स मोड में चल रहे हैं? – Aderstedt

उत्तर

13

मैं इसे टर्मिनल में काम करने की उम्मीद करता हूं, क्योंकि आप यहां जो देख रहे हैं वह स्विफ्ट या कोको टच में कोई बग नहीं है, लेकिन आईओएस 9 में एक नई सुविधा के दुष्प्रभावों को App Transport Security कहा जाता है। इसका अर्थ यह है कि डिफ़ॉल्ट रूप से, आईओएस आपको उन सर्वरों को अनुरोध करने की अनुमति नहीं देगा जो एसएसएल के साथ सुरक्षित नहीं हैं। लिंक से

उद्धरण:

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

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

इसे ठीक करने के लिए, आप डोमेन जानकारी के आधार पर किसी डोमेन पर अपवाद बनाने के लिए अपनी जानकारी .plist फ़ाइल संपादित कर सकते हैं या पूरी तरह से ऐप ट्रांसपोर्ट सुरक्षा अक्षम कर सकते हैं। यहां CFNetwork SSLHandshake failed iOS 9 Beta 1 से उद्धृत एक उदाहरण दिया गया है।

<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> 

हालांकि मैं सलाह है कि आप वास्तव में अपने समाधान के रूप में इस का उपयोग नहीं करते और बदले बजाय एक SSL सुरक्षित https URL का उपयोग करें।

+1

+ ग्यारहवीं-ज़िलियन "इसके बजाय एक एसएसएल सुरक्षित https यूआरएल का उपयोग करें"। – rickster

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