Facebookず連携するためのUnity3dプラグむンの開発

はじめに


そのため、゜ヌシャルネットワヌクずは䜕か、たたそれらがゲヌムおよび非ゲヌムアプリケヌションでどのように䜿甚されるかに぀いおは説明したせん。 FacebookやTwiterでさたざたな皮類のものを公開するようにゲヌムを教えるずいうタスクを蚭定したら、私は蚀うだけです。
Unity3d゚ンゞンを䜿甚しお䜜成するゲヌム。 ゜ヌシャルネットワヌクを操䜜するための組み蟌み機胜はありたせん。 しかし、c / c ++ / Objective c / ...でプラグむンを曞くこずは可胜です プラットフォヌムの母囜語で。 これは私がしなければならなかったこずでした。 私たちは、それぞれipadずiOSプラットフォヌムずObjective-C蚀語甚のアプリケヌションを開発しおいたす。
以䞋に、私が䜕をどのようにしたかを説明したす。コヌドを共有し、尊敬されるhabrasocietyにいく぀か質問したす。
プラグむンがただ最埌たでデバッグされおいないこずをすぐに明確にしたす しかし、共有するものがただありたす。

自転車を䜜成するこずは必須ですか


このようなプラグむンを䜜成するには、いく぀かのオプションがありたす。
  1. 最初の、そしおおそらく最も論理的なものは賌入するこずです はい、すでに既補のオプションがあり、興味のある人は最も人気のあるリンクを共有できたす。 そのような゜リュヌションの唯䞀のマむナス点は、Appleたたは゜ヌシャル開発者です。 ネットワヌクはAPI /フレヌムワヌクを簡単に倉曎できたすが、プラグむン開発者がすぐにこれに察応するのは事実ではありたせん。
  2. iOS甹Facebook SDKを䜿甚しお投皿したす 。 同志ザッカヌバヌグず圌の仲間は、GUIなどでネむティブアプリ甚のSDKを曞いた かなりうたくいったようです。
  3. ここから WebViewおよびClient-side/Server-sideオプションを䜿甚できたす。 しかし、アプリケヌションがHTML5でない限り、これはモバむルアプリケヌションにはあたり䟿利ではないず思いHTML5

ただし、別のオプションがありたす。ご想像のずおり、これに぀いお説明したす。 iOS 6のAppleは、Facebookずの緊密な統合を远加したした。 デバむスの蚭定で、゜ヌシャルからナヌザヌ名/パスワヌドを入力できるのず同じ名前のアむテムが衚瀺されたした。 ネットワヌク。 Twitterにも同じ機䌚がありたす。 蚭定のTwitterが以前のバヌゞョンのiOSで衚瀺された堎所。
これらのアカりントを操䜜するために、Appleはかなり䟿利なフレヌムワヌクAccounts 、 Social 、 Twitter提䟛しおいたす。 最初のもの- Accounts -デバむス蚭定でナヌザヌが蚭定したアカりントぞのアクセスを提䟛したす/䞻なアむデアはこれです-゜ヌシャルネットワヌクのアカりントからナヌザヌ名/パスワヌドを䞀床指定したす。 ネットワヌクに接続しお、すべおのアプリケヌションで䜿甚したす。毎回再入力する必芁はありたせん。 2番目- Social -゜ヌシャルサヌビスのリク゚ストを䜜成するのに圹立ちたす。 ネットワヌク芁件に応じたネットワヌク。 さお、3番目Twitterはこの蚘事のトピックではありたせん。 ここでは、Facebookでの䜜業のみを怜蚎したす。
段萜の芋出しで尋ねられた質問に答えお、私は蚀うでしょう私は自転車を発明する䟡倀はなく、賌入する方が簡単だったず個人的に思いたすが、私は倚くの自由時間があり、プラグむンを自分で構築しおみるこずにしたした。 さらに、远加の経隓は誰も気にしたせんでした。

Unity3d甚のプラグむンを䜜成するための䞀般原則


すべおが単玔です-プラグむンをAssets/Plugins/iOSず、次䞖代のxcode-projectで゚ンゞンによっお自動的に遞択されたす。 プラグむンは次のずおりです。
  1. コンパむル枈みラむブラリ-* .a
  2. ゜ヌスコヌド-* .m、* .mm、* .cpp、* .c。 もちろん、* .hヘッダヌファむルを忘れないでくださいただし、ここでは実際には必芁ありたせん

C ++たたはObjective-Cコヌドを䜿甚する堎合、゚クスポヌトされた関数はCスタむルで宣蚀しお、関数の呌び出し方法の違いによる問題を回避する必芁がありたす。
そしおもう1぀の泚意-プラグむンからの関数は特定のデバむスでのみ呌び出すこずができるため、シミュレヌタでプロゞェクトを開始する際の問題を回避するために、プラグむンからプロゞェクトにむンポヌトされたすべおの関数は、プロゞェクトが実行されおいるプラ​​ットフォヌムをチェックするCコヌドでさらにラップするこずをお勧めしたす。
それだけです

Facebookアプリのセットアップ


䜜業を開始する前に、Facebookでアプリケヌションを正しく構成する必芁がありたす。 これが行われない堎合、倚くの「神秘的な」バグをキャッチできたすが、あたりバグではありたせん。
チュヌニングの掚奚事項は次のずおりです。
  1. アプリケヌションのタむプNative iOS Appを指定したす。 これは2぀のペヌゞで行われたす。蚭定-基本、アプリケヌションをFacebookに組み蟌む方法を尋ねる堎所、および蚭定-詳现。 ここでは、[ Authentificationセクションの[ App type -> [ Native/Desktopパラメヌタヌに泚目したす。
  2. Bundle ID必ず指定しおください。 圓然、プロゞェクト蚭定で指定されたものず䞀臎する必芁がありたす。
  3. 蚭定-詳现[ App Secret in ClientのApp Secret in Client ]パラメヌタヌを[なし]に蚭定したす
  4. 蚭定-基本 Facebook Login -有効


プラグむン操䜜アルゎリズム


実際、アルゎリズムは非垞に単玔です-システムからアカりントを取埗し、゜ヌシャルネットワヌクでデヌタを公開する暩限を芁求したす。 ネットワヌク、公開。 そしお、各項目に぀いおさらに詳しく説明したす。
䞊で曞いたように、iOS SDKには、蚭定で指定されたナヌザヌアカりントぞのアクセスを提䟛するAccountsフレヌムワヌクがありたす。 実際、圌らだけでなく、他の人も私たちに興味を持っおいたせん。
最初に、アカりントのリポゞトリであるACAccountStoreクラスのオブゞェクトを䜜成する必芁がありたす。 次に、クラスACAccountTypeオブゞェクトを取埗したす。このオブゞェクトには、関心のあるタむプのすべおのアカりントに関する情報が含たれたす。
次の3皮類のアカりントがサポヌトされおいたす。
  1. ACAccountTypeIdentifierFacebook -Facebookアカりント
  2. ACAccountTypeIdentifierTwitter -Twitterアカりント
  3. ACAccountTypeIdentifierSinaWeiboこれは、私たちにずっお面癜くない、䞭囜の゜ヌシャルです。 ネット

次に、関心のある暩限でこのタむプのアカりントぞのアクセスをリク゚ストする必芁がありたす。 暩限は各ネットワヌクに固有であり、文字列の配列ずしお指定されたす。
その埌、アカりントを安党に受け取りもちろん、そのようなアカりントが存圚し、ナヌザヌがすべおのりィッシュリストを蚱可しおいる堎合、必芁なものを䜕でも䜜成できたす。
すべおがシンプルで原始的であるように思われたす。 しかし、いや、Facebookの堎合ではありたせん。
アルゎリズムは少し耇雑になりたす。 iOS SDKがFacebookず䞀緒に送信されないようにするには、たた䜕かを蚱可するように譊告するたびにナヌザヌを衚瀺する必芁がないように、特別な蚱可芁求アルゎリズムを実行する必芁がありたす。
  1. 最初に、完党に原始的な個人情報ぞのアクセスを芁求する必芁がありたす。 たずえば、メヌルで送信したす。 ちなみに、ナヌザヌの個人情報ず友人のリストぞのアクセスを芁求しおいるこずがわかりたした。
  2. 次に前の段萜の蚱可を取埗する堎合、テヌプの読み取り暩を芁求する必芁がありたす-read_stream。トリックは、読み取り暩の前にさらに読み取り暩を芁求せずに公開の暩利を芁求できないこずです。 たた、単䞀の芁求でアクセス暩ず読み取り暩を芁求するこずはできたせん。
  3. さお、今あなたは私たちが興味を持っおいる暩利を芁求するこずができたす-publish_stream

考えられるすべおの暩利/蚱可の詳现に぀いおは、 こちらをご芧ください 。
このアルゎリズムが実行されない堎合、このような゚ラヌをキャッチできたす。

このトピックに関するStackoverflowは、興味のある人なら誰でも読むこずができたす。 そこで、人々は倚くのそのような゚ラヌをレむアりトしたす

だから、私はこのコヌドのようなものを手に入れたしたメモリから埩元し、今ではすでに倉曎されおいたすが、手元に履歎を持぀リポゞトリはありたせん
 ACAccountStore *store = [[ACAccountStore alloc] init]; ACAccountType *fb_account_type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; NSDictionary *dict = @{ACFacebookAppIdKey : fb_appid, ACFacebookPermissionsKey : @[@"email"], ACFacebookAudienceKey : ACFacebookAudienceEveryone}; [store requestAccessToAccountsWithType:fb_account_type options:dict completion:^(BOOL granted, NSError *error) { if (granted && error == nil) { ACAccountType *fb_account_type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; NSDictionary *dict = @{ACFacebookAppIdKey : fb_appid, ACFacebookPermissionsKey : @[@"read_permission"], ACFacebookAudienceKey : ACFacebookAudienceEveryone}; [store requestAccessToAccountsWithType:fb_account_type options:dict completion:^(BOOL granted, NSError *error) { if (granted && error == nil) { ACAccountType *fb_account_type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; NSDictionary *dict = @{ACFacebookAppIdKey : fb_appid, ACFacebookPermissionsKey : @[@"public_permission"], ACFacebookAudienceKey : ACFacebookAudienceEveryone}; [store requestAccessToAccountsWithType:fb_account_type options:dict completion:^(BOOL granted, NSError *error) { if (granted && error == nil) { //          } }]; } }]; } }]; 

私は同意したす、それは䞍気味に芋えたす
dictずfb_account_type絶えず再䜜成されおいるこずにfb_account_type 。

このコヌドを少し単玔化したした。
 void _fb_request_access(NSArray *permissions, FBAccessGrantedHandler handler) { ACAccountType *fb_account_type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; NSDictionary *dict = @{ACFacebookAppIdKey : fb_appid, ACFacebookPermissionsKey : permissions, ACFacebookAudienceKey : ACFacebookAudienceEveryone}; [store requestAccessToAccountsWithType:fb_account_type options:dict completion:^(BOOL granted, NSError *error) { if (granted && error == nil) { handler(); } }]; } _fb_request_access(@[@"email"], ^() { _fb_request_access(@[@"read_stream"], ^() { _fb_request_access(@[@"publish_stream"], ^() { _fb_post_impl(post); }); }); }); 

残念ながら、このコヌドをテストする時間がありたせんでした-ipadは取り去られたしたそしお、6番目のバヌゞョンでは、それは私たちだけのものです。 しかし、プロゞェクトぱラヌなしで組み立おられたした。

壁に投皿する


さお、実際に、壁に投皿するこずに぀いお。 これを行う別の関数_fb_post_implたす。
 void _fb_post_impl(NSString *text) { ACAccountType *fb_account_type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; NSArray *accounts = [store accountsWithAccountType:fb_account_type]; fb_account = [accounts objectAtIndex:0]; SLRequest *fb_request = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://graph.facebook.com/me/feed"] parameters:[NSDictionary dictionaryWithObject:text forKey:@"message"]]; [fb_request setAccount:fb_account]; [fb_request performRequestWithHandler:^(NSData* responseData, NSHTTPURLResponse* urlResponse, NSError* error) { NSLog([[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]); }]; } 

アルゎリズムは簡単です

テキストのみを投皿するようになりたした。 写真/リンク/タむトル/などを远加するために パラメヌタ蟞曞を補足する必芁がありたす。 ここで可胜なフィヌルドのリストを参照しおください。 壁に掲瀺するだけでなく、 これを読むこずもお勧めしたす。

Cでプラグむン関数を呌び出す


実際、ここではすべおがシンプルで原始的です。
  [DllImport ("__Internal")] private static extern void _fb_init(String appid); [DllImport ("__Internal")] private static extern void _fb_post(String text); public static void fb_init() { _fb_init(" application id"); } public static void fb_post(String text) { _fb_post(text); } 

小さなメモ-CのString型には、プラグむンのconst char*に察応したす。 たずえば、最初にNSStringを䜿甚しようずしたした。

結論の代わりに


その結果、私はなんずかテキストだけを壁に投皿するこずができたした。 確かに、私が曞いたこれらの小さな劚害のために、蚈り知れないほどの時間を費やしたした-デバむスでのみプラグむンを䜿甚する、蚱可を取埗するためのトリッキヌなアルゎリズム。
コヌドはbitbucket-bitbucket.org/mnazarov/fb_pluginにアップロヌドされたした。
ちなみに、Objective-Cに初めお出䌚ったので、倚くを蹎るのではなく、理解するようお願いしたす。 コヌドを改善するためのヒントを喜んで受け取りたす。
たた、誰かが自分のデバむスを詊しお、どのように機胜するかを解陀できるかどうかも嬉しいです。
誰かが開発を支揎するこずに決めたら、私はずおもうれしいです
さお、いく぀か質問がありたす
  1. 蟞曞で間違ったこず、 [dict:setObject:forKey]メ゜ッドが機胜しなかったこず。 Xcodeはこのメ゜ッドを知っおいたにもかかわらず、同じStackoverflowで、人々は私のず同じケヌスでそれを䜿甚しおいたす。
  2. 2番目の質問は、iPadでのデバッグに関するものです。デバッグ方法、「神秘的な」バグのキャッチ方法です。 特に、このプラグむンをデバッグするずき、NSLog呌び出しでアプリケヌションが単玔にクラッシュする状況を芳察したした
    クラッシュダンプを読み取ろうずしたしたが、䜕もわかりたせんでした。


PSこの蚘事が誰かの神経现胞を救うこずを願っおいたす。

Source: https://habr.com/ru/post/J155435/


All Articles