2015-06-15 9 views
10

Ho un indirizzo di pagina Web che contiene un file JSON. Sto cercando di accedere al file JSON come NSDictionary in Swift 2. Ogni volta che chiamo NSData(contentsOfURL:url!) dove url è il tipo di NSURL?, restituisce nil. Utilizzo Xcode 7 Beta e il progetto è stato realizzato per la prima volta in Xcode 6.Swift 2: NSData (contentsOfURL: url) restituendo nil

Il seguente codice causa il problema.

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. 

Ciò che mi confonde è che quando provo la stessa cosa quando si digita lo stesso codice in Terminal utilizzando swift, la costante data non è impostato a zero. Ho provato a riavviare il Mac e non ha funzionato. Ho provato a reinstallare Xcode e non ha funzionato.

Questo è ciò che accade quando si digita il codice seguente sul terminale, utilizzando la parola chiave 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..........>) 

Quando provo nel terminale, ha funzionato sicuramente. Qualcuno può aiutarmi a risolvere il problema ??

+0

Si sta eseguendo in modalità sandbox quando non viene eseguito da 'swift'? – Aderstedt

risposta

13

Mi aspetto che funzioni nel terminale, poiché ciò che si vede qui non è probabilmente un bug in Swift o Cocoa Touch, ma gli effetti collaterali di una nuova funzionalità in iOS 9 sono denominati App Transport Security. Ciò significa che, per impostazione predefinita, iOS non ti consentirà di effettuare richieste server non protetti con SSL.

Citazione di link:

App Transport Security (ATS) consente un app aggiungere una dichiarazione al suo file Info.plist che specifica i domini con il quale ha bisogno di comunicazione sicuro. L'ATS impedisce la divulgazione accidentale, fornisce un comportamento predefinito sicuro ed è facile da adottare. Devi adottare ATS il prima possibile, indipendentemente dal fatto che tu stia creando una nuova app o aggiornando una esistente.

Se si sta sviluppando una nuova app, è necessario utilizzare esclusivamente HTTPS. Se hai un'app esistente, dovresti utilizzare HTTPS il più possibile al momento e creare un piano per la migrazione del resto della tua app il prima possibile.

Per risolvere questo problema, è possibile modificare il file info.plist per fare eccezioni su un dominio per dominio o disabilitare completamente la sicurezza del trasporto app. Ecco un esempio citato da 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> 

Anche se vi consiglio che in realtà non utilizza questa come soluzione e invece di utilizzare un URL https protetto SSL, invece.

+1

+ eleventy-zillion per "utilizzare invece un URL https SSL protetto". – rickster