Unity接入Facebook SDK--android篇

配置流程

1,開發者後臺創建應用

https://developers.facebook.com/apps/

2,下載Unity版本SDK,導入Unity

https://developers.facebook.com/docs/unity/
下載的Unity package包包含sdk和demo工程。根據demo工程可以很容易進行代碼移植。

3,Facebook SDK for Unity Reference

Facebook SDK for Unity Reference

4,配置

Facebook–>Edit Settings打開配置界面
在這裏插入圖片描述

基本設置

AppName可以隨便寫
Facebook App Id爲後臺的應用編號
ClientToken爲 設置–>高級 頁面中的 客戶端口令

FB.Init()

使用默認即可

Android Build Facebook Setting

這部分有很多需要注意的。如下:
1, 這裏要求jdk要使用jdk8。且要配置jdk環境變量。
下圖爲筆者機器jdk設置
在這裏插入圖片描述
一開始紅框處是勾選的,即使用unity安裝包裏面的jdk。報錯Keytool not found.Make sure that Java is installed,and that Java tools are in your path
在這裏插入圖片描述
即要求配置jdk環境變量。
筆者先下載了jdk13,配置好後,Preferences瀏覽選擇jdk目錄的時候直接報錯提示只支持jdk8。
於是只能換jdk8安裝。

2,配置OpenSSL
未配置前,報錯OpenSSL not found,Make sure that OpenSSL is installed,and that it is in your path。且無法生成Debug Android Key Hash的值
在這裏插入圖片描述
這裏補充一下OpenSSL配置流程
2.1,下載
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/openssl-for-windows/openssl-0.9.8e_X64.zip
2.2 配置
上述下載的爲非安裝包,解壓後,我直接丟到C盤根目錄了。

2.2.1 系統環境變量Path中新建 C:\openssl-0.9.8e_X64\bin

2.2.2 新建系統環境變量OPENSSL_CONF,值爲openssl.cnf的路徑,筆者的是C:\openssl-0.9.8e_X64\openssl.cnf
在這裏插入圖片描述
上述無論是配置jdk還是OpenSSL,配置好後,重啓Unity,便解決之前的報錯提示。同時Debug Android Key Hash也會自動生成。需要複製該值,配置到FB開發者後臺。
(補充:Android Key Hash的生成,詳見該文。上面配置好OpenSSL,自動生成的Debug Android Key Hash其實是默認的keystore文件生成的散列值,當我們用自己的keystore文件出包後,進行FB登錄後日志會報錯,且會把正確的散列值打印出來,這個時候只需要把這個散列值再配置到開發者後臺,就可以正確登錄了。當然使用鏈接中提供的keytool命令也是可以獲得正確的散列值的)

都設置好了。點擊一下Regenerate Android Manifest
筆者最終生成的Android Manifest文件如下(涉及到包名和id的地方打了黑馬):
在這裏插入圖片描述

5,打包後閃退

筆者把demo工程打包apk後,閃退,報錯如下

02-26 16:01:37.248 15866-15866/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.wildcasino.slotsgame.free.casinoslots, PID: 15866
    java.lang.RuntimeException: Unable to get provider com.facebook.FacebookContentProvider: java.lang.ClassNotFoundException: Didn't find class "com.facebook.FacebookContentProvider" on path: DexPathList[[zip file "/data/app/com.wildcasino.slotsgame.free.casinoslots-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.wildcasino.slotsgame.free.casinoslots-1, /vendor/lib, /system/lib]]
        at android.app.ActivityThread.installProvider(ActivityThread.java:4909)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:4501)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4436)
        at android.app.ActivityThread.access$1500(ActivityThread.java:147)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5135)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:614)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.facebook.FacebookContentProvider" on path: DexPathList[[zip file "/data/app/com.wildcasino.slotsgame.free.casinoslots-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.wildcasino.slotsgame.free.casinoslots-1, /vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
        at android.app.ActivityThread.installProvider(ActivityThread.java:4894)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:4501) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4436) 
        at android.app.ActivityThread.access$1500(ActivityThread.java:147) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:136) 
        at android.app.ActivityThread.main(ActivityThread.java:5135) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:614) 
        at dalvik.system.NativeStart.main(Native Method) 

上述報錯信息找到關鍵字Unable to get provider com.facebook.FacebookContentProvider: java.lang.ClassNotFoundException: Didn't find class "com.facebook.FacebookContentProvider" on path: DexPathLis

搜索了一下,找到兩處提供的解決方案:
方案1,Android app crash on launch due to ClassNotFoundException for “com.facebook.FacebookContentProvider”
該方案主要是adding -keep class com.facebook.internal.* {;} and -keep class com.facebook. {*;} in your proguard file
沒搞懂proguard file是啥。作罷

方案2,Unity Facebook plugin FacebookContentProvider not found runtime exception.
該方案主要是try to make “clear” resolve of packages:

step1:"/Assets/Play Service Resolver/Android Resolver/Delete Resolved Libraries"

step2:"/Assets/Play Service Resolver/Android Resolver/Resolve"
即,先把庫清掉,再重新引入。

筆者使用第2種方案,順利解決 這個報錯。

基本功能接入

1,登錄

登錄成功後RawResult會返回user_id和access_token。
用戶要獲得更多信息,需要二次請求(客戶端或者服務端取)。
默認情況下可以獲得first_name,last_name,gender,email信息
更多的信息,比如location,需要商務權限,需要運營聯繫facebook客服開通

2,打點,埋點,事件

文檔
注意:埋點不要求用戶登錄FB,但是需要完成SDK初始化,函數:

public static void LogAppEvent(
    string logEventName,
    float valueToSum,
    Dictionary<string, object> parameters = null
)

3,分享

分享不要求用戶登錄FB,但是需要完成SDK的初始化
官方文檔
函數:

public static void ShareLink(
        Uri contentURL = null,
        FacebookDelegate<IShareResult> callback = null)

)

荔枝:

FB.ShareLink(
    new Uri("https://developers.facebook.com/"),
    callback: ShareCallback
);

默認情況下分享只支持url分享。如若有需求定製Title、Content、Photo的需求,需要自己創建一個web站點,保證web目錄下的index文件能夠被正確的訪問到,設置index文件的meta信息。具體說明可以參考這裏:A Guide to Sharing for Webmasters

Facebook爬蟲會根據meta信息組合成正確的分享界面。Facebook提供有分享調試器的預覽工具,用戶輸入url即可獲得預覽效果。

開發者配置index文件,在其header中添加如下meta信息:

<meta property="og:locale" content="en_US" />
<meta property="og:type" content="website" />
<meta property="og:title" content={YOUR TITLE} />
<meta property="og:description" content={YOUR DESCRIPTION} />
<meta property="og:url" content={YOUR URL} />
<meta property="og:image" content={YOUR IMAGE URL} />

比如og:image就是分享顯示的圖片,我們可以把圖片放到第三方網站或者圖牀上,把地址填在這個meta中。這樣最終FB分享中就會有這個圖片的顯示了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章