Computer >> 컴퓨터 >  >> 스마트폰 >> iPhone

SwiftUI에서 GameKit 리더보드를 구현하는 방법

이 기사에서는 앱 내에서 GameCenter의 리더보드를 구현하는 이유와 방법에 대해 설명합니다.

GameCenter가 크게 부흥하는 이유

점수판 없이 iPhone 게임을 만들 수 있지만 순위표를 사용하면 전 세계 사람들이 서로 경쟁하는 것처럼 게임을 더욱 경쟁력 있게 만들 수 있습니다.

자체 백엔드를 생성 및 관리하는 대신 GameCenter 리더보드를 사용하면 트래픽을 무한대로 확장하고, 인증을 위해 전체 로그인 페이지를 건너뛰고, 이미지, 이름 및 같은 게임을 하는 친구를 얻을 수 있습니다. 이 모든 작업은 사용자가 아무 것도 입력하지 않아도 됩니다.

특히 iOS 16에서 Apple은 친구가 게임에서 당신의 점수를 이길 때 푸시 알림을 통해 앱을 개선하고 더 많은 앱 사용을 유도하는 데 더 많은 투자를 하고 있습니다.

SwiftUI를 배우는 여정에서 저는 앱을 만들고 게시해 왔습니다. 왜냐하면 IMO가 배우는 가장 좋은 방법이기 때문입니다.

이 많은 작업을 수행하는 방법에 대한 업데이트된 문서가 별로 없었습니다. 특히 SwiftUI가 없거나 Swift에서 async 및 await가 등장하면서 업데이트된 문서가 많지 않았습니다. 그래서 모두가 놀라운 앱을 만들 수 있도록 통합하고 단순화했습니다. 그러니 저를 초대하여 여러분의 앱도 테스트해 보세요!

필수 조건:

  • Apple 개발자 유료 계정이 있어야 합니다.
  • Apple 개발자 포털의 프로비저닝 프로필 섹션에서 앱의 앱 ID를 생성해야 합니다.
  • iTunes Connect Connect 포털에서 앱을 만들어야 합니다.

6단계로 iOS 리더보드를 구현하는 방법

건너뛰고 싶다면 리더보드에 대한 대부분의 코드 로직이 이 파일에 있습니다. 단계는 다음과 같습니다.

1. App Store Connect 리더보드를 만드는 방법

SwiftUI에서 GameKit 리더보드를 구현하는 방법
Apple iTunes Connect 포털의 스크린샷

App Store Connect 포털에서 앱을 성공적으로 생성했으면 앱의 서비스 탭 ->으로 이동하여 GameCenter 페이지에 있는지 확인합니다.

그런 다음 "클래식"(점수가 재설정되지 않음) 또는 "반복"(빈도 설정에 따라 점수가 재설정됨)이 될 수 있는 "+" 기호를 사용하여 새 리더보드를 추가합니다.

대부분의 게임은 순위표가 높은 점수에 도달할 수 없는 오래된 것으로 복잡하지 않도록 반복되는 순위표를 선호합니다.

거기에 입력한 LeaderboardID는 코드에서 요청하는 모든 위치에서 사용해야 하는 것입니다.

SwiftUI에서 GameKit 리더보드를 구현하는 방법
새 리더보드를 만드는 데 필요한 세부정보

2. GameCenter 인증을 설정하는 방법

먼저 이 기능이 작동하려면 GameCenter에 사용자를 인증해야 합니다.

따라서 이 코드를 사용하여 기본적으로 사용자(GKLocalPlayer.local)가 인증되었는지 확인하거나 오류가 있는 경우 오류를 출력합니다.

func authenticateUser() {
    GKLocalPlayer.local.authenticateHandler = { vc, error in
        guard error == nil else {
            print(error?.localizedDescription ?? "")
            return
        }
    }
}

사용자가 인증되면 UI에 작은 팝업이 표시됩니다. 그렇지 않은 경우 사용자는 GameCenter 계정에 로그인할 수 있는 페이지로 이동합니다.

SwiftUI에서 GameKit 리더보드를 구현하는 방법
사용자가 로그인할 때 표시되는 기호

3. UI에 순위표 항목을 표시하는 방법

GameCenter ViewController 리더보드(GKLeaderboard)에서 데이터를 가져오려면 loadLeaderboards를 사용해야 합니다. .

loadEntries로 전환할 수 있습니다. .global의 함수 .friends로 친구만 끌어들이기 위해.

각 플레이어를 반복하고 loadPhoto을 수행하여 각 플레이어의 이미지를 검색할 수도 있습니다. .

NSRang(1...5) 사용 , 표시할 플레이어 수를 선택할 수 있습니다. 이렇게 하면 리더보드에서 가장 높은 5개 점수를 가진 사용자를 가져오고 반복되는 리더보드에 대해 주기가 새로 고쳐지는 경우와 같이 사용자가 없으면 아무 것도 반환하지 않습니다.

async-await를 활용하는 경우 리더보드에서 데이터를 가져오는 방법은 다음과 같습니다.

func loadLeaderboard() async {
    playersList.removeAll()
    Task{
        var playersListTemp : [Player] = []
        let leaderboards = try await GKLeaderboard.loadLeaderboards(IDs: [leaderboardIdentifier])
        if let leaderboard = leaderboards.filter ({ $0.baseLeaderboardID == self.leaderboardIdentifier }).first {
            let allPlayers = try await leaderboard.loadEntries(for: .global, timeScope: .allTime, range: NSRange(1...5))
            if allPlayers.1.count > 0 {
                try await allPlayers.1.asyncForEach { leaderboardEntry in
                    var image = try await leaderboardEntry.player.loadPhoto(for: .small)
                    playersListTemp.append(Player(name: leaderboardEntry.player.displayName, score:leaderboardEntry.formattedScore, image: image))
                                print(playersListTemp)
                    playersListTemp.sort{
                        $0.score < $1.score
                    }
                }
            }
        }
        playersList = playersListTemp            
    }
}
SwiftUI에서 GameKit 리더보드를 구현하는 방법
리더보드 데이터를 앱으로 가져올 수 있습니다.

4. 보기/페이지가 나타날 때 SwiftUI에서 기능을 호출하는 방법

onAppear를 활용할 수 있습니다. 실제로 인증 및 로드를 호출하는 뷰의 수명 주기 기능이지만 원하는 경우 버튼을 탭하여 수행할 수도 있습니다.

.onAppear(){
    if !GKLocalPlayer.local.isAuthenticated {
        authenticateUser()
    } else if playersList.count == 0 {
        Task{
            await loadLeaderboard()
        }
    }
}

5. 제출된 점수를 로드하는 방법

점수를 로드하려면 점수도 제출해야 합니다. submitScore 기능이 도움이 될 수 있습니다.

  • flightsClimbed 변수에는 제출하려는 점수가 포함되어야 합니다.
  • GameKit은 리더보드의 수명 동안 최고 점수만 표시합니다.
  • leaderboardId App Store Connect 계정에 수동으로 입력한 값 포함:
func leaderboard() async{
    Task{
        try await GKLeaderboard.submitScore(
            flightsClimbed,
            context: 0,
            player: GKLocalPlayer.local,
            leaderboardIDs: ["com.tfp.stairsteppermaster.flights"]
        )
    }
    calculateAchievements()
}

6. GameCenter ViewController 포털을 표시하는 방법

GameCenter에 로그인하면 화면 오른쪽 상단에 약간 성가신 아이콘이 나타납니다. 탭하면 GameCenter ViewController로 이동합니다. 운 좋게도 GKAccessPoint.shared.isActive = false을 사용하여 디자인의 일부가 아닌 경우 숨길 수 있습니다. .

GameCenter UI는 UIKit ViewController이므로 단순한 SwiftUI View가 아닙니다. , 다른 버튼을 사용하여 GameCenter를 시작하려면 이 UIViewControllerRepresentable을 먼저 생성해야 합니다(여기에서 볼 수 있음).

해당 파일을 프로젝트에 추가하면 GameCenterView(format: gameCenterViewControllerState)을 사용하여 GameCenter 포털을 표시할 수 있습니다. 여기서 gameCenterViewControllerState는 GameCenter의 세부 정보 페이지로 이동하는 데 도움이 될 수 있습니다.

SwiftUI에서 GameKit 리더보드를 구현하는 방법
GameCenter의 리더보드 보기

GameCenter의 리더보드를 사용할 때 염두에 두어야 할 사항:

  • 시뮬레이터 디버깅 – 어떤 이유로 GameCenter에 대한 인증은 시뮬레이터에서 매우 느리므로 시뮬레이터를 사용할 때 모의 데이터를 만드는 것이 합리적일 수 있습니다.
  • 챌린지 – 지원 중단으로 인해 더 이상 프로그래밍 방식으로 GameKit 챌린지를 친구에게 발행할 수 없습니다. 대신 GameKit Achievements에 대해 사용자의 GameCenter 대시보드 내에서 수동으로 수행해야 합니다. 또한 보낸 챌린지를 볼 수 있는 방법이 없습니다.
  • 업적 – 순위표는 다르게 계산되고 표시되지만 훨씬 더 쉬운 GameKit 업적과 다릅니다. 아래에서 볼 수 있듯이 앱으로 가져올 수도 있습니다.
SwiftUI에서 GameKit 리더보드를 구현하는 방법
GameKit 도전 과제 및 성과

마무리

위에서 공유한 무료 오픈 소스 Stair Master Climber iPhone 건강 및 피트니스 앱을 사용해 볼 수 있습니다. 함께 배울 수 있도록 여러분의 생각을 알고 싶습니다.

질문이 있는 경우 소셜 미디어나 이메일로 언제든지 저에게 연락해 주십시오.