Я использовал GKLeaderboard.loadScoresWithCompletionHandler
, а затем свойство localPlayerScore
, так что я могу получить высокий балл пользователя от Game Center
, когда моя игра запущена.GKLeaderboard.localPlayerScore возвращает nil на iOS 8.1.3?
Теперь на iOS 7.0
до 8.1.2
, я получаю действительный объект GKScore
, когда я обращаюсь к свойству localPlayerScore. На iOS 8.1.3
, однако, я получаю ноль, из-за которого мое приложение терпит крах. Я получаю ошибку времени выполнения, заявив, что она обнаружила нуль при развертывании необязательного.
Вот фрагмент кода, имеющие отношение к вопросу:
func compareLocalHighScoreFromLeaderboards()
{
// This is to fetch data from the high score leaderboard
let leaderboardRequest = GKLeaderboard()
leaderboardRequest.identifier = GlobalVariables.sharedInstance._highScoreLeaderboardID
leaderboardRequest.loadScoresWithCompletionHandler { (scores, error) -> Void in
if error != nil
{
println("Error fetching score from leaderboards: \(error))")
}
else if scores != nil
{
println("entered loading scores from leaderboards")
let leaderboardScore = leaderboardRequest.localPlayerScore // this returns a GKScore object
var playerLocalHighScore = NSUserDefaults.standardUserDefaults().objectForKey(GlobalVariables.sharedInstance._highScoreKey) as NSNumber
// Check first if the saved highscore is updated.
if playerLocalHighScore.longLongValue != leaderboardScore.value
{
// this means that we don't have the updated leaderboard score in our device
if playerLocalHighScore.longLongValue > leaderboardScore.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 playerLocalHighScore.longLongValue < leaderboardScore.value
{
// update the local highscore with the leaderboard highscore
let updatedHighscore: NSNumber = NSNumber(longLong: leaderboardScore.value)
NSUserDefaults.standardUserDefaults().setObject(updatedHighscore, forKey: GlobalVariables.sharedInstance._highScoreKey)
// send notification message to MainMenuScene to update the SKLabelNode
NSNotificationCenter.defaultCenter().postNotificationName(UpdatedLocalHighScore, object: nil)
}
}
else
{
println("The local highscore and the leaderboard highscore are already in sync")
}
}
}
}
Я использую этот же код для моих предыдущих игр (которые одобрены и живут на Appstore, кстати), чтобы получить пользователь игровой центр с высоким рейтингом и не сталкивался с этим вопросом до 8.1.3
.
Мое приложение было отклонено Apple, потому что они протестировали его с помощью устройства iOS 8.1.3
и оно разбилось. Я сделал некоторую отладку и узнал, что это localPlayerScore
, являющееся нолем, является корнем проблемы.
Любой, кто сталкивается с этим вопросом в последнее время? Кто-нибудь знает, как решить эту проблему?
Любая помощь приветствуется.
Если авария вызвана ' localPlayerScore' является 'nil', то он не включен в этот отрывок. Что в '...'? – mattt
@mattt Я отредактировал мое сообщение, чтобы включить мой полный метод. В основном, я получаю высокий балл GC игрока, а затем сравниваю его с локально сохраненным высоким счетом на устройстве пользователя, чтобы синхронизировать их. Приложение вылетает из-за того, что моя переменная leaderboardScore равна нулю. Это меня смущает, потому что это отлично работает на iOS 7.0 до 8.1.2. – aresz
@aresz вы нашли исправление? Я столкнулся с той же проблемой. Если вы можете опубликовать его здесь, я буду так благодарен. – Cesare