友盟微社群2.1版本的接入
阿新 • • 發佈:2019-02-14
應老大的要求,我開始正式接入友盟的微社群,從微社群的內測版1.2版本到現在的上線版2.1版本,我都幾乎全程參與了,在這其中也遇到了很多問題,比如自己的賬號系統和微社群中的第三方登入的賬戶系統整合、微信登陸爆機、賬號登出不成功等等……現在使用2.1版本的微社群SDK已經可以基本實現社群的功能了。下面我來分享下自己是如何接入的:
1、微信登陸爆機或者不成功
在這裡需要注意下,可能你的微信登陸不成功或者爆機,很可能原因就是Mainfest檔案中的:
這裡注意這段程式碼不能修改,即使修改的和這樣的一樣也不行(至於原因我也不是很清楚)。。。<!-- 微信登入 --> <activity android:name=".wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
如圖所示,微信的回撥類要對應在包名.wxapi 類中。
當然,微信登陸成功的前提是你獲得了微信登陸許可權……這裡就不多說了
記得在使用時將你的微信appKey和values填入:
protected void useSocialLogin() { String wxappId = "xxxxxxxxxxxxxxxxx"; String wxappSecret = "xxxxxxxxxxxxxxxxxxxxxxxx"; new UMWXHandler(getApplicationContext(), wxappId, wxappSecret).addToSocialSDK(); }
下面,我們來看看接入微社群的程式碼吧:
2、使用自己的賬號系統來接入微社群,實現登陸時跳轉到自己的登陸頁面
LoginSDKManager.getInstance().addAndUse(new CustomLoginImpl());
CustomLoginImpl是自定義實現登入系統,實現Loginable中的三個方法。
SDK內部在登入時會呼叫login函式,如果你的登入介面是Activity, 那麼需要自己將LoginListener傳遞給你的登入Activity並且最後將結果回撥給微社群SDK,登入成功那麼返回碼為200,否則視為登入失敗。
另外需要注意的是是否登入的標識應該儲存到本地,而不應該儲存在記憶體中。如果儲存在記憶體中,那麼下次重新進入應用是 isLogin被置為false,造成重複登入。
public class CustomLoginImpl implements Loginable {
// !不要使用成員變數儲存是否登入的狀態,應該儲存在本地
private boolean isLogin = false;
@Override
public void login(Context context, final LoginListener listener) {
// 跳轉到你的Activity
if (!MC.pref.getBooleanShareData("isLogin", false))
{
// 包裝一下Listener
CustonLoginActivitysLoginListener = new LoginListener() {
@Override
public void onStart() {
listener.onStart();
}
@Override
public void onComplete(int stCode, CommUser userInfo) {
if (stCode == 200) {
isLogin = true;
}
setUmengPush(userInfo);
listener.onComplete(stCode, userInfo);
}
};
Intent intent = new Intent(context,CustonLoginActivity.class);
intent.putExtra("isOpenLoginView", true);
context.startActivity(intent);
} else
{
String userInfo = MC.pref.getStringShareData("user", true);
JSONObject testData = null;
try
{
testData = new JSONObject(userInfo);
} catch (JSONException e)
{
e.printStackTrace();
}
UserNode userNode = new UserNode(testData);
// 注意使用者id、暱稱、source是必填項
CommUser user = new CommUser(Logic.UID);
user.id = Logic.UID;
// 登入的來源.可使用值參考文件中SOURCE的取值說明
user.source = Source.SELF_ACCOUNT;
user.name = userNode.getNickName();
user.customField = userNode.getEmail();
RL.d("--->", "資訊--id==" + user.id + "--source==" + user.source + "--name==" + user.name);
// 如果沒有頭像地址,可不傳遞
user.iconUrl = ServerCfg.IMAGE_PREFIX + userNode.getUserIcon();
isLogin = true;
setUmengPush(user);
listener.onComplete(200, user);
}
}
@Override
public void logout(Context context, LoginListener listener) {
Log.d("", "### 登出登入 ");
MC.pref.storeBooleanShareData("isLogin", false);
MC.pref.storeShareData("user", new UserNode().toJSONObject().toString().getBytes());
//置空微社群的賬號
cleanUmCommUser();
isLogin = false;
listener.onComplete(200, null);
}
@Override
public boolean isLogined(Context context) {
Log.d("", "### 這裡需要將是否已經登入的狀態存到本地,避免下次重新進入應用是 isLogin被置為false");
if (MC.pref.getBooleanShareData("isLogin", false))
isLogin = true;
else isLogin = false;
return isLogin;
}
/**
* 設定微社群的推送功能功能
*
* @param user
*/
private void setUmengPush(CommUser user)
{
UmengPushImpl umengPushImpl = new UmengPushImpl();
umengPushImpl.enable(MC.application);
umengPushImpl.setUserAlias(user);
PushSDKManager.getInstance().addAndUse(umengPushImpl);
}
/**
* 清空友盟微社群的使用者資訊
*/
private void cleanUmCommUser()
{
// 清空SDK內部儲存的使用者資訊
CommonUtils.logout();
// 置空使用者資訊
CommConfig.getConfig().loginedUser = new CommUser();
}
}
CustonLoginActivity就是你的登陸頁面對應的Activity,在登陸成功銷燬這個Activity時,把使用者資訊回撥給社群SDK:
/**
* 模擬使用者登入操作,自定義過程中使用者可以構造使用者名稱、密碼輸入介面
*/
private void mockLoginData() {
Log.d("", "### 使用自己的賬戶系統登入,然後將標識使用者唯一性的id和source傳遞給社群SDK ");
Random random = new Random();
CommUser loginedUser = new CommUser();
String userId = "id" + random.nextInt(Integer.MAX_VALUE);
loginedUser.id = userId; // 使用者id
loginedUser.name = "name" + random.nextInt(Integer.MAX_VALUE); // 使用者名稱
loginedUser.source = Source.SELF_ACCOUNT;// 登入系統來源
loginedUser.gender = Gender.FEMALE;// 使用者性別
loginedUser.level = random.nextInt(100); // 使用者等級
loginedUser.score = random.nextInt(100);// 積分
if (sLoginListener != null) {
// 登入完成回撥給社群SDK,200代表登入成功
sLoginListener.onComplete(200, loginedUser);
}
}
這樣就可以使用自己的登陸頁面來登陸進入微社群啦,快來試試吧~
3、使用微社群登陸賬號登出不了(切換為別的賬號後,仍然是第一次登陸的賬號)
這裡需要在退出登陸的時候,置空微社群中的賬號,程式碼如下:
// 清空SDK內部儲存的使用者資訊
CommonUtils.logout();
// 置空使用者資訊
CommConfig.getConfig().loginedUser = new CommUser();