リアルタイムチャットSDKのできるまで
Upcoming SlideShare
Loading in...5
×
 

リアルタイムチャットSDKのできるまで

on

  • 10,604 views

2013/02/24 conferenceWithDevelopersにて発表

2013/02/24 conferenceWithDevelopersにて発表

Statistics

Views

Total Views
10,604
Views on SlideShare
9,832
Embed Views
772

Actions

Likes
40
Downloads
42
Comments
0

7 Embeds 772

http://connpass.com 665
http://s.deeeki.com 41
https://twitter.com 38
http://space.hatena.ne.jp 11
http://nuevospowerpoints.blogspot.com 6
http://nuevospowerpoints.blogspot.com.es 6
http://nuevospowerpoints.blogspot.mx 5
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

リアルタイムチャットSDKのできるまで リアルタイムチャットSDKのできるまで Presentation Transcript

  • リアルタイムチャット SDKのできるまで∼ダンゴルのチャットを支える技術∼ AppBankGames Inc. 小野 将司
  • お前、誰よ• akisuteというのよ• iOSプログラマとか ゲームづくりとか やってるのよ• http://akisute.com @akisutesama
  • 略歴1. SIer2. Webプログラマ iOSプログラマ3. ゲーム作ってます
  • アジェンダ• 本日は弊社AppBankGamesが運営する  ゲーム「ダンジョンズ&ゴルフ」の   裏側の話をします• 主に共通ID/チャットシステム 「CHAO」の話になります
  • ダンゴル 2012/12/3 リリースファンタジー本格ゴルフ! 無料!
  • ダンゴル 2012/12/3 リリースファンタジー本格ゴルフ! 無料!
  • ダンゴル 2012/12/3 リリースファンタジー本格ゴルフ! 無料!
  • マルチプレイ• リアルタイム同期型マルチプレイ (ゴーストではありません)• つまり自分も相手も同じホール を現在プレイしている• 3G回線でもマルチプレイ可能• オフライン時はシームレスに ソロプレイに移行する
  • こんな遊び方も可能
  • リアルタイムマルチプレイに 欠かせないもの
  • ユーザーアカウント
  • それからもう一つ
  • リアルタイムチャット
  • リアルタイムチャット
  • この2つをサポートしたい
  • さらに• ユーザーアカウントは どんなゲームでも必要• 弊社の他のゲームでも 使用したい! ポケベガ 次回作以降も・・・
  • もっと• ここまで実現できたら 他社にユーザーID基盤 としてSDKを提供 できないだろうか?• 要するに プラットフォーム化
  • で、できたのがCHAO
  • 要件をまとめると1. ユーザーアカウントを作成・管理2. リアルタイムでチャット可能3. Unityに対応する4. 他のiOS向けゲームアプリでも使える できればSDK化までやる
  • (#^ω^)ムリクネ...
  • まあやります><
  • まずは技術仕様を 決めよう
  • 1. ユーザーアカウントを作成・管理2. リアルタイムでチャット可能3. Unityに対応する4. 他のiOS向けゲームアプリでも使える できればSDK化までやる
  • 1. ユーザーアカウント• アカウント作成方法はどうする? 電話番号(SMS) メールアドレス&パスワード ゲスト(登録なしで遊ぶ) 空メール OpenID (Facebook, Twitterなど)
  • 最終的な採用• 電話番号(SMS) 当初想定上の主力• メールアドレス&パスワード SMSだけでは不安• ゲスト(登録なしで遊ぶ) おそらく必要になると思われ採用
  • 余談: SMSってどうするの• Clickatell(海外) https://www.clickatell.com 安いが到達率がイマイチ• FullCourt(日本) https://www.fullcourt.co 高いがより到達率が良い
  • 1. ユーザーアカウントを作成・管理2. リアルタイムでチャット可能3. Unityに対応する4. 他のiOS向けゲームアプリでも使える できればSDK化までやる
  • 2. リアルタイムチャット• トランスポート層は? TCP?UDP?• プロトコルは? XMPP?Comet?WebSocket?自前?• LINEはTCP上に独自プロトコル(らしい)
  • 最終的な採用• Cometを模倣した実装をすることに すなわちHTTP Long Polling (すぐにレスポンスを返さないHTTP) NSURLConnectionで実装する• WWDC2012の際にAppleのネットワーク担当 の人に聞いたら「いいんじゃね」とのこと
  • 1. ユーザーアカウントを作成・管理2. リアルタイムでチャット可能3. Unityに対応する4. 他のiOS向けゲームアプリでも使える できればSDK化までやる
  • 3. Unityに対応する• プラグイン書け、以上• ・・・で終わるわけもなく・・・ Unity ∼ iOS間のデータ受け渡し制約を考慮する 必要がある 基本iOS → UnityはStringしか送れない、とか
  • 1. ユーザーアカウントを作成・管理2. リアルタイムでチャット可能3. Unityに対応する4. 他のiOS向けゲームアプリでも使える できればSDK化までやる
  • 4. の大前提• 初期段階ではiOSのみをサポートする Androidと両対応とかリソース的に無理...• ただしiOSはバージョン4.3以上を全て対 応しなければならない• 縦画面横画面どちらでも動作すること• 「バイナリを汚染しないこと」
  • 4. の大前提• 初期段階ではiOSのみをサポートする Androidと両対応とかリソース的に無理...• ただしiOSはバージョン4.3以上を全て対 応しなければならない• 縦画面横画面どちらでも動作すること• 「バイナリを汚染しないこと」
  • 「バイナリを汚染しない」• 外部ライブラリに必須依存しない• 外部ライブラリのシグネチャと 同じシグネチャを内部に持たないSDKとしてのインストール容易性の確保
  • 例: JSON O X• JSONKitがあれば • TouchJSONが必須です それを使います https://github.com/ TouchCode/TouchJSON• iOS 5.0以上の場合は • 無いと動かないよ 何もなくても NSJSONSerialization を使って動作します
  • 例: 画像 O X• CHAOSDK.bundleを貴方 • Imagesディレクトリの のプロジェクトに追加 中身をそのまま貴方の してください プロジェクトに追加し てください • header_bg.pngって名前 じゃないと動きません
  • 最悪な例
  • ということで考えた アーキテクチャ
  • Amazon RDS RDS CloudFront RDS RDS S3 Master Slaves Slaves Slaves D&G D&G Game Server Dynamo Game Server Cluster D&GD&G Client API D&G Server D&G ELB ElastiCache (Unity) API Server Cluster API ServerCHAO Client CHAO CHAO これが2系統 CHAO Streaming Server(Objective-C) Streaming Server Streaming Server (dev, production)
  • Amazon RDS RDS CloudFront S3 Master Slaves D&G Game Server Dynamo Cluster D&GD&G Client API Server ELB ElastiCache (Unity) ClusterCHAO Client CHAO CHAO CHAO Streaming Server(Objective-C) Streaming Server Streaming Server
  • Amazon RDS RDS CloudFront S3 Master Slaves D&G Game Server Dynamo Cluster D&GD&G Client API Server ELB ElastiCache (Unity) Cluster HTTP 1.1 HTTP 1.1 (Longpolling) (RESTful API)CHAO Client CHAO CHAO CHAO Streaming Server(Objective-C) Streaming Server Streaming Server
  • クライアントの実装
  • よくある File User Entity System Defaults Entity EntityMVC構造 Entity Keychain URLRepository APIClient API Stream Plugin Server Server StreamClient CHAOSDK Amazon ImageCache S3 ViewController ViewController ViewController ViewController View View View View
  • File User Entity System Defaults Entity Entity Entity Model Keychain URLRepository APIClient API StreamPlugin Server Server StreamClient CHAOSDK Amazon ImageCache S3 ViewController View
  • File User Entity System Defaults Keychain URLRepository APIClient API StreamPlugin Server Server StreamClient CHAOSDK Amazon ImageCache S3 ViewController ViewController ViewController ViewController View View View View View
  • File User Entity System Defaults Keychain URLRepository APIClient API Stream Plugin Server Server StreamClient CHAOSDK Amazon ImageCache S3Controller ViewController View
  • File User Entity System Defaults Entity Entity Entity Keychain URLRepository APIClient API StreamPlugin Server Server StreamClient CHAOSDK Amazon ImageCache S3 ViewController ViewController ViewController ViewController View View View View
  • File User Entity System Defaults Entity Entity Entity Model Keychain URLRepository APIClient API StreamPlugin Server Server StreamClient CHAOSDK Amazon ImageCache S3 ViewController View
  • Model層• 主に3種類に分類できる データエンティティ ファイルやKeychainなどのローカル API、Streamなどのネットワーク
  • データエンティティ• 基本的にただのNSObjectのサブクラス• 全てJSON Serializable/Deserializable• ただしファイルに永続化したりしない (キャッシュするときは通信層で)
  • ローカルリソース• UserDefaultsManagerやKeychainManager みたいなのが存在する• Shared Managerパターンを適用する (厳密でないSingletonパターン)m = [KeychainManager sharedManager];m.loginToken = @”12345”;[m save];
  • ネットワークリソース• APIアクセス用、Streamアクセス用、 画像キャッシュの3クライアント• URLRepositoryというアクセス先URL の管理をするマネージャを作成• テスト時や負荷分散時に使用
  • @interface CHAOURLRepository : NSObject+ (CHAOURLRepository *)sharedRepository;+ (void)releaseSharedRepository;- (NSURL *)URLForAPI:(NSString *)apiPath;- (BOOL)updateRepositoryWithInitializeResponseObject:(id)responseObject;- (CHAOSDKEnvironment)environment;- (void)setEnvironment:(CHAOSDKEnvironment)environment;@end
  • @interface APIClient : NSObject@property (nonatomic, unsafe_unretained)id<DefaultAPIResponseHandler> defaultAPIResponseHandler;- (void)cancelAllRequest;- (void)cancelRequestWithIdentifier:(NSString*)requestIdentifier;- (NSString *)api_initialize:(NSDictionary *)parameterscallback:(APIClientJSONCallback)callback;- (NSString *)api_authorize_tel:(NSDictionary *)parameterscallback:(APIClientJSONCallback)callback;- (NSString *)api_authorize_mail:(NSDictionary *)parameterscallback:(APIClientJSONCallback)callback;- (NSString *)api_login:(NSDictionary *)parameters callback:(APIClientJSONCallback)callback;- (NSString *)api_logout:(NSDictionary *)parameters callback:(APIClientJSONCallback)callback;
  • @interface StreamClient : NSObject@property (nonatomic, unsafe_unretained)id<StreamClientDelegate> delegate;@property (nonatomic, unsafe_unretained)id<DefaultAPIResponseHandler>defaultAPIResponseHandler;- (BOOL)connect;- (void)disconnect;@end
  • Model層のテスト• GHUnit • ド定番、これがなければ始まらない• OCMock • 実装をモックする際に重宝• NLTHTTPStubServer • 通信部をモックする際に重宝
  • ExampleGHCHAOSDKLogicTest.m
  • File User Entity System Defaults Keychain URLRepository APIClient API StreamPlugin Server Server StreamClient CHAOSDK Amazon ImageCache S3 ViewController ViewController ViewController ViewController View View View View View
  • View層• ViewやViewController自体は普通のiOS アプリと同じなので特に問題なし• 問題になるのは2点 Root View Controllerの検出 Viewの回転
  • ExampleUIApplication+ABGUI.m
  • File User Entity System Defaults Keychain URLRepository APIClient API Stream Plugin Server Server StreamClient CHAOSDK Amazon ImageCache S3Controller ViewController View
  • CHAOSDK.h• SDKが提供する全てのAPIを持つ パブリックインターフェース• と同時にこのシステムのControllerを 一手に引き受けるクラス
  • この方式の問題点• CHAOSDK.mが超肥大化する パブリックAPIの実装全部 ModelおよびViewのdelegate実装全部そこで実装を別ファイルに分けてしまう (要: Xcode 4.3以上)
  • Example CHAOSDK.m
  • 開発ワークフロー
  • 良い開発は良いツールから• github• My Redmine• TestFlight• 社内CI用Mac miniサーバ (Jenkins)
  • • github• My Redmine• TestFlight• 社内CI用Mac miniサーバ (Jenkins)
  • githubのいいとこ• Xcode 4以上はgitをネイティブサポート しているため相性がよさげ• branchとかあまり切らないで普通に運用• コードレビューが無茶苦茶はかどる
  • githubのわるいとこ• githubはいいけどgitはわからん• WikiとIssuesはイマイチ• 落ちると仕事にならないリスクがある• 外部のサーバにコードを預けるのは ちょっと...という会社の規約があったり
  • • github• My Redmine• TestFlight• 社内CI用Mac miniサーバ (Jenkins)
  • My Redmine• 外部のテスターさんとかに使ってもら おうとするとすごく便利• お値段もそんなに悪くない• バージョンアップもやってくれる• 申し込みが書面なのがイマイチ
  • • github• My Redmine• TestFlight• 社内CI用Mac miniサーバ (Jenkins)
  • TestFlight• 無いと生きていけない• ナイトリーでビルドを全員に配布する 翌朝みんなでレビュー!• DLに時間がかかったりするので Jenkinsによる社内ホスティングも併用
  • • github• My Redmine• TestFlight• 社内CI用Mac miniサーバ (Jenkins)
  • Jenkins• githubをSCM Pollingして随時ビルド 単体テストを実行• ビルドを自動的にTestFlightに アップロードしたりホストしたり• コードカバレッジを計測したり
  • ドキュメンテーション
  • ドキュメンテーション• 二種類のドキュメントが必要• ひとつは社内用、開発者向け Wikiとかで済ませる• もうひとつは社外用、SDK利用者向け Sphinxの出番
  • • http://sphinx-doc.org/• RestructuredTextという記法で書かれた テキストからHTMLやPDFなどのドキュ メントを生成するツール• 拡張が容易• テキストなのでgit管理ができる
  • ExampleSphinxで作られたドキュメント
  • まとめ
  • チャットをつくるということ• iOSでリアルタイムチャットを作るのは 思ってたより簡単にできます• 問題になるのはサーバ側...• Androidとの両対応も課題
  • SDKを作るということ 賢く 便利に 慎ましく
  • これらを実現するために• 良いアーキテクチャ• 良いテストとレビュー• 良いドキュメント• それらを支える良いツール
  • 余談: 人材募集
  • サーバエンジニア募集中• Pythonとか使います• AWSでインフラ整備• データマイニングも?• 詳しくはこちら www.appbankgames.net/ recruit/
  • Thank you for watching.