Facebook SDK(iOS)のモバイル無料プレイゲームへの統合

画像 モバイルの無料プレイは、ゲームでソーシャルネットワークを使用しなくてもほぼ完了しています。 ソーシャルネットワークは、いわゆるバイラリティ (英語から。ウイルス-バイラル、つまり、ある人から別の人にウイルスのように広がることができる)を提供し、最小限のコストで新しいプレイヤーを引き付けることができます。 この記事では、FacebookをiOSプラットフォームのAlawarゲームに統合した経験を共有します。



一般的なモバイルの無料プレイゲームでは、Facebookの統合により次の機能が提供されます。

  1. Facebookのユーザーアカウントを介した承認の可能性。 このような承認は、ゲームユーザーに対して最小限の労力で一意の識別子を作成するという点で優れています。 プレーヤーは、ログインを作成したり、メールアドレスを入力したりする必要はありません。 結局のところ、テキストデータを絶えず入力するのが少し面倒なモバイルアプリケーションについて話しているのです。 ロゴ「f」が認識されているボタンを1回押すだけで十分です。 開発者には利点があります-プレーヤーの進捗状況は、異なるプラットフォーム上の異なるデバイス間で同期できます。主なことは、Facebookがこれらのプラットフォーム上にあることです。
  2. 友達にリクエスト(アプリリクエスト)を送信する機能。 リクエストは、プレーヤーのFacebookページ(およびFacebookアプリケーション)に表示されるメッセージであり、ゲーム関連の情報が含まれています。 典型的なリクエストには、友人からのゲームへの招待、「何かを送ってください」または「レベルを渡すのを手伝ってください」などのリクエストが含まれます。 最終的に、リクエストは、それをクリックしてゲーム(またはAppストアのゲームページ)にアクセスする人にのみ必要です。 リクエストの使用は、新しいプレーヤーを引き付け、古いプレーヤーを無料でゲームに戻すための強力なメカニズムです。
  3. タイムラインで投稿を送信する機能。 この投稿により、タイムラインを読んだ人にゲームを報告できます。 ゲームは通常、プレーヤーの実績に関する情報をそこに配置し、競争力のある要素を追加します。
  4. Facebookアカウントからプレーヤーに関する情報を取得する機能。 ほとんどの場合、そのような情報には、プレーヤーの名前、彼のアバター、そしておそらく彼の友人のアバターが含まれます。 ネタバレの下で実際にプレイできる無料のゲームでアバターを使用する例。
    アバター付きゲーム
    画像






Facebookの統合を簡素化するために、クライアント側から必要なほぼすべてを実装するデモアプリケーションを作成しました。



デモアプリ



デモアプリケーションは、C ++(ほとんどの無料ゲームと同様)で記述され、Objective-Cに挿入されており、 Cocos2d-xエンジンで最も簡単なアプリケーションです( こちらからダウンロードできます)。 長方形は画面上を移動し、これらの境界に達すると画面の境界から反映されます。

画像

管理は4つのボタンを使用して実行されます。f-承認、REQ-友人へのリクエストの送信、POST-タイムラインへの投稿とログアウト。 承認後、ユーザーのアバターが四角形の場所に配置され、歓迎の碑文が追加されます。

画像

コンパイルするには、 Facebook SDKをダウンロードしてインストールし、Facebook SDKフレームワークをXcodeのプロジェクトに追加する必要があります。 Facebook SDKバージョン3.9を使用しました。

デモアプリケーションを開始するには、開発者のポータルで独自のFacebookアプリケーションを作成し、デモアプリケーションのplistにその識別子を登録し、他のいくつかの簡単な操作を実行する必要があります。 詳細については、 こちらをご覧ください



技術的な実装の詳細



アクセス権


クライアントにFacebookを統合するときに最初に遭遇するのは、許可を求めるセッションを作成することです。Facebookはさまざまなオプションを提供しています 。 衝動を抑え、一度にすべてへのアクセス権を要求しないことが重要です。 アクセス権が本当に必要なときにアクセス権をリクエストすることをお勧めします。 セッションを作成するとき、基本的な権利のみを要求します。



+ (NSArray*) getBasicPermissions { NSArray* permissions = [[NSArray alloc] initWithObjects: @"user_birthday", nil]; return permissions; }
      
      







この場合、認証中に次のダイアログが表示されます。

画像

また、iOSダイアログのネイティブは、設定でデバイス上でFacebookが事前承認されている場合にのみ表示されるという事実にも注意を払う必要があります。



画像



そうでない場合、iOSはFacebookアプリケーション(App Storeからインストールされた場合)を使用するか、ブラウザーでFacebookを開こうとします。

タイムラインで何かを公開する権利が必要な場合、または友人をリクエストする場合、このための権利をリクエストします。



 + (void) requestPublishPermissions { if (hasPublishPermissions) return; NSArray *permissions = [[NSArray alloc] initWithObjects: @"publish_actions", @"publish_stream", nil]; [[FBSession activeSession] requestNewPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *session, NSError *error) { hasPublishPermissions = [[FBSession activeSession].permissions containsObject:@"publish_actions"] && [[FBSession activeSession].permissions containsObject:@"publish_stream"]; if (g_handler) { g_handler->OnGetPublishPermissions(hasPublishPermissions); } }]; }
      
      







この場合、次のダイアログが表示されます。

画像

プレーヤーは自分に代わって公開を拒否する場合がありますが、承認は許可することに注意してください。 これらのケースは慎重に処理する必要があります。



友達へのリクエスト


友人へのリクエスト(アプリリクエスト)の実装については、 ドキュメントで詳細に説明されていますが 、微妙な点がいくつかあります。 基本的なクエリの実装では、以下に示すダイアログボックスが表示されます。

画像

この実装のコードはネタバレです。

実装
 + (void) requestFriend { // more details here // https://developers.facebook.com/docs/ios/send-requests-using-ios-sdk/ if (!friendsCache) { friendsCache = [[FBFrictionlessRecipientCache alloc] init]; } [friendsCache prefetchAndCacheForSession:nil]; [FBWebDialogs presentRequestsDialogModallyWithSession:nil message:@"Help me, friend!" title:@"Help me!" parameters:nil handler:^(FBWebDialogResult result, NSURL *resultURL, NSError *error) { if (error) { NSLog(@"Error sending request"); } else { if (result == FBWebDialogResultDialogNotCompleted) { NSLog(@"User canceled request"); } else { NSDictionary *urlParams = [FacebookController parseURLParams:[resultURL query]]; if (![urlParams valueForKey:@"request"]) { NSLog(@"User canceled request"); } else { NSLog([NSString stringWithFormat: @"Request Sent: %@", [urlParams valueForKey:@"request"]]); } } } } friendCache:friendsCache]; }
      
      





クエリウィンドウの動作は、パラメータの後に渡されるパラメータを使用して、ダイアログが呼び出されたときに制御できます。 たとえば、次の一連のパラメータを使用すると、事前に知られている友人にリクエストを送信できます。



 NSString *friendId=@"100006530868327"; NSMutableDictionary* params = [[NSMutableDictionary alloc] init]; params[@"to"] = friendId;
      
      







この場合のFacebook SDKは、変更されたアプリリクエストウィンドウを表示し、この友人が後続のリクエストでウィンドウを表示しないことを提案します。



タイムライン投稿


Facebookでは、いわゆるストーリーをタイムラインに投稿できます。 ストーリーを作成するには、Facebook開発者ポータルのアプリケーションの左側のメニューで[グラフを開く]を選択する必要があります 。 ストーリー、オブジェクトタイプ、アクションタイプの3つのタブが表示されます。 オブジェクトタイプは、バッジなど、ゲームのユーザーが遭遇する可能性のあるオブジェクトのグループをまとめたものです。 次に、Findアクションなど、Badgeオブジェクトに適用できるアクションが必要です。 アクションのタイプとオブジェクトのタイプを組み合わせて、バッジの検索ストーリーを作成できます。 Facebookにはストーリーをカスタマイズする十分な機会があります。 詳細については、 こちらをご覧ください。

作成したストーリーをアプリケーションから公開するためのコードを取得するには、ストーリーの名前の右側にある「コードを取得」の碑文をクリックする必要があります。 必要なプラットフォーム(この例ではiOS SDK)と[オブジェクトのコード]タブを選択します。 システムは次のようなコードを生成します。



 NSMutableDictionary<FBGraphObject> *object = [FBGraphObject openGraphObjectForPostWithType:@"aw_test:badge" title:@"Sample Badge" image:@"https://fbstatic-a.akamaihd.net/images/devsite/attachment_blank.png" url:@"http://samples.ogp.me/473380876115865" description:@""];; [FBRequestConnection startForPostWithGraphPath:@"me/objects/aw_test:badge" graphObject:object completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { // handle the result }];
      
      







[アクションコード]タブで、アクションのコードを取得できます。 タイムラインでストーリーを作成するには、最初にオブジェクトを作成してから、このオブジェクトでアクションを作成する必要があります。

奇妙なことに、このコードは機能しません。 変更せずにプロジェクトに含めると、クラスの1つで検出されなかったセレクターによるクラッシュが発生します。 これを修正するには、作成したOpen Graphオブジェクトのパラメーターに数行を追加する必要があります。



 object[@"create_object"] = @"true"; object[@"fbsdk:create_object"] = @"true";
      
      







この「魔法」はクラッシュを修正しますが、タイムラインの投稿はまだ機能しません。 すべてが機能したことを示す良い兆候は、Facebookから返されるコールバック操作IDです。 識別子は数字のセットです(たとえば、586146891470767)。 ポータルから受け取ったコードに応答して、ストリング「true」が来ます。 これは、コードをもう少し修正することで修正できます。 特に、オブジェクトの作成時には、コードジェネレーターによって提案されたstartForPostWithGraphPath呼び出しをstartForPostOpenGraphObjectに置き換える必要があります。

タイムラインに投稿するための完全なコードは、ネタバレの下に見ることができます。

実装
 + (void) createOpenGraphObjectWithType:(NSString *) type title:(NSString *) title url:(NSString *) url image:(NSString *) image handler: (OpenGraphObjectCreationHandler) handler { NSMutableDictionary<FBOpenGraphObject> *object = [FBGraphObject openGraphObjectForPostWithType:type title:title image:image url:url description:@""]; object[@"create_object"] = @"true"; object[@"fbsdk:create_object"] = @"true"; [FBRequestConnection startForPostOpenGraphObject:object completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { if (!error && result != nil) { NSLog([NSString stringWithFormat:@"Posting object '%@' (id=%@) is created!", title, [result objectForKey:@"id"]]); handler([result objectForKey:@"id"]); } else { NSLog([NSString stringWithFormat:@"Posting object creation error: %@", error]); } }]; } + (void) postStory { NSString* badge_title = @"Blue Badge"; NSString* badge_url = @"http://demo.tom3.html5.services.alawar.com/images/tester/blue_badge.htm"; NSString* badge_image = @"http://demo.tom3.html5.services.alawar.com/images/tester/blue_badge.png"; int rnd = arc4random() % 2; if (rnd == 0) { badge_title = @"Red Badge"; badge_url = @"http://demo.tom3.html5.services.alawar.com/images/tester/red_badge.htm"; badge_image = @"http://demo.tom3.html5.services.alawar.com/images/tester/red_badge.png"; } [FacebookController createOpenGraphObjectWithType:@"aw_test:badge" title:badge_title url:badge_url image:badge_image handler:^(NSString *objectId) { // action NSMutableDictionary<FBGraphObject> *action = [FBGraphObject graphObject]; action[@"badge"] = objectId; action[@"fb:explicitly_shared"] = @"1"; [FBRequestConnection startForPostWithGraphPath:@"me/aw_test:find" graphObject:action completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { if (!error && result != nil) { NSLog([NSString stringWithFormat:@"Posted (id=%@)!", [result objectForKey:@"id"]]); } else { NSLog([NSString stringWithFormat:@"Posting error: %@", error]); } }]; }]; }
      
      





注意深い読者は、アクションのコードに追加のパラメーターが追加されていることに気付くでしょう。



 action[@"fb:explicitly_shared"] = @"1";
      
      







このパラメーターが設定されていない場合、作成された履歴はタイムラインではなくユーザーの最近のアクティビティに移動します。 すべてが正しく行われていれば、ユーザーのタイムラインで次の図に似たものを観察できます。



画像



対処する最後のポイント:オブジェクトの説明が保存される場所と方法。 オブジェクトの説明は、いくつかのオープンサーバーに特別にマークアップされたhtmlドキュメントとして保存されます。 また、画像はFacebookがアップロードするオープンサーバーでホストされます。



結論の代わりに



Facebookゲームに統合することに決めた場合、これは数分ではないことを覚えておいてください。 Facebookを通じてゲームがユーザーとどのようにやり取りするかを必ず検討してください。 そうでなければ、プレイヤーを引き付けるための便利なツールの代わりに、プレイヤーを悩ます別のアプリケーションを受け取ります。 スパムに関するプレイヤーからの苦情により、Facebookはアプリケーションを禁止しますが、もちろん誰も望んでいません。

実践が示すように、誰もがFacebookを簡単に利用できるわけではありません。 このソーシャルネットワークを統合した経験が皆様のお役に立てば幸いです。



All Articles