๊ฐํฌ์ฃผ(Rad) | ๊น์ ๋น(Nini) |
---|---|
๐จ ๋์์ธ ๐จ | ๐ ํ ํฌ ๐ |
![]() |
![]() |
๋ง์ง ํ๋ฐฉ์ด๋ผ๋ ์ฃผ์ ๋ฅผ ๊ฒ์ด๋ฏธํผ์ผ์ด์ ์ ์ ์ฉํ ๋น๊ณ ๋ฅผ ํตํด ์๋น์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ฒ์์ผํฐ์ ๊ธฐ๋ฅ์ ํตํด ์๋ฒ๋ฅผ ๋์ ํ์ฌ ์ฌ์ฉ์๊ฐ์ ๊ฒฝ์๊ณผ ์ฌ์ฐธ์ฌ๋ฅผ ์ ๋ํ๋ค.
![แแ
ณแ
แ
ฉแแ
ฉแแ
กแแ
ตแธ_แแ
ฆแแ
ตแซ](https://private-user-images.githubusercontent.com/69234788/341497793-1b088c77-d24e-4d3e-9266-cc064e6298fe.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTc4OTksIm5iZiI6MTcxOTYxNzU5OSwicGF0aCI6Ii82OTIzNDc4OC8zNDE0OTc3OTMtMWIwODhjNzctZDI0ZS00ZDNlLTkyNjYtY2MwNjRlNjI5OGZlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIzMzMxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU2OWRmYmJlMjJlNGMyMmNlNTM5MzY5YjM5MDk2ZjIzNTE4ZjgwZWZhYzMzZmUzNDI4OGIzYWE2ZGEyNDA0NTImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0._-RTUc2vJ9eKOl3pN6hCOHG8zwGcZ6f49UfqXBbj8cc)
![แแ
ณแ
แ
ฉแแ
ฉแแ
กแแ
ตแธ_แแ
ตแผแแ
ฉ](https://private-user-images.githubusercontent.com/69234788/341497834-bb8400ae-8107-49a2-ba2f-ac4ee4c5a268.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTc4OTksIm5iZiI6MTcxOTYxNzU5OSwicGF0aCI6Ii82OTIzNDc4OC8zNDE0OTc4MzQtYmI4NDAwYWUtODEwNy00OWEyLWJhMmYtYWM0ZWU0YzVhMjY4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIzMzMxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTEwZDZlYjliYzYwZTUyOGVmNDYwYzkxYjA3N2M2YWRmYmVlN2EwYTM5NDA5MGE4NmZkODE3MDIxYTQ1NzY0NDImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.4wKF0pZTI3rjDjIuud2gXD4qikjSWChEPCHIZVqQXmo)
![แแ
ณแ
แ
ฉแแ
ฉแแ
กแแ
ตแธ_แแ
ฆแแ
ตแทแแ
ฆแซแแ
ฅ](https://private-user-images.githubusercontent.com/69234788/341497869-585aa602-3daa-45db-a546-33ba756d7df8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTc4OTksIm5iZiI6MTcxOTYxNzU5OSwicGF0aCI6Ii82OTIzNDc4OC8zNDE0OTc4NjktNTg1YWE2MDItM2RhYS00NWRiLWE1NDYtMzNiYTc1NmQ3ZGY4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIzMzMxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRjNDg2YjM0YmQ3YTIwY2Y0YjkyNTlhOGU0ODY3YzhkZWMzMGVlODc5NDcwZTkxMzRkZjFkZTVlYzkwY2YyMmUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.7hQWhf0EJZ1nddMpTc3RY87M2kIMHRHSxXC9kWkgoEQ)
prototype.mp4
-> ์ธ์ฆ๋์ง ์์ ๊ฒฝ์ฐ, ๊ฒ์ ์ผํฐ ๋ก๊ทธ์ธ ํ๋ฉด์ ํ์ํ์ฌ ํ๋ ์ด์ด๊ฐ ๋ก๊ทธ์ธํ ์ ์๋๋ก ํด์ค
import GameKit
// ๋ก์ปฌ ํ๋ ์ด์ด ์ธ์ฆ ๋ฉ์๋
func authenticateLocalPlayer() {
// ์ด๋ฏธ ์ธ์ฆ ์ค์ด๋ฉด ์ค๋ณต ์คํ ๋ฐฉ์ง
guard !authenticating else { return }
authenticating = true
// ์ธ์ฆ ํธ๋ค๋ฌ ์ค์
GKLocalPlayer.local.authenticateHandler = { [weak self] viewController, error in
guard let self = self else { return }
self.authenticating = false
if let error = error {
print("Authentication failed: \\(error.localizedDescription)")
self.isAuthenticated = false
} else if let viewController = viewController {
// ๋ก๊ทธ์ธ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ํ์
print("Game Center login required")
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let window = windowScene.windows.first {
window.rootViewController?.present(viewController, animated: true, completion: nil)
}
} else if GKLocalPlayer.local.isAuthenticated {
// ์ธ์ฆ ์ฑ๊ณต
self.isAuthenticated = true
print("Player authenticated")
} else {
// ์ธ์ฆ ์คํจ
self.isAuthenticated = false
print("Player not authenticated")
}
}
}
// (์์ํ๋ฅผ ์ํ) ๊ฒ์์ผํฐ ์ ์ ์ ์ฅ ๋ฉ์๋
func reportBingoCount(_ count: Int) {
// ์ธ์ฆ ์ฌ๋ถ ํ์ธ
guard isAuthenticated else {
print("Player is not authenticated")
return
}
let score = GKLeaderboardScore()
score.leaderboardID = "์์ํ ID"
// ์์ํ์ ๋ถ์ฌํด์ผ ํ๋ ์์ซ์ ์๋ณ์ - ์ด ID๋ 100์๋ก ์ ํ, ์๊ตฌ์ ์ผ๋ก ์ค์ ๋๋ฉฐ ๋์ค์ ๋ณ๊ฒฝํ ์ ์์
score.value = Int(count)
// ์ ์ ์ ์ฅ
GKLeaderboard.submitScore(score.value, context: 0, player: GKLocalPlayer.local, leaderboardIDs: [score.leaderboardID]) { error in
if let error = error {
print("Failed to report score: \\(error.localizedDescription)")
} else {
print("Score reported successfully")
}
}
}
// ๋ชฉํ(์
์ ) ๋ฌ์ฑ ๋ฉ์๋
func reportAchievement(identifier: String, percentComplete: Double) {
// ์ธ์ฆ ์ฌ๋ถ ํ์ธ
guard isAuthenticated else {
print("Player is not authenticated")
return
}
// ๋ชฉํ ๊ฐ์ฒด ์์ฑ ๋ฐ ์ค์
let achievement = GKAchievement(identifier: identifier)
achievement.percentComplete = percentComplete
achievement.showsCompletionBanner = true
// ๋ชฉํ ๋ฌ์ฑ ๋ณด๊ณ
GKAchievement.report([achievement]) { error in
if let error = error {
print("Failed to report achievement: \\(error.localizedDescription)")
} else {
print("Achievement reported successfully")
}
}
}
// ์์ํ ๋ณด๊ธฐ ๋ฉ์๋
func showLeaderboard() {
let leaderboardID = "์์ํ ID"
let viewController = GKGameCenterViewController(leaderboardID: leaderboardID, playerScope: .friendsOnly, timeScope: .allTime)
viewController.gameCenterDelegate = self
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
if let window = windowScene.windows.first {
window.rootViewController?.present(viewController, animated: true, completion: nil)
}
}
}