أحدث إصدار (1.2.0) أسهل وأخف وزنًا وأكثر توجهاً نحو الأعمال
مع هدف التصميم المتمثل في أن يكون أبسط وأخف وزنًا وأكثر توجهاً نحو احتياجات العمل، فإنه يوفر دعم وظيفة تسجيل الدخول والمشاركة لـ Weibo و WeChat و QQ و Tim وإصدار QQ chat و DingTalk ؛
عنوان المشروع: GitHub - SocialSdkLibrary
عنوان المدونة: الوصول السريع إلى تسجيل الدخول والمشاركة الأصليين لـ WeChat وWeibo وQQ وDingTalk
يمكن ترقية إصدار WeChatQQWeibo SDK عند ترقية الإصدار التالي، سيخضع Weibo لتغييرات كبيرة؛
362 في 2020.1.21؟، تم إصدار الإصدار 1.2.0
، وتحديث البرنامج الإضافي، ويدعم أحدث إصدار من Gradle
، ويستخدم Gradle + APT + ASM
لاكتشاف فئات Platform
تلقائيًا، ويسجل رمز التهيئة تلقائيًا، وهو مدمج. تحليل json
وطلبات http
، تكوين التهيئة أبسط؛
2019.6.13 دعم تسجيل الدخول لرمز مسح WeChat
في 28 مايو 2019، حصل المشروع على الرقم 329؟، وأدار دورة الحياة تلقائيًا، ومعلمات رد الاتصال الموحدة، وأصدر الإصدار المستقر 1.0.1 ❤️،
2019.3.28 استخدم gradle plugin
لإدارة التبعيات تلقائيًا، وإعادة تصميم رقم الإصدار، الإصدار الثابت 0.1.1 ❤️
2018.12.27 مكتمل مكون gradle
، نظام أساسي مقسم، تبعيات آلية، مستوى جديد؟
?2018.12.21 بالفعل 225؟، البدء في الاستعداد للتقسيم إلى مكتبات منصة مختلفة لتسهيل الوصول المرن⛽️
في 26 سبتمبر 2018 حصل المشروع على النجمة 202 شكرا للزملاء الجدد على إضافة نجمتين؟
في 7 يونيو 2018 حصل المشروع على الحجر رقم 100؟، وآخرها هو الذي طلبته من زملائي؟
?2018.5.12 مشكلة الذاكرة الثابتة وتمديد الوظيفة إلى الإصدار المستقر 1.1.0 ❤️
2018.2.12 دعم مشاركة DingTalk؟
2017.12.12 إعادة هيكلة بسيطة للكود واختبار الإصدار الثابت 1.0.0 ❤️
مفتوح المصدر: لا يوجد بيض عيد الفصح، ولا بيض عيد الفصح، ولا بيض عيد الفصح؛
بسيط: ما عليك سوى الانتباه إلى تسجيل الدخول وفئة إدارة المشاركة وكائن بنية البيانات، وليست هناك حاجة إلى الاهتمام بالاختلافات بين الأنظمة الأساسية؛
خفيف الوزن: يحتوي فقط على SDK
التابعة لجهات خارجية وإطار عمل بسيط غير متزامن (38 كيلو بايت) ويتم إدخال طلبات الشبكة وتحليل JSON
من الخارج، مما يقلل من التبعيات الزائدة ويضمن درجة عالية من الوحدة مع المشروع المضيف؛
شامل: مشاركة البرامج المصغرة، ونسخ الروابط، ومسح رموز QR لتسجيل الدخول، وتعزيز النقل متعدد الوسائط، وما إلى ذلك؛
التصميم على أساس المتطلبات:
code
محليًا، ويحصل الخادم على token
؟wxOnlyAuthCode
؛web
من أجل التوافق.Intent
لتنشيط المشاركة، مثل دعم مشاركة الفيديو المحلي، ومشاركة النص العادي qq
، وما إلى ذلك؛token
باستمرار لتجنب التفويضات المتعددة، يمكنك اختيار فترة الصلاحية في المرة التالية التي يتم فيها ترخيص الرمز المميز، ويمكن الحصول على البيانات مباشرة، ومع ذلك، إذا قام المستخدم بتغيير حساب WeChat الخاص به، فلن يتمكن من تبديل الحسابات بهذه المدة ينبغي النظر بعناية في الوقت؛SocialSdk
؛ الخطوة 1 : إضافة مسار تبعية البرنامج المساعد
مشروع/build.gradle
buildscript {
repositories {
maven { url "https://dl.bintray.com/zfy/maven" }
}
dependencies {
// 请查看文初最新版本,这边可能忘记更新!!!
classpath 'com.zfy.social:social-sdk-plugin:1.2.0'
}
}
allprojects {
repositories {
maven { url "https://dl.bintray.com/zfy/maven" }
}
}
الخطوة 2 : معلمات التكوين
app/build.gralde
لأسباب أمنية، يوصى بتكوينه في local.properties
لتجنب إرساله إلى الطرف البعيد؛
// 在顶部引用插件
apply plugin: 'socialsdk'
// android 配置模块
android {
...
}
// socialsdk 配置模块
socialsdk {
wx {
appId = '111xxx2222'
appSecret = '111xxx2222'
// 微信授权是否只返回 code, 用于服务端授权的场景
onlyAuthCode = false
}
qq {
appId = '111xxx2222'
appSecret = '111xxx2222'
}
wb {
appId = '111xxx2222'
url = '111xxx2222'
}
dd {
appId = '111xxx2222'
}
}
ما ورد أعلاه هو أبسط التكوين. لمزيد من معلمات التكوين، يرجى الرجوع إلى التكوين الافتراضي:
socialsdk {
// 调试模式,默认 false, 可以在代码中开启
debug = true
// 分享:选择停留在微信时自动返回成功,默认返回失败
shareSuccessIfStay = true
// 登录:token 过期时间,单位小时,默认立即过期,有效期内可以不需要再次唤醒第三方 app,但是二次登录也没办法切换账号,这会引发问题,所以默认立即过期
tokenExpiresHours = 100
// 使用 gson 作为数据解析,默认 true,你如果不用 gson 就需要自己编写 JSONAdapter
useGson = true
// 使用 okHttp 发送请求,默认 true,你如果不用 okhttp 就需要自己编写 RequestAdapter
useOkHttp = true
// 配置 app 名称,默认使用 R.string.app_name
appName = "哈哈哈"
// 唤醒过程中的 loading 颜色
color = "#FF0000"
wx { }
qq { }
wb { }
dd { }
}
الخطوة 3 : التهيئة
SocialOptions options = new SocialOptions . Builder ( this )
// 调试模式,开启 log 输出
. debug ( true )
// 加载缩略图失败时,降级使用资源图
. failImgRes ( R . drawable . share_default_img )
// 添加分享拦截器,重新处理分享的数据
. addShareInterceptor (( context , obj ) -> {
obj . setSummary ( "被重新组装" + obj . getSummary ());
return obj ;
})
// 构建
. build ();
// 初始化
SocialSdk . init ( options );
تدعم وظيفة تسجيل الدخول ثلاث منصات، QQ، وWeChat، وWeibo؛
// 3个平台
Target . LOGIN_QQ ; // QQ 登录
Target . LOGIN_WX ; // 微信 登录
Target . LOGIN_WX_SCAN ; // 微信扫码 登录
Target . LOGIN_WB ; // 微博 登录
سيؤدي تسجيل الدخول إلى إرجاع LoginResult
، والذي يتضمن بشكل أساسي ثلاثة أجزاء: نوع تسجيل الدخول ومعلومات المستخدم الأساسية ومعلومات الرمز المميز؛
LoginResult {
// 状态,成功,失败,取消等
public int state ;
// 目标平台
public int target ;
// 发生错误时使用
public SocialError error ;
// 针对登录类型可强转为 WbUser,WxUser,QQUser 来获取更加丰富的信息
public SocialUser socialUser ;
// 本次登陆的 token 信息,openId, unionId,token,expires_in
public AccessToken accessToken ;
// 授权码,如果 onlyAuthCode 为 true, 将会返回它
public String wxAuthCode ;
// 扫码登录二维码文件路径
public String wxCodePath ;
}
تحتاج إلى تعيين رد اتصال لتسجيل الدخول عند تسجيل الدخول:
new OnLoginStateListener () {
@ Override
public void onState ( Activity act , LoginResult result ) {
switch ( result . state ) {
case LoginResult . STATE_START :
// 登录开始
break ;
case LoginResult . STATE_COMPLETE :
// 登录完成
break ;
case LoginResult . STATE_ACTIVE :
// 透明 Activity 开启
break ;
case LoginResult . STATE_SUCCESS :
// 登录成功
break ;
case LoginResult . STATE_FAIL :
// 登录失败
result . error
break ;
case LoginResult . STATE_CANCEL :
// 登录取消
break ;
case LoginResult . STATE_WX_CODE_RECEIVE :
// 获取到微信登录二维码
break ;
case LoginResult . STATE_WX_CODE_SCANNED :
// 微信登录二维码被扫描
break ;
}
}
};
احصل على المزيد من معلومات المستخدم:
SocialUser socialUser = loginResult . socialUser ;
// 基本信息可以从 SocialUser 在获取到
String userNickName = socialUser . getUserNickName ();
// 获取 openId
String openId = socialUser . getOpenId ();
// 微信获取 unionId,其他平台仍旧返回 openId
String unionId = socialUser . getUnionId ();
// 获取 userId,微信返回 unionId, 其他平台返回 openId
String userId = socialUser . getUserId ();
// 强转为平台用户,可以拿到更多信息
int target = result . getTarget ();
switch ( target ) {
case Target . LOGIN_QQ :
QQUser qqUser = ( QQUser ) socialUser ;
break ;
case Target . LOGIN_WB :
WbUser wbUser = ( WbUser ) socialUser ;
break ;
case Target . LOGIN_WX :
WxUser wxUser = ( WxUser ) socialUser ;
break ;
}
بدء تسجيل الدخول:
LoginManager . login ( mActivity , Target . LOGIN_QQ , listener );
قم بتسجيل الدخول باستخدام المعلمات، مثل مسح رمز WeChat QR لتسجيل الدخول:
LoginObj obj = new LoginObj ();
// 根据文档要求,以下数据应在服务端缓存获取
// 如果不设置,将会使用配置时设置的 secret
obj . setAppSecret ( "0a3cb00******ee3654f499171" );
obj . setNonceStr ( "3611cdc33b******a49ca45bdfab2d" );
obj . setTimestamp ( "15604******6904" );
obj . setSignature ( "b28f69426******18c8ba792caa4a0a1bcc" );
// 如果不设置,将会使用 SocialValues.WX_SCOPE
obj . setScope ( SocialValues . WX_SCOPE );
LoginManager . login ( mActivity , Target . LOGIN_WX_SCAN , obj , listener );
فيما يتعلق بتقادم token
، يمكنك ضبط tokenExpiresHours
أثناء التهيئة للتحكم فيه، كما يوفر أيضًا طريقة لمسح token
التفويض.
// 清除全部平台的 token
LoginManager . clearAllToken ( context );
// 清除指定平台的 token
LoginManager . clearToken ( context , Target . LOGIN_QQ );
هام: يرجى مراجعة إمكانيات الدعم بين الأنظمة الأساسية وأنواع البيانات بعناية
عندما يستخدم Weibo openApi
للمشاركة، قد يكون هناك تأخير طويل. يوصى بإضافة عرض شريط التقدم في دورة الحياة لتجنب انتظار المستخدمين لفترة طويلة دون الاستجابة.
بالنسبة لمنطق الأعمال وتصميم SDK
، يتم تقسيم أنواع البيانات المشتركة إلى 7 أنواع، والتي يمكن أن تغطي معظم سيناريوهات الأعمال، وهي:
开启 App 类型,打开渠道应用;
文字类型,纯文本分享;
图片类型(jpg, png, gif(要求能动));
App 推广类型;
网页链接类型;
音频分享类型;
视频分享类型;
من أجل التأكد من أن كل نظام أساسي له مظهر مغلق وموحد، إذا كان النظام الأساسي غير متوافق مع نوع معين من المشاركة، فسيتم استخدام مشاركة web
بدلاً من ذلك، على سبيل المثال، لا يدعم WeChat مشاركة app
، وسيقوم وضع مشاركة web
بذلك يمكن استخدامها بعد المشاركة.
// 支持的分享渠道
Target . SHARE_DD ; // 钉钉好友
Target . SHARE_QQ_FRIENDS ; // qq好友
Target . SHARE_QQ_ZONE ; // qq空间
Target . SHARE_WX_FRIENDS ; // 微信好友
Target . SHARE_WX_ZONE ; // 微信朋友圈
Target . SHARE_WX_FAVORITE ; // 微信收藏
Target . SHARE_WB ; // 新浪微博
Target . SHARE_SMS ; // 短信分享
Target . SHARE_EMAIL ; // 邮件分享
Target . SHARE_CLIPBOARD ; // 粘贴板分享
عند المشاركة، يجب علينا أولاً إنشاء البيانات للمشاركة. يوفر كائن ShareObj
مجموعة متنوعة من الأساليب الثابتة لإنشاء كائنات تتوافق مع نوع المشاركة بسرعة؛
// 测试用的路径
localImagePath = new File ( Environment . getExternalStorageDirectory (), "1.jpg" ). getAbsolutePath ();
localVideoPath = new File ( Environment . getExternalStorageDirectory (), "video.mp4" ). getAbsolutePath ();
localGifPath = new File ( Environment . getExternalStorageDirectory (), "3.gif" ). getAbsolutePath ();
netVideoPath = "http://7xtjec.com1.z0.glb.clouddn.com/export.mp4" ;
netImagePath = "http://7xtjec.com1.z0.glb.clouddn.com/token.png" ;
netMusicPath = "http://7xtjec.com1.z0.glb.clouddn.com/test_music.mp3" ;
netMusicPath = "http://mp3.haoduoge.com/test/2017-05-19/1495207225.mp3" ;
targetUrl = "http://bbs.csdn.net/topics/391545021" ;
// 打开渠道对应app
ShareObj shareMediaObj = ShareObj . buildOpenAppObj ();
// 分享文字
ShareObj textObj = ShareObj . buildTextObj ( "分享文字" , "summary" );
// 分享图片
ShareObj imageObj = ShareObj . buildImageObj ( "分享图片" , "summary" , localImagePath );
// 分享gif
ShareObj imageGifObj = ShareObj . buildImageObj ( "分享图片" , "summary" , localGifPath );
// 分享app
ShareObj appObj = ShareObj . buildAppObj ( "分享app" , "summary" , localImagePath , targetUrl );
// 分享web
ShareObj webObj = ShareObj . buildWebObj ( "分享web" , "summary" , localImagePath , targetUrl );
// 分享视频
ShareObj videoObj = ShareObj . buildVideoObj ( "分享视频" , "summary" , localImagePath , targetUrl , localVideoPath , 10 );
// 本地视频分享、部分平台支持
ShareObj videoLocalObj = ShareObj . buildVideoObj ( "分享本地视频" , "summary" , localImagePath , targetUrl , localVideoPath , 0 );
// 分享音乐
ShareObj musicObj = ShareObj . buildMusicObj ( "分享音乐" , "summary" , localImagePath , targetUrl , netMusicPath , 10 );
استخدم دعم المعلمات الموسع لبعض المعلمات التي لا يمكن توحيدها:
// 使 ShareObj 支持短信分享
webObj . setSmsParams ( "13611301719" , "说啥呢" );
// 使 ShareObj 支持粘贴板分享
webObj . setClipboardParams ( "复制的内容" );
// 使 ShareObj 支持邮件分享
webObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
// 使 ShareObj 在微信平台优先使用小程序分享
webObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
استخدم OnShareStateListener
كرد اتصال لمشاركة الاستماع؛
new OnShareStateListener () {
@ Override
public void onState ( Activity act , ShareResult result ) {
switch ( result . state ) {
case LoginResult . STATE_START :
// 分享开始
break ;
case LoginResult . STATE_COMPLETE :
// 分享完成
break ;
case LoginResult . STATE_ACTIVE :
// 透明 Activity 开启
break ;
case ShareResult . STATE_SUCCESS :
// 分享成功
break ;
case ShareResult . STATE_FAIL :
SocialError e = result . error ;
// 分享失败
break ;
case ShareResult . STATE_CANCEL :
// 分享取消
break ;
}
}
};
// 唤醒分享
ShareManager . share ( mActivity , Target . SHARE_QQ_FRIENDS , imageObj , mOnShareListener );
فيما يتعلق بإعادة كتابة كائن المشاركة، فإنه يوفر في الواقع فرصة لمعالجة ShareObj
التي يجب مشاركتها قبل المشاركة بشكل موحد، وهو ما يشبه أحد جوانب وظيفة المشاركة، مثل السيناريو التالي:
app
إلى الصورة قبل مشاركتها؛url
المشترك معلمات عامة مثل shareId
وما إلى ذلك، ويتم إجراء إحصائيات الوصول في H5
؛ لإعادة كتابة الكائنات المشتركة، نستخدم المعترضات لتحقيق ذلك. يتم حقن المعترضات عند تهيئة SDK
، ويمكن تقسيم الأعمال المختلفة إلى اعتراضات مختلفة بشكل تسلسلي.
UI
فأنت بحاجة إلى تنفيذها في الخيط الرئيسي؛
SocialOptions options = new SocialOptions . Builder ( this )
// ... 其他初始化代码
// 添加分享拦截器
. addShareInterceptor (( context , target , obj ) -> {
obj . setSummary ( "描述加前缀" + obj . getSummary ());
return obj ;
})
. addShareInterceptor (( context , target , obj ) -> {
obj . setTargetUrl ( obj . getTargetUrl ()+ "?id=100" );
return obj ;
})
// 构建
. build ();
// 初始化
SocialSdk . init ( options );
عادةً ما نواجه متطلبات عند المشاركة، مثل النسخ إلى لوحة اللصق/دعم مشاركة الرسائل القصيرة/دعم مشاركة البريد الإلكتروني، وما إلى ذلك. قام SocialSdk
بتضمين هذه الوظائف، ويجب إضافة معلمات إضافية بعد إنشاء ShareObj
لتنفيذها؛
shareObj . setSmsParams ( "13611301719" , "说啥呢" );
shareObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
shareObj . setClipboardParams ( "复制的内容" );
دعم مشاركة تطبيق WeChat الصغير، وذلك أيضًا باستخدام نموذج المعلمات الإضافية
shareObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
من أجل توحيد الاستثناءات التي يتم إرجاعها عند حدوث الفشل ومشاركتها بشكل أفضل، فإن جميع الاستثناءات التي يتم إرجاعها سيكون لها code
يمكنه تحديد المشاكل وتقديم مطالبات أكثر ودية بناءً على code
مختلفة.
int CODE_COMMON_ERROR = 101 ; // 通用错误,未归类
int CODE_NOT_INSTALL = 102 ; // 没有安装应用
int CODE_VERSION_LOW = 103 ; // 版本过低,不支持
int CODE_SHARE_BY_INTENT_FAIL = 105 ; // 使用 Intent 分享失败
int CODE_STORAGE_READ_ERROR = 106 ; // 没有读存储的权限,获取分享缩略图将会失败
int CODE_STORAGE_WRITE_ERROR = 107 ; // 没有写存储的权限,微博分享视频copy操作将会失败
int CODE_FILE_NOT_FOUND = 108 ; // 文件不存在
int CODE_SDK_ERROR = 109 ; // sdk 返回错误
int CODE_REQUEST_ERROR = 110 ; // 网络请求发生错误
int CODE_CANNOT_OPEN_ERROR = 111 ; // 无法启动 app
int CODE_PARSE_ERROR = 112 ; // 数据解析错误
int CODE_IMAGE_COMPRESS_ERROR = 113 ; // 图片压缩失败
int CODE_PARAM_ERROR = 114 ; // 参数错误
int CODE_SDK_INIT_ERROR = 115 ; // SocialSdk 初始化错误
int CODE_PREPARE_BG_ERROR = 116 ; // 执行 prepareOnBackground 时错误
int CODE_NOT_SUPPORT = 117 ; // 不支持
على سبيل المثال يمكنك القيام بذلك:
listener = new OnShareStateListener () {
@ Override
public void onState ( Activity act , ShareResult result ) {
switch ( result . state ) {
case ShareResult . STATE_FAIL :
SocialError e = result . error ;
showMsg ( "分享失败 " + e . toString ());
// 如下因为没有存储权限导致失败,请求权限
if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . M ) {
if ( e . getCode () == SocialError . CODE_STORAGE_READ_ERROR ) {
requestPermissions ( new String []{ Manifest . permission . READ_EXTERNAL_STORAGE }, 100 );
} else if ( e . getCode () == SocialError . CODE_STORAGE_WRITE_ERROR ) {
requestPermissions ( new String []{ Manifest . permission . WRITE_EXTERNAL_STORAGE }, 100 );
}
}
break ;
}
}
};
public class HuaweiPlatform extends AbsPlatform {
// 工厂函数
public static class Factory implements PlatformFactory {
@ Override
public IPlatform create ( Context context , int target ) {
return new HuaweiPlatform ( context , null , null , target );
}
@ Override
public int getPlatformTarget () {
return PLATFORM_HUAWEI ;
}
@ Override
public boolean checkShareTarget ( int shareTarget ) {
return false ;
}
@ Override
public boolean checkLoginTarget ( int loginTarget ) {
return loginTarget == LOGIN_HUAWEI ;
}
}
public HuaweiPlatform ( Context context , String appId , String appName , int target ) {
super ( context , appId , appName , target );
}
}
أهم شيء هو كتابة وظيفة المصنع الخاصة بالمنصة، وسيقوم الإطار باكتشافها وتسجيلها تلقائيًا في النظام، وليست هناك حاجة للتسجيل يدويًا.
يتمتع SocialSdk
بإدارة تلقائية لدورة الحياة داخليًا، وسيتم إعادة تدوير جميع الموارد بعد اكتمال كل مشاركة لتسجيل الدخول، ومن المستحسن أن يقوم Activity
يبدأ مشاركة تسجيل الدخول بتنفيذ واجهة LifecycleOwner
مباشرة AppCompatActivity
وسيتم ربط دورة الحياة داخليا لتجنب حدوث تسرب للذاكرة.
ف ف:
libs/open_sdk_r2973327_lite.jar
بإصدار 2019.12ويتشات:
com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.5.8
تم التحديث بـ 2020.1.22ويبو:
com.sina.weibo.sdk:core:4.3.7:openDefaultRelease@aar
دينغ توك:
com.alibaba.android:ddsharesdk:1.1.0