SwiftUI で GameKit Leaderboard を実装する方法
この記事では、GameCenter の Leaderboard をアプリ内に実装する理由と方法について説明します。
GameCenter が大幅な復活を遂げている理由
スコアボードなしで iPhone ゲームを作成することもできますが、リーダーボードを使用すると、世界中の人々が互いに競争しているように、ゲームの競争力を高めることができます。
独自のバックエンドを作成して管理する代わりに、GameCenter Leaderboard を使用すると、トラフィックに合わせて無限にスケーリングしたり、認証のためにログイン ページ全体をスキップしたり、画像、名前、同じゲームをプレイしている友達を取得したりできます。ユーザーは何も入力する必要はありません。
特に iOS 16 では、Apple はそれを改善するためにより多くの投資を行っており、ゲームで友達があなたのスコアを上回ったときにプッシュ通知を送信するなど、より多くのアプリの使用を促進しています。
SwiftUI を学ぶ旅の中で、私はアプリを作成して公開してきました。IMO が学習するための最良の方法だからです。
特に SwiftUI や Swift での async と await の出現に関するドキュメントはありませんでした。そこで、誰もが素晴らしいアプリを構築できるように、それを統合および簡素化しました。だから、私もあなたのアプリをテストするために私を招待してください!
前提条件:
- Apple Developer の有料アカウントが必要です
- Apple Developer Portal のプロビジョニング プロファイル セクションで、アプリのアプリ ID を作成する必要があります
- iTunes Connect Connect ポータルでアプリを作成する必要があります
6 つのステップで iOS リーダーボードを実装する方法
先にスキップしたい場合は、リーダーボードのコード ロジックのほとんどがこのファイルにあります。手順は次のとおりです。
1. App Store Connect リーダーボードの作成方法
App Store Connect ポータルでアプリを正常に作成したら、アプリの [サービス] タブに移動し、[GameCenter] ページにいることを確認します。
次に、「+」記号を使用して新しいリーダーボードを追加します。これは、「クラシック」(スコアがリセットされない) または「リカーリング」(頻度設定に基づいてスコアがリセットされる) のいずれかです。
ほとんどのゲームは、リーダーボードがハイスコアを達成するのが不可能な古いもので雑然としないように、定期的なリーダーボードを好みます。
そこに入力する LeaderboardID は、それを要求するコード内のすべての場所で使用する必要があるものです。
2. GameCenter 認証の設定方法
まず、この機能を動作させるには、GameCenter に対してユーザーを認証する必要があります。
したがって、このコードを使用してそれを行います。これにより、基本的に、ユーザー (GKLocalPlayer.local) が認証されていることが確認されるか、エラーがある場合はエラーが出力されます。
func authenticateUser() {
GKLocalPlayer.local.authenticateHandler = { vc, error in
guard error == nil else {
print(error?.localizedDescription ?? "")
return
}
}
}
ユーザーが認証されると、UI に小さなポップアップが表示されます。そうでない場合、ユーザーは自分の GameCenter アカウントにログインするためのページに移動します。
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
}
}
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 を作成する必要があります (ここで確認できます)。
そのファイルをプロジェクトに追加すると、これを使用して簡単に GameCenter ポータルを表示できます:GameCenterView(format: gameCenterViewControllerState)
gameCenterViewControllerState は、GameCenter の詳細ページに移動するのに役立ちます。
GameCenter のランキングを使用する際の注意事項:
- シミュレーターのデバッグ – 何らかの理由で、シミュレーターでの GameCenter への認証が非常に遅いため、シミュレーターを使用するときにデータのモックを作成することも理にかなっている場合があります。
- Challenges – 非推奨のため、GameKit Challenges をプログラムでフレンドに発行することはできなくなりました。代わりに、ユーザーの GameCenter ダッシュボード内で、GameKit アチーブメントに対して手動で行う必要があります。また、送信したチャレンジを表示する方法はありません。
- アチーブメント – リーダーボードは GameKit アチーブメントとは異なります。GameKit のアチーブメントは別の方法で計算および表示されますが、はるかに簡単です。以下に示すように、これらもアプリに取り込むことができます。
まとめ
上で共有した無料のオープンソースの Stair Master Climber iPhone Health &Fitness アプリを試すことができます。一緒に勉強できるように、あなたの考えを知りたいです。
ご不明な点がございましたら、ソーシャル メディアまたはメールでお気軽にお問い合わせください。
-
iMessage からアプリ アイコンを非表示にする方法
iOS 11 には素晴らしい機能が満載です。これは、これまでのところ Apple の巨大なソフトウェア アップデートの 1 つです。 Appleが最近リリースした最新のソフトウェアバージョンにデバイスをアップグレードしたに違いない.刷新されたコントロール センター、新しく設計された App Store、高度な Siri サポートなど、これはあなたが抵抗できないものですよね? はい、iOS のデフォルトのメッセージ アプリにも大きな変更がいくつかあります。気付いているかどうかはわかりませんが、新しいメッセージを開くとすぐに、iMessage のクイック アクセス アプリ メニューが表示されます
-
iOS 12 でメッセージ内の写真にアクセスする方法
iOS 3 がリリースされて以来、Apple デバイスのメッセージ経由で動画や写真を送信できます。そのためには、カメラ アイコンをタップして、送信する写真またはビデオを選択するだけです。 iOS 12 では、状況が変わりました。ただし、これは完全に無効になっているという意味ではありません。 iOS 12 では、メッセージでカメラ アイコンをタップすると、iPhone のカメラが起動して新しい写真やビデオをキャプチャします。写真をクリックしたり、Apple のすばらしいカメラ効果を使ってビデオを撮影したり、図形やステッカー パックなどを追加したりできます。メッセージのフォト ライブラリにアクセ