ในบทความนี้เราจะพูดถึงสาเหตุและวิธีการติดตั้งลีดเดอร์บอร์ดของ GameCenter ในแอปของคุณ
เหตุใด GameCenter จึงฟื้นคืนชีพครั้งใหญ่
คุณสามารถสร้างเกมบน iPhone ได้โดยไม่ต้องมีป้ายบอกคะแนน แต่กระดานผู้นำสามารถช่วยทำให้เกมมีการแข่งขันมากขึ้น เหมือนกับที่ผู้คนแข่งขันกันทั่วโลก
แทนที่จะสร้างและจัดการแบ็กเอนด์ของคุณเอง ลีดเดอร์บอร์ด GameCenter ช่วยให้คุณปรับขนาดตามปริมาณการใช้งานได้ไม่จำกัด ข้ามหน้าการเข้าสู่ระบบทั้งหมดเพื่อขออนุญาต รับรูปภาพ ชื่อ และเพื่อนที่เล่นเกมเดียวกัน ทั้งหมดนี้โดยที่ผู้ใช้ของคุณไม่ต้องป้อนข้อมูลใดๆ
โดยเฉพาะอย่างยิ่งกับ iOS 16 นั้น Apple ลงทุนมากขึ้นในการปรับปรุงและกระตุ้นการใช้งานแอพให้มากขึ้น เช่น ผ่านการแจ้งเตือนแบบพุชเมื่อเพื่อนของคุณทำคะแนนได้เหนือกว่าในเกม
ในเส้นทางการเรียนรู้ SwiftUI ของฉัน ฉันได้สร้างและเผยแพร่แอป เพราะ IMO เป็นวิธีที่ดีที่สุดในการเรียนรู้
ไม่มีเอกสารที่อัปเดตมากเกี่ยวกับวิธีการทำสิ่งนี้ โดยเฉพาะอย่างยิ่งไม่มีกับ SwiftUI หรือการ async และรอใน Swift ดังนั้นฉันจึงรวมและทำให้ง่ายขึ้นสำหรับทุกคนเพื่อสร้างแอปที่น่าทึ่ง เชิญฉันทดสอบแอปของคุณได้ตามสบาย
ข้อกำหนดเบื้องต้น:
- คุณจะต้องมีบัญชีแบบชำระเงินสำหรับนักพัฒนาของ Apple
- คุณต้องสร้าง App Id สำหรับแอปของคุณในส่วนโปรไฟล์การจัดเตรียมของพอร์ทัลนักพัฒนา Apple
- คุณต้องสร้างแอปในพอร์ทัล iTunes Connect Connect
วิธีใช้งานลีดเดอร์บอร์ด iOS ของคุณใน 6 ขั้นตอน
ลอจิกโค้ดส่วนใหญ่สำหรับลีดเดอร์บอร์ดอยู่ในไฟล์นี้หากคุณต้องการข้ามไปข้างหน้า มีขั้นตอนดังนี้:
1. วิธีสร้างลีดเดอร์บอร์ดเชื่อมต่อ App Store
เมื่อคุณสร้างแอปในพอร์ทัล App Store Connect สำเร็จแล้ว ให้ไปที่แท็บบริการสำหรับแอป -> และตรวจสอบให้แน่ใจว่าคุณอยู่ในหน้า GameCenter
จากนั้นเพิ่มลีดเดอร์บอร์ดใหม่โดยใช้เครื่องหมาย "+" ซึ่งอาจเป็น "คลาสสิก" (คะแนนจะไม่ถูกรีเซ็ต) หรือ "ซ้ำ" (คะแนนจะรีเซ็ตตามการตั้งค่าความถี่ของคุณ)
เกมส่วนใหญ่ชอบลีดเดอร์บอร์ดที่เกิดซ้ำเพื่อที่ลีดเดอร์บอร์ดจะไม่รกและเก่ากว่าจะได้คะแนนสูงสุด
ลีดเดอร์บอร์ดID ที่คุณป้อนคือรหัสที่คุณต้องใช้ในทุกที่ในโค้ดที่ขอ
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. วิธีการโหลดคะแนนที่ส่งมา
ในการโหลดคะแนน คุณต้องส่งคะแนนด้วย The submitScore
ฟังก์ชั่นสามารถช่วยคุณได้
- The
flightsClimbed
ตัวแปรควรมีคะแนนที่คุณต้องการส่ง - GameKit ทำให้แน่ใจว่าจะแสดงเฉพาะคะแนนที่ดีที่สุดของคุณตลอดอายุของกระดานผู้นำ
- The
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
. ธรรมดา คุณต้องสร้าง UIViewControllerRepresentable นี้ก่อน (ดังที่คุณเห็นที่นี่) เพื่อเปิดใช้ GameCenter โดยใช้ปุ่มอื่น
เมื่อคุณเพิ่มไฟล์นั้นลงในโปรเจ็กต์ของคุณแล้ว คุณสามารถแสดงพอร์ทัล GameCenter ได้ง่ายๆ โดยใช้สิ่งนี้:GameCenterView(format: gameCenterViewControllerState)
ที่ gameCenterViewControllerState สามารถช่วยให้คุณไปที่หน้ารายละเอียดใน GameCenter
สิ่งที่ควรคำนึงถึงขณะใช้ลีดเดอร์บอร์ดของ GameCenter:
- Simulator Debugging – ด้วยเหตุผลบางประการการพิสูจน์ตัวตนกับ GameCenter นั้นช้ามากในเครื่องจำลอง ดังนั้นจึงควรสร้างแบบจำลองข้อมูลเมื่อใช้เครื่องจำลอง
- ความท้าทาย – คุณไม่สามารถออก GameKit Challenges แบบเป็นโปรแกรมให้เพื่อนของคุณได้อีกต่อไปเนื่องจากการเลิกใช้งาน คุณต้องทำสิ่งเหล่านั้นด้วยตนเองภายในแดชบอร์ด GameCenter ของผู้ใช้กับ GameKit Achievements นอกจากนี้ ไม่มีทางดูการท้าทายที่คุณส่งไป
- ความสำเร็จ – กระดานผู้นำแตกต่างจากความสำเร็จของ GameKit ซึ่งคำนวณและแสดงผลต่างกัน แต่ง่ายกว่ามาก นอกจากนี้ยังสามารถดึงข้อมูลเหล่านี้ลงในแอปได้เช่นกัน ดังที่คุณเห็นด้านล่าง:
สรุปผล
คุณสามารถลองใช้แอพ Stair Master Climber iPhone Health &Fitness ฟรีที่ฉันแชร์ด้านบน ฉันชอบที่จะรู้ว่าสิ่งที่คุณคิดเพื่อให้เราสามารถเรียนรู้ร่วมกัน
อย่าลังเลที่จะติดต่อเราทางโซเชียลมีเดียหรือทางอีเมลหากคุณมีคำถามใดๆ