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

Like this? Share it with your network

Share

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

  • 11,130 views
Uploaded on

2013/02/24 conferenceWithDevelopersにて発表

2013/02/24 conferenceWithDevelopersにて発表

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
11,130
On Slideshare
10,358
From Embeds
772
Number of Embeds
7

Actions

Shares
Downloads
44
Comments
0
Likes
41

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

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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