前言
在如今的APP或者游戏中,分享功能差点儿已经成为标配。分享功能不但能够满足用户的需求。也能够为产品带来很多其它的用户,甚至能够对用户的行为、活跃度、年龄段等情况进行数据统计,使得软件公司能够对产品进行更精准的定位。今天我们就来简单剖析市场上一款优秀的分享SDK以及其集成过程。这款分享SDK就是友盟的社会化分享组件。
友盟社会化分享,帮助移动应用高速具备分享、登录、评论、喜欢等社交功能,提升用户粘度、助力产品推广,并提供实时、全面的社会化数据统计分析服务。
很多其它请訪问友盟社会化组件官网。
基本概念
依据友盟的集成文档。我们对于友盟社会化分享SDK的操作主要是通过UMSocialService接口来进行操作,一些相关的配置则须要通过SocialzieConfig类来进行配置。这个配置类通过UMSocialService的getConfig()函数来获得。在友盟社会化分享SDK中一个社交平台通过SHARE_MEDIA枚举来标识。比方新浪微博就是SHARE_MEDIA.SINA。微信就是SHARE_MEDIA.WEIXIN。通过这个平台枚举我们就知道了用户是要将内容分享到哪个社交平台,至于为什么是用枚举。我想可能是由于老代码的遗留问题吧。而为了增强平台的可扩展性,友盟又添加了一个UMSsoHandler 。通过这个类来包装社交平台的分享、SSO登录等操作。
因此。我们得到例如以下几张结构图:
图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具体信息的配置页面。
例如以下图所看到的:
图 5
在这里主要配置的是应用的包名和签名。应用的包名在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參考友盟文档。友盟社会化组件文档。
执行程序后。会得到例如以下的效果图。点击某个平台就能够进行授权。然后分享。
效果图
加入其它社交平台
以下我们就来演示假设将微信和微信朋友圈加入到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的签名和包名是否与微信开放平台上填写的一致了。
假设信息填写无误。那么提交审核就可以。
审核成功后就可以进行分享。
<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为平台图标 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设计上存在一些不合理的问题。总的来说。友盟社会化组件还是不错的。包括了眼下的主流平台。即使没有包括你所须要的平台也能够通过自己定义平台来实现,这样就保证了扩展性。