Skip to content

Commit

Permalink
Implemented access control and removed strange class functions
Browse files Browse the repository at this point in the history
  • Loading branch information
jackcook committed Aug 18, 2015
1 parent 5911414 commit 1a7960b
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 60 deletions.
2 changes: 1 addition & 1 deletion GCHelper.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Pod::Spec.new do |s|

s.requires_arc = true
s.platform = :ios, "8.0"
s.source = { :git => "https://github.com/jackcook/GCHelper.git", :tag => "0.2" }
s.source = { :git => "https://github.com/jackcook/GCHelper.git", :tag => "0.2.1" }
s.source_files = "Source/*.swift"
s.framework = "GameKit"
end
14 changes: 6 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,12 @@ GCHelper is a Swift implementation for GameKit built off of the GameKitHelper cl
---
## Implementation

> In the latest version of GCHelper, class functions were implemented so that using `sharedInstance` is not necessary. It can still be used if you want to, though.
### Authenticating the User
Before doing anything with Game Center, the user needs to be signed in. This instance is often configured in your app's `application:didFinishLaunchingWithOptions:` method

```swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
GCHelper.authenticateLocalUser()
GCHelper.sharedInstance.authenticateLocalUser()
return true
}
```
Expand All @@ -28,14 +26,14 @@ func application(application: UIApplication, didFinishLaunchingWithOptions launc
A match needs to be created in order for a multiplayer game to work.

```swift
GCHelper.findMatchWithMinPlayers(2, maxPlayers: 4, viewController: self, delegate: self)
GCHelper.sharedInstance.findMatchWithMinPlayers(2, maxPlayers: 4, viewController: self, delegate: self)
```

### Sending Data
Once a match has been created, you can send data between players with `NSData` objects.

```swift
let success = GCHelper.match.sendDataToAllPlayers(data, withDataMode: .Reliable, error: nil)
let success = GCHelper.sharedInstance.match.sendDataToAllPlayers(data, withDataMode: .Reliable, error: nil)
if !success {
println("An unknown error occured while sending data")
}
Expand All @@ -46,21 +44,21 @@ if !success {
If you have created any achievements in iTunes Connect, you can access those achievements and update their progress with this method. The `percent` value can be set to zero or 100 if percentages aren't used for this particular achievement.

```swift
GCHelper.reportAchievementIdentifier("achievementIdentifier", percent: 35.4)
GCHelper.sharedInstance.reportAchievementIdentifier("achievementIdentifier", percent: 35.4)
```

### Update Leaderboard Score
Similarly to achievements, if you have created a leaderboard in iTunes Connect, you can set the score for the signed in account with this method.

```swift
GCHelper.reportLeaderboardIdentifier("leaderboardIdentifier", score: 87)
GCHelper.sharedInstance.reportLeaderboardIdentifier("leaderboardIdentifier", score: 87)
```

### Show GKGameCenterViewController
GCHelper also contains a method to display Apple's GameKit interfaces. These can be used to show achievements, leaderboards, or challenges, as is defined by the use of the `viewState` value. In this case, `self` is the presenting view controller.

```swift
GCHelper.showGameCenter(self, viewState: .Achievements)
GCHelper.sharedInstance.showGameCenter(self, viewState: .Achievements)
```
---
## GCHelperDelegate Methods
Expand Down
77 changes: 26 additions & 51 deletions Source/GCHelper.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// GCHelper.swift (v. 0.2)
// GCHelper.swift (v. 0.2.1)
//
// Copyright (c) 2015 Jack Cook
//
Expand All @@ -22,29 +22,24 @@

import GameKit

protocol GCHelperDelegate {
public protocol GCHelperDelegate {
func matchStarted()
func match(match: GKMatch, didReceiveData: NSData, fromPlayer: String)
func matchEnded()
}

class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterControllerDelegate, GKMatchDelegate, GKLocalPlayerListener {
public class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterControllerDelegate, GKMatchDelegate, GKLocalPlayerListener {

var presentingViewController: UIViewController!
var match: GKMatch!
var delegate: GCHelperDelegate?
var playersDict = [String:AnyObject]()
var invitedPlayer: GKPlayer!
var invite: GKInvite!
var match: GKMatch!

var matchStarted = false
var authenticated = false
private var invite: GKInvite!
private var invitedPlayer: GKPlayer!
private var playersDict = [String:AnyObject]()
private var presentingViewController: UIViewController!

class var match: GKMatch {
get {
return GCHelper.sharedInstance.match
}
}
private var authenticated = false
private var matchStarted = false

class var sharedInstance: GCHelper {
struct Static {
Expand All @@ -60,7 +55,7 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro

// MARK: Internal functions

func authenticationChanged() {
private func authenticationChanged() {
if GKLocalPlayer.localPlayer().authenticated && !authenticated {
println("Authentication changed: player authenticated")
authenticated = true
Expand All @@ -70,7 +65,7 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro
}
}

func lookupPlayers() {
private func lookupPlayers() {
let playerIDs = match.players.map { ($0 as! GKPlayer).playerID }

GKPlayer.loadPlayersForIdentifiers(playerIDs) { (players, error) -> Void in
Expand All @@ -93,11 +88,7 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro

// MARK: User functions

class func authenticateLocalUser() {
GCHelper.sharedInstance.authenticateLocalUser()
}

func authenticateLocalUser() {
public func authenticateLocalUser() {
println("Authenticating local user...")
if GKLocalPlayer.localPlayer().authenticated == false {
GKLocalPlayer.localPlayer().authenticateHandler = { (view, error) in
Expand All @@ -112,11 +103,7 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro
}
}

class func findMatchWithMinPlayers(minPlayers: Int, maxPlayers: Int, viewController: UIViewController, delegate theDelegate: GCHelperDelegate) {
GCHelper.sharedInstance.findMatchWithMinPlayers(minPlayers, maxPlayers: maxPlayers, viewController: viewController, delegate: theDelegate)
}

func findMatchWithMinPlayers(minPlayers: Int, maxPlayers: Int, viewController: UIViewController, delegate theDelegate: GCHelperDelegate) {
public func findMatchWithMinPlayers(minPlayers: Int, maxPlayers: Int, viewController: UIViewController, delegate theDelegate: GCHelperDelegate) {
matchStarted = false
match = nil
presentingViewController = viewController
Expand All @@ -133,11 +120,7 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro
presentingViewController.presentViewController(mmvc, animated: true, completion: nil)
}

class func reportAchievementIdentifier(identifier: String, percent: Double) {
GCHelper.sharedInstance.reportAchievementIdentifier(identifier, percent: percent)
}

func reportAchievementIdentifier(identifier: String, percent: Double) {
public func reportAchievementIdentifier(identifier: String, percent: Double) {
let achievement = GKAchievement(identifier: identifier)

achievement?.percentComplete = percent
Expand All @@ -149,11 +132,7 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro
}
}

class func reportLeaderboardIdentifier(identifier: String, score: Int) {
GCHelper.sharedInstance.reportLeaderboardIdentifier(identifier, score: score)
}

func reportLeaderboardIdentifier(identifier: String, score: Int) {
public func reportLeaderboardIdentifier(identifier: String, score: Int) {
let scoreObject = GKScore(leaderboardIdentifier: identifier)
scoreObject.value = Int64(score)
GKScore.reportScores([scoreObject]) { (error) -> Void in
Expand All @@ -163,11 +142,7 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro
}
}

class func showGameCenter(viewController: UIViewController, viewState: GKGameCenterViewControllerState) {
GCHelper.sharedInstance.showGameCenter(viewController, viewState: viewState)
}

func showGameCenter(viewController: UIViewController, viewState: GKGameCenterViewControllerState) {
public func showGameCenter(viewController: UIViewController, viewState: GKGameCenterViewControllerState) {
presentingViewController = viewController

let gcvc = GKGameCenterViewController()
Expand All @@ -178,22 +153,22 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro

// MARK: GKGameCenterControllerDelegate

func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!) {
public func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!) {
presentingViewController.dismissViewControllerAnimated(true, completion: nil)
}

// MARK: GKMatchmakerViewControllerDelegate

func matchmakerViewControllerWasCancelled(viewController: GKMatchmakerViewController!) {
public func matchmakerViewControllerWasCancelled(viewController: GKMatchmakerViewController!) {
presentingViewController.dismissViewControllerAnimated(true, completion: nil)
}

func matchmakerViewController(viewController: GKMatchmakerViewController!, didFailWithError error: NSError!) {
public func matchmakerViewController(viewController: GKMatchmakerViewController!, didFailWithError error: NSError!) {
presentingViewController.dismissViewControllerAnimated(true, completion: nil)
println("Error finding match: \(error.localizedDescription)")
}

func matchmakerViewController(viewController: GKMatchmakerViewController!, didFindMatch theMatch: GKMatch!) {
public func matchmakerViewController(viewController: GKMatchmakerViewController!, didFindMatch theMatch: GKMatch!) {
presentingViewController.dismissViewControllerAnimated(true, completion: nil)
match = theMatch
match.delegate = self
Expand All @@ -205,15 +180,15 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro

// MARK: GKMatchDelegate

func match(theMatch: GKMatch!, didReceiveData data: NSData!, fromPlayer playerID: String!) {
public func match(theMatch: GKMatch!, didReceiveData data: NSData!, fromPlayer playerID: String!) {
if match != theMatch {
return
}

delegate?.match(theMatch, didReceiveData: data, fromPlayer: playerID)
}

func match(theMatch: GKMatch!, player playerID: String!, didChangeState state: GKPlayerConnectionState) {
public func match(theMatch: GKMatch!, player playerID: String!, didChangeState state: GKPlayerConnectionState) {
if match != theMatch {
return
}
Expand All @@ -230,7 +205,7 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro
}
}

func match(theMatch: GKMatch!, didFailWithError error: NSError!) {
public func match(theMatch: GKMatch!, didFailWithError error: NSError!) {
if match != theMatch {
return
}
Expand All @@ -242,13 +217,13 @@ class GCHelper: NSObject, GKMatchmakerViewControllerDelegate, GKGameCenterContro

// MARK: GKLocalPlayerListener

func player(player: GKPlayer!, didAcceptInvite inviteToAccept: GKInvite!) {
public func player(player: GKPlayer!, didAcceptInvite inviteToAccept: GKInvite!) {
let mmvc = GKMatchmakerViewController(invite: inviteToAccept)
mmvc.matchmakerDelegate = self
presentingViewController.presentViewController(mmvc, animated: true, completion: nil)
}

func player(player: GKPlayer!, didRequestMatchWithOtherPlayers playersToInvite: [AnyObject]!) {
public func player(player: GKPlayer!, didRequestMatchWithOtherPlayers playersToInvite: [AnyObject]!) {

}
}

0 comments on commit 1a7960b

Please sign in to comment.