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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

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

  • 10,550 views
Published

2013/02/24 conferenceWithDevelopersにて発表

2013/02/24 conferenceWithDevelopersにて発表

Published 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
10,550
On SlideShare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
45
Comments
0
Likes
43

Embeds 0

No embeds

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.