• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
リアルタイムチャットSDKのできるまで
 

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

on

  • 10,032 views

2013/02/24 conferenceWithDevelopersにて発表

2013/02/24 conferenceWithDevelopersにて発表

Statistics

Views

Total Views
10,032
Views on SlideShare
9,260
Embed Views
772

Actions

Likes
38
Downloads
41
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.