在Android中使App高速、簡單地支持新浪微博、微信、QQ、facebook等十幾個主流社交平臺的分享功能
前言
在如今的APP或者遊戲中,分享功能差點兒已經成為標配。分享功能不但能夠滿足用戶的需求。也能夠為產品帶來很多其它的用戶,甚至能夠對用戶的行為、活躍度、年齡段等情況進行數據統計,使得軟件公司能夠對產品進行更精準的定位。今天我們就來簡單剖析市場上一款優秀的分享SDK以及其集成過程。這款分享SDK就是友盟的社會化分享組件。
友盟社會化分享,幫助移動應用高速具備分享、登錄、評論、喜歡等社交功能,提升用戶粘度、助力產品推廣,並提供實時、全面的社會化數據統計分析服務。
很多其它請訪問友盟社會化組件官網。
基本概念
依據友盟的集成文檔。我們對於友盟社會化分享SDK的操作主要是通過UMSocialService接口來進行操作,一些相關的配置則須要通過SocialzieConfig類來進行配置。這個配置類通過UMSocialService的getConfig()函數來獲得。在友盟社會化分享SDK中一個社交平臺通過SHARE_MEDIA枚舉來標識。比方新浪微博就是SHARE_MEDIA.SINA。微信就是SHARE_MEDIA.WEIXIN。通過這個平臺枚舉我們就知道了用戶是要將內容分享到哪個社交平臺,至於為什麽是用枚舉。我想可能是由於老代碼的遺留問題吧。而為了增強平臺的可擴展性,友盟又添加了一個UMSsoHandler
因此。我們得到例如以下幾張結構圖:
圖1
從圖1中能夠看出,SDK的核心控制類中含有一個配置類,該配置類管理SDK中的各個社交平臺,因此假設我們要支持分享到某個平臺。必須將該平臺加入到SDK的配置類中。假設不須要某個平臺。就將該平臺從SDK配置類中刪除就可以。
圖2 圖3
圖2和圖3各自是授權和分享的基本流程。
對於授權來說,假設該平臺僅僅有webview授權,那麽就是用webview進行授權。假設該平臺既支持webview授權又支持SSO授權 ( 即通過client來授權 ),在用戶沒有配置SSO授權的情況下是用webview授權,否則是用SSO授權。假設該平臺僅僅是SSO授權。那麽在client的版本號支持的情況就會是用SSO授權。而SSO授權都是通過UMSsoHandler這個類來進行操作的。再看圖3。分享也是兩個分支。即通過API進行分享和通過社交平臺client分享,比如豆瓣僅僅支持API分享,而微信僅僅支持通過client進行分享。通過client進行分享也是通過UMSsoHandler這個類。
總結一下:
SDK中含有配置類。配置類管理各個社交平臺。
當用戶要把內容分享到某個社交平臺時,SDK內部進行處理。假設是通過API分享,那麽直接底層分享。
假設是通過client分享,那麽通過平臺找到相應的UMSsoHandler對象,然後再通過UMSsoHandler的相應方法跳轉到社交平臺或者IM軟件的client進行分享。授權也是相同的原理。
集成過程
以下。我們就以新浪微博為例來解說一下集成過程。
首先到新浪微博開放平臺中創建一個新的應用。新浪微博開放平臺。
圖 4
然後填寫應用的相關信息後會進入到APP具體信息的配置頁面。
例如以下圖所看到的:
圖
在這裏主要配置的是應用的包名和簽名。應用的包名在AndroidManifest.xml中查看,package屬性的值就是。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.sharedemo" android:versionCode="1" android:versionName="1.0" >應用簽名即是應用的keystore的MD5值,但也不一定,比方facebook的簽名就是keystore的SHA1加上分號,然後再加上應用包名。這裏我們僅僅解說新浪微博的設置,我們能夠通過eclipse查看應用的簽名。例如以下圖 :
圖6
下圖中的MD5 fingerprint的值就是我們的APP簽名,這個值不是直接填寫到新浪開發平臺官網的,而是須要將冒號去掉,而且將字母轉換為小寫。如上圖5所看到的。然後填寫完其它的信息,提交審核就可以。此時,我們就有了新浪微博的app id和app key了。
通過審核我們能夠到友盟官網創建應用而且綁定新浪微博的app id和app key了。如圖7.
圖 7
此時,我們就能夠在project中集成友盟社會化分享組件SDK了。
首先,下載SDK而且解壓縮SDK。SDK文件夾例如以下。
圖8
當中main文件夾下的為核心sdk的jar和資源。將jar包復制到libs文件夾下。而且加入到編譯路徑中,然後將res文件夾下的資源復制到你project中相應的文件夾下就可以。
platforms文件夾下即為各個社交平臺的jar包和資源。SDK默認加入了新浪微博、豆瓣、人人網、騰訊微博這幾個平臺,其它平臺須要手動加入jar包、資源 ( 存放在platforms中相應的文件夾中 ),然後手寫代碼加入到SDK中。
圖9
先看上圖9 的左邊,確保你所須要的jar包和資源都拷貝進了相應的文件夾,然後看右邊的代碼。首先聲明一個UMSocialService的對象,這個對象就是整個SDK的控制器,通過這個控制器我們能夠進行授權、分享等操作。我們通過相應的方法設置分享內容,然後設置各個平臺在分享面板上的顯示順序( 不是必須 ), 最後我們在一個button的點擊事件中調用了UMSocialService的openShare(context, listener)方法。這種方法就是打開分享面板。
用戶點擊這個面板上的平臺時就會將分享內容分享到這個平臺( 假設沒有授權則須要先授權一次 )。
最後。不要忘了將你獲取到的友盟appkey等信息配置AndroidManifest.xml。配置AndroidManifest.xml參考友盟文檔。友盟社會化組件文檔。
執行程序後。會得到例如以下的效果圖。點擊某個平臺就能夠進行授權。然後分享。
效果圖
圖10 圖11
加入其它社交平臺
在最新版的SDK中默認僅僅加入了新浪微博、騰訊微博、豆瓣、人人網這四個平臺,可是友盟社會化組件還支持微信、微信朋友圈、QQ、QQ空間、facebook、instagram、pinterest、來往、易信等十幾個平臺,其它的平臺請參考友盟社會化組件官網。假設我們要使用除了默認四個平臺的其它平臺,那麽須要我們手動加入到SDK中。以下我們就來演示假設將微信和微信朋友圈加入到SDK中。
首先將SDK解壓縮包中Platforms/weixin文件夾下的Libs文件夾和res文件夾下的相關文件復制到project文件夾下相應的文件夾中。然後通過代碼把相關平臺加入到SDK中,代碼例如以下 :// 微信平臺 UMWXHandler wxHandler = new UMWXHandler(getActivity(), "你的微信app id", "你的微信 app secret") ; wxHandler.addToSocialSDK(); // 微信朋友圈平臺, 與微信共用一個app id, app secret UMWXHandler circleHandler = new UMWXHandler(getActivity(), "你的微信app id", "你的微信 app secret") ; circleHandler.setToCircle(true); circleHandler.addToSocialSDK();
上面的微信app id和app secret都須要到微信開放平臺申請。這一步最為麻煩,這裏須要創建你的應用。然後填寫應用的包名和MD5簽名(針對於Android平臺),註意,這裏的包名和簽名一定不能錯,而且測試的時候要檢查你安裝後的apk的簽名和你填寫時候的簽名是否一致,有的情況下我們使用eclipse自帶的keystore來測試,打包的時候又成了別的keystore。這樣就導致了簽名不一致的情況,因此一定要註意簽名的正確性問題。假設簽名和包名有錯誤,那麽你在使用app id和app secret來進行分享時則無法調出微信或者微信朋友圈的分享界面。出現這樣的情況你就須要復查你的apk的簽名和包名是否與微信開放平臺上填寫的一致了。
假設信息填寫無誤。那麽提交審核就可以。
審核成功後就可以進行分享。
圖12 然後把壓縮包中的Platforms/Android/weixin文件夾下的wxapi放到你的根包的文件夾下,比如我的project的包名為com.example.sharedemo,那麽wxapi的路徑就是com.example.sharedemo.wxapi。這一點不能錯,否則微信分享可能無法成功。如圖:圖13 然後在AndroidManafest.xml中註冊微信的這個WXEntryActivity,例如以下 :
<activity android:name=".wxapi.WXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" />這樣,集成就完畢了。
可是想要成功分享還得微信開放平臺的審核通過,這須要一些時間,因此為了節省時間,填寫包名和簽名時盡量保證沒有問題。
審核通過後,就可以分享成功。
圖14 這樣微信和微信朋友圈就集成成功了。
其它的平臺集成也是這麽一個步驟。1、到相應的開放平臺創建應用;2、假設須要填寫簽名和包名。那麽填寫這些信息;3、拿到應用的app id, app secret( 有的是 app key )等信息,填寫到友盟相應的Handler中。比如UMWXHandler。4、調用handler的addToSocialSDK()方法將平臺加入到SDK中。5、在AndroidManifest.xml中註冊Activity等,使得分享時能夠跳轉到目標activity中。
自己定義平臺
假設友盟社會化分享組件中沒有你想要的平臺,那麽你能夠把自己的平臺加入到友盟的SDK中。整個過程也非常easy。示比例如以下 :
// 構造平臺,參數1為平臺名字,參數2為平臺圖標 CustomPlatform myCustomPlatform = new CustomPlatform("我的平臺", R.drawable.ic_launcher); // 平臺點擊事件處理 myCustomPlatform.mClickListener = new OnSnsPlatformClickListener() { @Override public void onClick(Context arg0, SocializeEntity arg1, SnsPostListener arg2) { // 在這裏處理平臺的點擊事件,一般為調用目標設計平臺的分享或者授權方法. } }; // 將平臺加入到SDK中 mController.getConfig().addCustomPlatform(myCustomPlatform);這樣就加入成功了。註意,此時假設你須要設置各個平臺在分享面板中的順序,那麽你就不要使用
mController.getConfig().setPlatforms(SHARE_MEDIA.SINA, SHARE_MEDIA.TENCENT, SHARE_MEDIA.DOUBAN, SHARE_MEDIA.RENREN)這樣的方式來進行排序了,由於你有了自己定義平臺。通過上面的設置方法的話自己定義平臺則無法顯示在分享面板上。此時,應該使用例如以下方法。
mController.getConfig().setPlatforms(SHARE_MEDIA.SINA.toString(), SHARE_MEDIA.TENCENT.toString(),, SHARE_MEDIA.DOUBAN.toString(),"我的平臺" ) ;效果例如以下 :
圖15
總結
看似整個過程比較的復雜,事實上這也都是各個設計平臺為了用戶信息的安全所設置的一些安全機制導致的。比如應用的包名和簽名、審核機制等。這些機制導致了集成的失敗率大大添加。而各個平臺的申請、接口不一致也導致了SDK設計上存在一些不合理的問題。總的來說。友盟社會化組件還是不錯的。包括了眼下的主流平臺。即使沒有包括你所須要的平臺也能夠通過自己定義平臺來實現,這樣就保證了擴展性。
集成時僅僅要遵循例如以下順序則失敗率會大大減小:1、到各個平臺的開發平臺申請應用,獲得app id, app key等信息,假設要填寫包名和簽名時千萬要保證正確性,否則會消耗非常多時間在上面;2、得到app id, app key等信息到友盟官網看看該平臺是否須要綁定這些信息。一般來說通過client分享的平臺都不須要綁定,比如微信;而通過api進行分享的基本上都須要綁定,比如人人網、新浪等;3、將平臺加入到sdk中(通過各種友盟的Handler);4、在AndroidManifest.xml中註冊權限或者activity。
圖16
在Android中使App高速、簡單地支持新浪微博、微信、QQ、facebook等十幾個主流社交平臺的分享功能