App maken: ook jij kunt het leren!

 

de iOS Academie Forums

Forums - App-ontwikkeling - Swift en iOS: IOS 9 NSURLSession HTTP - HTTPS issue

Rob  Op de eerste vier stappen van zijn/haar studiekaart scoort Rob 35%. Klokje11 jun 2015, 19:13
Avatar
Avatar
Berichten:9


Hallo,

Als beginnende IOS programmeur ben ik begonnen met het converteren van mijn app naar Xcode 7 en IOS 9 (pfff). Mijn app maakt gebruik van NSURLSession voor het ophalen van JSON uit een database. Ik maak hierbij verbinding met HTTP naar een webserver. In IOS 9 kreeg ik echter geen connectie meer met mijn server. In het debug venster constateerde ik dat Xcode (simulator) de sessie probeerde op te bouwen met HTTPS i.p.v HTTP. Dit terwijl ik HTTP meegeef aan de request. Blijkbaar wordt nu afgedwongen dat HTTPS gebruikt gaat worden??

Na twee dagen zoeken ben ik er achter hoe je dit probleem (voorlopig) kan voorkomen. Ik dacht, ik zal het hier op het forum plaatsen misschien zijn er wel meer die met dit probleem worstelen....

De oplossing is het toevoegen avn een key aan de Info.plist in je app.

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

   

Groeten,

Rob

 

 

Reageer

Goed advies! 3 personen vinden dit goed advies.
Leuk! 1 persoon vindt vindt dit leuk.

Max Kievits  Max heeft nog geen Studiekaart. Klokje11 jun 2015, 19:40
Avatar
Avatar
Berichten:26
Fans:3


Hoi Rob,

Ik was zelf ook al hopeloos op het internet aan het zoeken voor dit probleem, en kon vrij weinig vinden. Vooral omdat de iOS 9 Bèta pas een paar dagen uit is. Ik wil je echt heel erg bedanken!!!

 

Groetjes, 

 

Max

Reageer

Goed advies! 1 persoon vindt dit goed advies.

Admin Roelf  Klokje11 jun 2015, 20:39
Avatar


Rob, je tip gaat mee in de iOS Academie Nieuwsbrief van dit weekend! Hartelijk dank voor het posten!

 

Reageer

Leuk! 2 personen vinden vinden dit leuk.

Rob  Op de eerste vier stappen van zijn/haar studiekaart scoort Rob 35%. Klokje11 jun 2015, 21:19
Avatar
Avatar
Berichten:9


Hoi Rob,

Ik was zelf ook al hopeloos op het internet aan het zoeken voor dit probleem, en kon vrij weinig vinden. Vooral omdat de iOS 9 Bèta pas ...

Graag gedaan hoor!

 

 

Reageer


Rob  Op de eerste vier stappen van zijn/haar studiekaart scoort Rob 35%. Klokje11 jun 2015, 21:26
Avatar
Avatar
Berichten:9


Rob, je tip gaat mee in de iOS Academie Nieuwsbrief van dit weekend! Hartelijk dank voor het posten!

 

...

Prima Roelf !

Wat wel bijzonder is is dat het in de playground wel goed werkt maar in de Xcode App niet.

Zie hier de code ik in de playground gebruik. Ik heb alleen username/password en de url verwijderd.

 

import Foundation

import XCPlayground

 

let params: Dictionary<String, AnyObject> = [

  "jsonrpc": "2.0",

  "method": "user.login",

  "params" : ["user" : "xxx", "password": "xxx"],

  "id" : "1"

]

 

func post(params : NSDictionary, url : String, postCompleted : (succeeded: Bool, msg: String, json: NSDictionary?) -> ()) {

  let request = NSMutableURLRequest(URL: NSURL(string: url)!)

  let session = NSURLSession.sharedSession()

  request.HTTPMethod = "POST"

  

  do {

    request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: [])

  } catch let error as NSError {

    print("Error in request post: (error)")

    request.HTTPBody = nil

  } catch {

    print("Catch all error: (error)")

  }

  

 request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  request.addValue("application/json", forHTTPHeaderField: "Accept")

  

  let task = session.dataTaskWithRequest(request, completionHandler:  {data, response, error in

    

    if error != nil {

      postCompleted(succeeded: false, msg: "(error!.localizedDescription)", json: nil)

    } else {

      

      do {

        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as! NSDictionary

        postCompleted(succeeded: true, msg: "Logged in.", json: json)

      } catch let error as NSError {

        print("Error in request post JSONObjectWithDATA: (error)")

      } catch {

        print("Catch all error: (error)")

      }

    }

  })

  task!.resume()

}

 

 

post(params, url: "http://xxxx") { (succeeded: Bool, msg: String, json: NSDictionary?) -> () in

  //  let alert = UIAlertView(title: "Success!", message: msg, delegate: nil, cancelButtonTitle: "OK")

  if (!succeeded || json == nil) {

    print("Error: (msg)")

  } else {

    print("No error: (msg)")

  }

 }

XCPSetExecutionShouldContinueIndefinitely(true)

 

 

gr.,
Rob

Reageer

Goed advies! 2 personen vinden dit goed advies.

AppChanger  Laurens heeft nog geen Studiekaart. Klokje12 jun 2015, 18:03
Avatar
Avatar
Berichten:301
Fans:13


Ik heb ondertussen ook snel eens mijn app aangepast naar Swift 2.0

Heb redelijk wat code moeten herschrijven. Vooral de functies voor het ophalen van locaties hebben veranderingen ondergaan.

Ook bij mij werkte het ophalen van data niet meer.

Met jou bericht is dit super snel gelukt zonder te moeten zoeken achter een oplossing.

Bedankt!

Nu eindelijk beginnen aan native Apple Watch app.

Met vriendelijke groeten,

Laurens

Reageer

Leuk! 1 persoon vindt vindt dit leuk.