1. 程式人生 > >接入Facebook的那些坑(精)

接入Facebook的那些坑(精)

轉自:http://blog.csdn.net/piao_polar/article/details/46742043

 之前工作需要在手遊中接入了facebook,並以此寫了《手遊接入Facebook功能》的博文。當時facebook sdk的版本還是3.x,程式碼整合度比較低,整合起來也比較麻煩。文中只是稍微提了下功能,然後扔了個github的demo連結,對一些細節問題沒有描述。

    之後公司裡另外一個專案也有facebook的接入需求,並且由他們的運營方來具體實現,我們當時就facebook許可權稽核等問題討論的比較頻繁,以至於後來他們直接建了一個Facebook SDK開發群,不想後面常常有其他開發者搜尋到這個群來交流問題。facebook sdk也更新了4.x版本(介面全變,但更優雅了。github上的demo,android版本已更新使用4.x sdk),感覺不少問題可以記錄下來備忘,於是就有了本文。




1. 關於是否需要上傳app給facebook稽核:https://developers.facebook.com/docs/facebook-login/permissions/#noreview

a) 不需要稽核的功能點:

   使用FB進行第三方登入:Facebook Login 
   獲取已登入FB賬號的相關資訊,許可權:public_profile
   獲取已登入FB賬號的同應用好友資訊,許可權:user_friends
   使用FB應用邀請功能:App Invites
   使用FB分享存文字或連結:Sharing
   在裝置上存在Facebook客戶端的情況下,分享本地圖片

b) 需要稽核的功能點:


   非測試賬號,在裝置上不存在Facebook客戶端的情況下,直接通過FB API分享本地圖片 許可權:publish_actions


2. 關於FB稽核:

   FB稽核和蘋果稽核相比,速度很快,經常一個工作日就給結果。但他們返回的錯誤說明太格式化,也比較簡略。也許會讓人感覺莫名所以。而且似乎沒有申訴過程,對稽核結果不滿意只好說明寫詳細點再提交一次。
   由於稽核的是許可權而不是app本身,也不通過FB來發行。我們可以針對稽核出一個版本,反正到時候稽核過了,真正上架的版本可以另出

a) 拒絕理由:我們無法在此平臺上重現您所請求的功能的個性化體驗。請提交使用此功能的應用版本,並附上詳細的步驟指示。



   由於FB的稽核人員和蘋果的稽核不一樣,他們大部分看不懂中文。

   解決方案:步驟和描述最好用英文寫的細緻點,提交的配圖也加上1.2.3的順序,和足夠的標註。
   藏在比較深的功能,可以專門做一個稽核版本,放在容易觸發的地方。比如我原先分享截圖是在戰鬥結束後分享,稽核總是說順利進行分享,最後我提交FB稽核的版本直接在登入介面放了一個分享按鈕,就解決這個問題了。

b) 拒絕理由:使用者必須在使用者訊息欄位輸入所有內容


   分享不能有預置內容。比如你試圖在分享截圖的時候,自動填充“XXX遊戲真好玩,你也一起來玩吧”之類的話,稽核有可能會駁回(那你SDK給這個接口乾嘛……)

   解決方案:同上,依然是出稽核版本的時候別填充,正式版本暗度陳倉就是了……

c) 拒絕理由:這個許可權你的應用莫須有。



   比如:您的應用使用社交外掛或分享對話方塊將內容分享至Facebook。這些操作不需要publish_actions許可權,也不需要接受稽核。

   我遇到的情況是有分享截圖的需求,申請publish_actions的時候遇到。這個其實是稽核人員的考慮不周的問題。如上述稽核功能點部分所說,如果使用者的裝置上沒有FB app,那麼分享本地檔案是需要這個許可權的。

   解決方案:再次提交,且在重現步驟中強調,在一個沒有安裝FB app的裝置中分享本地圖片是需要許可權的。還可以上傳包含這個的截圖(換成你自己在相應許可權下的截圖)給他看提高說服力,然後祈禱下次稽核的人員能認真和專業點。



d) 拒絕理由:Your app must not use a Facebook Web Dialog.Utilize our native Facebook Login SDK for iOS, so that users do not need to login twice.

   這個是一個比較坑爹的理由。因為第一句別用facebook web dialog,很容易讓人誤以為是任何情況下都不許用,但這不現實,因為沒有FB app的情況下,你必須用到這個形式。其實真實的情況是:

   你:說人話
   FB:在裝置上存在FB app的情況下,別用web dialog的形式讓使用者登入。

   這樣應該就理解了吧。

   解決方案:檢查在有FB app的情況下,呼叫登入介面時,會轉向到FB app去登入(如果FB app是已登入狀態則不需要再登入)。而不是彈出瀏覽器頁面或者在應用內彈出視窗讓使用者輸入密碼。
             在FB控制檯,Settings頁下把Single Sign On 開起來。



3. 疑難雜症

a) 用具有測試許可權或更高許可權的號可以登入,普通賬號無法登入。

   因為應用沒有設定成對外可用的狀態。

   解決方案:去FB控制檯,Status&Review分頁下,把右上角“Do you want to make this app and all its live features available to the general public?”邊上那個大大的開關設定成開的狀態。

b) 整合程式碼貌似都加上了,但觸發相關功能沒效果或會閃退

   一般是文件沒讀仔細還是有缺漏導致的。把兩個版本的Getting Started一節再看看檢查一遍。

   android:AndroidManifest.xml裡 FB相關的 provider/meta-data/activity 沒加,或者沒改成對應SDK版本的格式 (3.x/4.x的provider和activity的內容都略有變化
            strings.xml 裡 facebook_app_id 沒加

   iOS:plist 裡面 FacebookAppID / FacebookDisplayName / URL types
        application delegate 裡面 applicationDidBecomeActive/didFinishLaunchingWithOptions/openURL 沒新增響應的FB程式碼

c) 進入登入成功回撥,有AccessToken,但Profile資料不正常

   解決方案:先參考前面一點,看看是不是都加好了。

   android:在獲取到AccessToken後呼叫 Profile.fetchProfileForCurrentAccessToken();

   iOS:新增 [FBSDKProfile enableUpdatesOnAccessTokenChange:YES];

d) 實現App Invite的時候提示App Link有問題

   解決方案:這個Link必須去FB建立:https://developers.facebook.com/quickstarts/?platform=app-links-host

e) App Invite呼叫成功後對方收不到訊息:

   如果對方已經安裝了這個應用,那麼你得他的FB賬號設定成測試者,才能再次收到訊息。見官網說明Testing一節

   參:http://stackoverflow.com/questions/29484815/fbsdkappinvitedialog-in-facebook-ios-sdk-version-4-0-1-invite-successfully-sent


4. 其他

a) 使用Graph API Explorer

   可以比較方便的模擬資料來回,也可以用來清理許可權。

b) 如果升級到iOS SDK 4.x,那麼就不再支援iOS7以下的系統了,比如iOS6。這個得和運營商量好。

c) 寫本文的時候,由於之前都沒儲存截圖,所以用的基本都是群裡或者私聊中別人的截圖。發現他們的截圖貌似都是中文的,而我當時自己遇到的稽核錯誤提示貌似都是英文的

   後面才發現官網頁面最下方,FB官方可以選擇一個檢視頁面的語言,部分頁面有FB的官方翻譯。英文苦手的可以考慮使用。

   不過直接看英文可能會更好,因為不是所有的頁面都有官方翻譯版本,有的頁面翻譯可能是過期的,而且google的時候,通常用英文做關鍵詞才方便從StackOverFlow找到有用的資訊

5. 資源

a) FB官方的SDK原始碼和demo

https://github.com/facebook
https://github.com/facebookarchive

b) cocos2dx接入demo。 (FB SDK版本:Android 4.x/iOS 3.x)

https://github.com/piaopolar/FacebookPlugin/

c) FB SDK整合討論QQ群:Facebook SDK開發 340348340