その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

GameCenterでどこまでサーバーサイド機能を代替できるか

たとえば、ユーザー同士で位置を共有するようなアプリを作ろうとすると、

  • サーバーに位置情報を送信し、
  • 他ユーザーの位置情報一覧をサーバーから取得する、

というような実装になるのでサーバーが必要になります。


サーバーサイド開発なしで、GameCenter対応だけで位置情報系アプリが作れちゃったりしないのか?


できるならこんなにありがたいことはないので、調べてみました。

スコア一覧の取得

緯度経度をスコアとして送ることはできるはず。たとえば緯度8桁、経度8桁と決めて計16桁の数値をスコアとしてGameCenterに送ればいい。(例:緯度35.689487,経度139.69170なら3568948713969170をスコアとして送る)
あとはスコア一覧を取得できれば、アプリ内で近くの人を探すなりできるので、ユーザー間で位置を共有してどうこう、というサービスをつくれる。


ただ以前書いたGame Center のリーダーボード(スコアランキング)対応アプリの作り方というエントリーでは、GKLeaderboardViewController という出来合いのビューコントローラを使用し、スコア取得云々のコードは一切でてこなかったので、できないかもしれない。


・・・と思いつつダメもとでGameKitプログラミングガイドを見ていたら、

アプリケーションでスコアデータを調べたり、独自のLeaderboardビューを作成したい場合は、GameCenterから直接スコアデータをロードできます。それには、GKLeaderboardクラスを使用します。GKLeaderboardオブジェクトは、Game Centerに保存されているアプリケーションのデータへのクエリを表します。スコアデータをロードするには、アプリケーションはGKLeaderboardオブジェクトを作成して、特定のスコアセットをフィルタリングするようにそのプロパティを設定します。


おお、全然できそう。

スコア取得クエリの自由度

スコアの代わりに緯度経度を送るとして、範囲を指定しての検索はできるのか?上位10件とかはできるっぽいけど。
GKLeaderboardクラスのヘッダを見てみました。

@property(nonatomic, assign)            GKLeaderboardTimeScope      timeScope;
@property(nonatomic, assign)            GKLeaderboardPlayerScope    playerScope;        // Filter on friends. Does not apply to leaderboard initialized with players.
@property(nonatomic, retain)            NSString                    *category;          // leaderboard category.  If nil, then it will fetch the aggregate leaderboard
@property(nonatomic, readonly, retain)  NSString                    *title;             // Localized category title. Defalts to nil until loaded.
@property(nonatomic, assign)            NSRange                     range;              // Leaderboards start at index 1 and the length should be less than 100. Does not apply to leaderboards initialized with players.  Exception will be thrown if developer tries to set an invalid range


うーんできないかも。
rangeってので「100位〜200位まで取得」っていう指定はできそうだけど。
一旦自分の順位を調べて、その周辺順位に絞って取得することで、「近くにいるユーザー」みたいなのをとることはできそう。

複数スコアの登録

前述したように、緯度経度の数値で絞り込みを行えるのであれば、緯度と経度を別々に扱いたい。スコア1(緯度用)とスコア2(経度用)、みたいに複数持つことはできるのか?



ひとつLeaderboardsを登録した状態で、左上にAddLeaderboardボタンが出てるので、できそう。


規約的な問題

GameCenterをそういうふうに使っちゃっていいのかという問題があります。
が、いくつかドキュメントあたってみた限りではわからず。

結論

少なくとも位置共有ぐらいであればGameCenterでサーバーサイドの代替はできそうです。
今回はLeaderboardの範疇だけで検討しましたが、アチーブメントやマルチプレーヤー機能を使っても同様のことができるかもしれません。ちょっとここらへんは深堀りする価値がありそうです。