App maken: ook jij kunt het leren!

 

de iOS Academie Forums

Forums - App-ontwikkeling - Swift en iOS: Game Center, localPlayerScore is nil wat een crash veroorzaakt

Bart  Op de eerste vier stappen van zijn/haar studiekaart scoort Bart 36%. Klokje02 apr 2015, 19:13
Avatar
Avatar
Berichten:17


Mijn spelletje maakt verbinding met Game Center, bovendien controleert deze ook of de lokale opgeslagen score eventueel lager is dan degene die zich in GC bevindt. Dit kan voorkomen wanneer iemand ooit de app heeft verwijdert en nadien terug installeert.

Echter genereert mijn code een fatale crash. Ik heb het probleem al kunnen lokaliseren maar krijg het niet opgelost. Bij het uitvoeren van de regel:

let localPlayerScore = leaderBoardRequest.localPlayerScore

wordt er een fatale crash gecreërd: fatal error: unexpectedly found nil while unwrapping an Optional value

Ik heb al diverse manieren geprobeerd zoals:

 if Int(localPlayerScore.value) == nil {

            localPlayerScore.value == 0

             }

Maar dit is tot nu toe nog zonder succes. Heeft er iemand raad?

Hieronder staat mijn code.

 

func GetGCscore() {

//Dit is de lokale score 
let bewaarGegevens = NSUserDefaults.standardUserDefaults()
var score = bewaarGegevens.integerForKey("Score")

//Controleer of gebruiker is ingelogd
if GKLocalPlayer.localPlayer().authenticated {
let leaderBoardRequest = GKLeaderboard()
leaderBoardRequest.identifier = "xxxMijnSpelletjexxx"

leaderBoardRequest.loadScoresWithCompletionHandler { (scores, error) -> Void in
if (error != nil) {
println("Fout: (error!.localizedDescription)")
} else if (scores != nil) {

let localPlayerScore = leaderBoardRequest.localPlayerScore // ==> DIT IS HET PROBLEEM, HIER IS EEN NIL

if score < Int(localPlayerScore.value) {
// Als lokale score lager is dan GC score
// Dan zetten we deze gelijk en vervolgens bewaren we deze lokaal

score = Int(localPlayerScore.value)
bewaarGegevens.setInteger(score, forKey: "Score")
}
}
}

}

Reageer


AppChanger  Laurens heeft nog geen Studiekaart. Klokje02 apr 2015, 21:20
Avatar
Avatar
Berichten:301
Fans:13


Hallo Bart,

Ik zou zeggen, probeer het volgende eens.

 

func GetGCscore() {

//Dit is de lokale score 
let bewaarGegevens = NSUserDefaults.standardUserDefaults()
var score = bewaarGegevens.integerForKey("Score")
let leaderboardRequest = GKLeaderboard() leaderboardRequest.identifier = "xxxMijnSpelletjexxx" leaderboardRequest.loadScoresWithCompletionHandler { (scores, error) -> Void in if error != nil { println("Error fetching score from leaderboards: (error))") } else if scores != nil { let leaderboardScore = leaderboardRequest.localPlayerScore // this returns a GKScore object // Check first if the saved highscore is updated. if score != Int(localPlayerScore.value) { // this means that we don't have the updated leaderboard score in our device if score > Int(localPlayerScore.value) { println("Local score is greater than leaderboard highscore. Do nothing because GameKit will automatically report to GC when there is internet connectivity") } else if score < Int(localPlayerScore.value) { // update the local highscore with the leaderboard highscore let updatedHighscore: NSNumber = NSNumber(longLong: leaderboardScore.value) score = Int(updatedHighscore) } } else { println("The local highscore and the leaderboard highscore are already in sync") } } }

 

 

Hopelijk werkt dit. Indien dit niet werkt zou het handig zijn om het zelf eens in je project te kunnen bekijken. Je kan het steeds in dropbox plaatsen en de link hier plaatsen. Indien het een app is die je in de appStore wil zetten stuur je me de link via een privé bericht.

 

Met vriendelijke groeten,

Laurens

Reageer