SpriteKit - не могу войти в Gamecenter

Я сделал все правильно в отношении подключения к iTunes, но когда я запускаю приложение, оно не аутентифицируется, а когда я нажимаю кнопку Gamecenter, оно выдает мне сообщение «Gamecenter недоступен, пользователь не вошел в систему». Код:

Вьюконтроллер:

import UIKit
import SpriteKit
import GameKit

class GameViewController: UIViewController {



    override func viewDidLoad() {
        super.viewDidLoad()

    authenticateLocalPlayer()
}

 //initiate gamecenter
    func authenticateLocalPlayer(){
         print("Starting..1")
        let localPlayer = GKLocalPlayer.localPlayer()
         print("Starting..2")
        localPlayer.authenticateHandler = {(viewController, error) -> Void in
             print("Starting..3")
            if (viewController != nil) {
                print("Not signed in. Authenticating now")
                var vc = self.view?.window?.rootViewController
                vc?.presentViewController(viewController!, animated: true, completion: nil)
            }

            else {
                print((GKLocalPlayer.localPlayer().authenticated))

            }

        }
    }

Игровая сцена:

import SpriteKit
import iAd
import GameKit

class GameScene: SKScene, SKPhysicsContactDelegate, ADBannerViewDelegate, GKGameCenterControllerDelegate {

  func saveHighscore(score:Int) {

        //check if user is signed in
        if GKLocalPlayer.localPlayer().authenticated {

            let scoreReporter = GKScore(leaderboardIdentifier: "CC_Leaderboard_1") //leaderboard id here

            scoreReporter.value = Int64(score) //score variable here (same as above)

            let scoreArray: [GKScore] = [scoreReporter]

            GKScore.reportScores(scoreArray, withCompletionHandler: {(error : NSError?) -> Void in
                if error != nil {
                    print("error")                }
            })

        }

    }

    //shows leaderboard screen
    func showLeader() {
        var vc = self.view?.window?.rootViewController
        var gc = GKGameCenterViewController()
        gc.gameCenterDelegate = self
        vc?.presentViewController(gc, animated: true, completion: nil)
    }

    //hides leaderboard screen
    func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!)
    {
        gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)

    }

}

Я также пытался пройти аутентификацию внутри GameScene, но это тоже не сработало.

Редактировать:

 //initiate gamecenter
    func authenticateLocalPlayer(){

         print("Gamecenter..1")
        let localPlayer = GKLocalPlayer.localPlayer()

         print("Gamecenter..2")
        localPlayer.authenticateHandler = {(viewController, error) -> Void in

             print("Gamecenter..3")
            if (viewController != nil) {
                print("Not signed in. Authenticating now")
                var vc = self.view?.window?.rootViewController
                vc?.presentViewController(viewController!, animated: true, completion: nil)
            }

            else {
                print((GKLocalPlayer.localPlayer().authenticated))

            }

        }
    }

Взгляните на операторы print в приведенной выше функции, "Gamecenter..3" никогда не печатается.

Редактировать 2:

Проблема решилась сама собой, когда я вышел из Gamecenter. (Как глупы такие вещи)


person Abdou023    schedule 09.12.2015    source источник
comment
Вы включили Game Center в разделе «Возможности» в Xcode?   -  person Adam    schedule 09.12.2015
comment
Да, пожалуйста, взгляните на мой отредактированный пост.   -  person Abdou023    schedule 09.12.2015
comment
В режиме песочницы, если вы отказываетесь войти в систему 5 раз, вы никогда не сможете войти снова, пока не удалите свои учетные данные из настроек игрового центра в настройках системы, затем запустите приложение и снова войдите в систему.   -  person Knight0fDragon    schedule 10.12.2015


Ответы (1)


Одна возможность: в обработчике аутентификации вы никогда не проверяете код ошибки. Вы только проверяете, установлен ли viewController или нет. Однако, если код ошибки установлен, viewController (обычно) будет равен нулю, поэтому вы можете интерпретировать ошибку входа в систему как успешный вход.

Я бы изменил код на:

localPlayer.authenticateHandler = {(viewController, error) -> Void in
    if (error != nil)
    {
         //add some stuff to report the error
    }
    else if (viewController != nil){
         print("Not signed in. Authenticating now")
         var vc = self.view?.window?.rootViewController
         vc?.presentViewController(viewController!, animated: true, completion: nil)
    }

   else {
         print((GKLocalPlayer.localPlayer().authenticated))

        }

   }

чтобы подтвердить, что вы не получаете ошибку при входе в систему. Если вы получаете сообщение об ошибке, это даст подсказку о том, на что смотреть дальше.

Изменить

Некоторые люди сообщают о проблемах с аутентификацией, пока не добавят хотя бы 1 таблицу лидеров или достижение в iTunesConnect. В этих отчетах они на самом деле получают ошибку входа в систему, что игра не распознана. Но, учитывая присущую Game Center ненадежность, я бы добавил замещающее достижение или таблицу лидеров, чтобы исключить эту проблему. (iOS9 "Эта игра не распознана игрой центр.”)

person Thunk    schedule 09.12.2015
comment
Сделал, ошибок нет. пожалуйста, взгляните на мой отредактированный пост. - person Abdou023; 09.12.2015