一.前提摘要
社會化分享每個app必備的推廣需求,無論是拉新,邀請,遊戲獎勵,等等都離不開分享的影子,下面我們介紹下社會化分享的外掛;
首先要說下,現在的社交App,社群App等,國內外的情況都是從以前的百花齊放到現在的幾個巨頭,現在能夠真正存活下來的或者說使用者群體大的,也就微信、QQ、微博、Facebook,所以,我們就簡單的從這幾個平臺的社會化分享整合到app來對比下;
市面上社會化分享的外掛還是比較多的,比如ShareSDK(Mob),U-Share(友盟+),極光等等,不過用的比較多的現在是ShareSDK的了,畢竟友盟主打的是統計,極光主打的是推送,Mob主打的ShareSDK,不過我們還是選取ShareSDK和友盟+對比下;
整合準備:需要做這幾個平臺的分享,或者第三方登入,必須要先去對應的第三方開發者或者開放平臺申請對應的應用得到id或者key等;
QQ:open.qq.com
Facebook:developers.facebook.com
這個論壇中有申請流程可以參考一下:
需要說明的QQ,如果只需要做分享的話可以不通過稽核,則登入需要;
Fb做分享和登入目前都可以不需要稽核;
微信和新浪必須要通過稽核才可以,新浪沒通過稽核前可以測試,但是微信不可以;
好了上面如果準備好了我們繼續往下說;
二.U-Share整合
下載地址:developer.umeng.com/sdk/android
整合文件:
developer.umeng.com/docs/66632/…
需要吐槽下,那個自動整合千萬別浪費時間,我找了好久,最後問了客服,那個是統計的,分享的話目前只支援手動整合哦;
首先看下面的圖片,友盟這裡做的還是不錯的;
如上圖可以看到,在微博和QQ、微信都做了精簡版,我們這裡只需要分享顧只下載精簡版即可,具體差異可以將滑鼠放到問號處自己檢視;
現在下載完如下圖所示:
1、將Common庫是公共庫,share資料夾中的是社會化分享需要的,都要整合到專案中;
2、新增回撥activity,這幾個平臺只需要新增微信的即可
這個類是微信規定的,所以必修要放到包名.wxapi目錄下;
QQ和微博不需要新增activity,但是需要在分享和登入的Activity中新增如下程式碼;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
複製程式碼
注意onActivityResult不可在fragment中實現,如果在fragment中呼叫登入或分享,需要在fragment依賴的Activity中實現
1、整合完資源和jar包之後,配置AndroidManifest.xml許可權及Act
新浪:
<activity
android:name="com.umeng.socialize.media.WBShareCallBackActivity"
android:configChanges="keyboardHidden|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="false"
>
</activity>
<activity android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity"
android:configChanges="keyboardHidden|orientation"
android:exported="false"
android:windowSoftInputMode="adjustResize"
>
</activity>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:launchMode="singleTask"
android:name="com.sina.weibo.sdk.share.WbShareTransActivity">
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
複製程式碼
微信:
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
複製程式碼
QQ:
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent100424468" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"/>
複製程式碼
許可權:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
複製程式碼
如果需要使用QQ純圖分享或避免其它平臺純圖分享的時候圖片不被壓縮,可以增加以下許可權:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
複製程式碼
Android6.0許可權適配
請檢視你的build.gradle檔案,如果 targetSdkVersion小於或等於22,可以忽略這一步,如果大於或等於23,需要做許可權的動態申請:
if(Build.VERSION.SDK_INT>=23){
String[] mPermissionList = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CALL_PHONE,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.GET_ACCOUNTS,Manifest.permission.WRITE_APN_SETTINGS};
ActivityCompat.requestPermissions(this,mPermissionList,123);
}
複製程式碼
其中123是requestcode,可以根據這個code判斷,使用者是否同意了授權。如果沒有同意,可以根據回撥進行相應處理:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
}
複製程式碼
好了到這裡就整合完了,雖然是複製複製的,但是還是有點小麻煩,整合時間大概十分鐘左右;
1、程式碼呼叫
初始化程式碼,Facebook有些特殊,不是在程式碼中配置,如下圖所示,文件還亂了,不吐槽了,理解萬歲;
new ShareAction(MainActivity.this)
.setPlatform(SHARE_MEDIA.QQ)//傳入平臺
.withText("hello")//分享內容
.setCallback(shareListener)//回撥監聽器
.share();
複製程式碼
如上程式碼所示,其他的平臺大同小異,只要換了傳入的平臺物件即可;
1、至此,分享程式碼已經完成了,U-Share,只能手動整合,沒有當下最熱的gradle自動載入的方式,不過相信未來肯定會加入的;其次就是配置有些繁瑣了,想調通還是需要耗費一定的時間的;
下面我們來看下jar包的大小
umeng-common-1.5.4.jar(公共jar) |
352k(比ShaerSDK小) |
umeng-share-core-6.9.3.jar(Ushare所需) umeng-sharetool-6.9.3.jar(Ushare所需) |
282k(比ShareSDK大) |
umeng-share-facebook-6.9.3.jar |
510k(比ShareSDK大) |
umeng-share-QQ-simplify-6.9.3.jar |
78k(比ShareSDK大) |
umeng-share-sina-simplify-6.9.3.jar |
81k(比ShareSDK大) |
umeng-share-wechat-simplify-6.9.3.jar |
31k(比ShaerSDK小) |
總大小: |
1634k(比ShareSDK大) |
二.ShareSDK整合
整合文件:wiki.mob.com/sdk-share-a…
ShareSDK採用的是gradle整合的方式,終於不用手動整合了,也不需要下載資源和jar包了,哈哈哈,讓我先笑一會,好了我們繼續;
1、按照文件在根目錄下的build.gradle中配置mobsdk的載入,從jekins上載入,配置是非常簡單的;
classpath "com.mob.sdk:MobSDK:2018.0319.1724"
之後在想要呼叫分享的模組中配置如下內容:
apply plugin: 'com.mob.sdk'
MobSDK {
appKey "d580ad56b4b5"
appSecret "7fcae59a62342e7e2759e9e397c82bdd"
ShareSDK {
//平臺配置資訊
devInfo {
SinaWeibo {
appKey "568898243"
appSecret "38a4f8204cc784f81f9f0daaf31e02e3"
callbackUri "http://www.sharesdk.cn"
shareByAppClient false
}
Wechat {
appId "wx4868b35061f87885"
appSecret "64020361b8ec4c99936c0e3999a9f249"
}
WechatMoments{
appId "wx4868b35061f87885"
appSecret "64020361b8ec4c99936c0e3999a9f249"
bypassApproval true
}
QQ {
appId "100371282"
appKey "aed9b0303e3ed1e27bae87c33761161d"
shareByAppClient true
}
QZone {
appId "100371282"
appKey "aed9b0303e3ed1e27bae87c33761161d"
bypassApproval true
}
Facebook {
appKey "1412473428822331"
appSecret "a42f4f3f867dc947b9ed6020c2e93558"
callbackUri "https://mob.com"
}
}
}
}
複製程式碼
如上所示,ShareSDK將微信的幾個平臺,還有QQ和QZone都分開處理了,這樣需要更多的配置了,但是也就更靈活了,不需要的資源完全可以不需要加進來了,各有各的好處;
其次,上面的欄位的說明,可以看ShareSDK的整合文件即可,裡面都有說明;將自己的key申請好後,替換上面預設的即可,然後重新編譯一下,就整合完成了,是的你沒有聽錯,整合完了,不需要加任何jar包,不需要加任何act的配置,gradle的好處大大的體現出來了;
時間成本大大的減少了,並且在回撥的配置方面減少了自己的配置上的操作失誤,降低了錯誤的可能性,而且還不需要初始化哦,親測可靠,下面我們開始呼叫程式碼分享吧;
1、呼叫程式碼
Platform.ShareParams sp = new Platform.ShareParams();
sp.setTitle("測試分享的標題");
sp.setTitleUrl("http://sharesdk.cn"); // 標題的超連結
sp.setText("測試分享的文字");
sp.setImageUrl("http://www.someserver.com/測試圖片網路地址.jpg");
sp.setSite("釋出分享的網站名稱");
sp.setSiteUrl("釋出分享網站的地址");
Platform qzone = ShareSDK.getPlatform (QZone.NAME);
// 設定分享事件回撥(注:回撥放在不能保證在主執行緒呼叫,不可以在裡面直接處理UI操作)
qzone.setPlatformActionListener (new PlatformActionListener() {
public void onError(Platform arg0, int arg1, Throwable arg2) {
//失敗的回撥,arg:平臺物件,arg1:表示當前的動作,arg2:異常資訊
}
public void onComplete(Platform arg0, int arg1, HashMap arg2) {
//分享成功的回撥
}
public void onCancel(Platform arg0, int arg1) {
//取消分享的回撥
}
});
// 執行圖文分享
qzone.share(sp);
複製程式碼
如上所示,程式碼呼叫完成,不同的平臺更換不同的第三方物件即可,可以在快速整合文件中檢視,然後就是分享型別,也可以在文件中檢視《各平臺分享內容說明》
1、至此,我們整合和呼叫程式碼就已經完成了,是不是Gradle的方式很簡單呢,下面我們來對比下ShareSDK的前後包體增加大小:
785K
MobTools-2018.0911.1425.jar MobCommons-2018.0918.1444.jar(公共jar) |
464k(比Ushare大) |
ShareSDK-Core-3.3.0.jar |
120k(比Ushare小) |
ShareSDK-QQ-3.3.0.jar ShareSDK-QZone-3.3.0.jar |
74k(比Ushare小) |
ShareSDK-SinaWeibo-3.3.0.jar |
70k(比Ushare小) |
ShareSDK-Wechat-3.3.0.jar ShareSDK-Wechat-Core-3.3.0.jar ShareSDK-Wechat-Moments-3.3.0.jar |
57k(比Ushare大) |
ShareSDK-Facebook-3.3.0.jar |
36k(比Ushare小) |
總大小: |
821k |
二.最終對比
對比項 |
Ushare |
ShareSDK |
整合時間 |
10min |
2min |
整合jar包的大小 |
1634k(fb的jar太大) |
821k |
整合方式 |
手動jar包整合 |
Gradle整合 |
配置項 |
配置的比較多(畢竟不是gradle整合) |
配置項比較少,節省時間 |
客服(滿分10分) |
6分(無技術客服,並且回覆比較慢) |
9分(有技術客服,回覆較快) |
更新週期 |
平均三個月更新一次 |
平均一個多月更新一次 |
需要說明的是大小問題,雖然jar包對比差了一倍,但是U-share的fb的jar比較大,如果不整合fb的情況下,兩者相差不多;