提供海外用户从app分享到其他社交平的功能,具体包括分享到Facebook、Instagram 、Tiktok 、Whats app 等平台。
技术方案对比
1.接入各个平台的分享SDK
优点:
(1)sdk有分享结果回调,可以知道用户是否分享成功或是否留在目标app
(2)sdk的数据传输和页面跳转适配的更好
缺点:
(1)需要申请各个平台开发者账号,流程冗杂,官方文档也不够全面,存在各种配置的疑难杂症。如facebook的调试和发布密钥不同,需要根据发布签名生产对应的密钥等
(2)引入sdk需要加入对应的maven仓库和依赖 ,需要对国内海外版本进行区分写两套代码,增加了编码的复杂度
(3)增加海外包体积
(4)因为是对方sdk,出现问题时较难分析,并且可能依赖对方平台解决
2.使用系统分享获取目标app具体的页面,指定该页面进行跳转
优点:
(1) 不需要申请各平台开发者账号、引入依赖,有各种配置问题等,实现成本较小
(2) 不会增加包体积
(3) 最终实现效果优于sdk效果,如facebook
(4) 出错概率较小,没有sdk的各种疑难杂症
缺点:
(1) 没有分享结果回调,不能精确知道用户在进入目标app后是否分享成功,是否留在目标app等
(2) 可能存在app跳转分享页后不回到咱们app的情况
(3) 部分app没有分享的标注
(4) android 各个手机系统兼容性可能会存在问题,增加了测试的成本
海外分享现状
大多数app如Twitter、YouTube、instagram、Facebook都倾向于调用系统分享,尽可能不引入sdk。
经过我的实操了解,即使instagram和facebook是同一家公司的app,但是ins也没有引入facebook的分享sdk,而是调用系统分享。
下面以facebook 分享为例实践说明
1.引入Facebook share-sdk
具体可以访问 https://developers.facebook.com/docs/sharing/android
2.获取目标页面类名进行系统分享
这个方式的难点在于我们需要知道唤起目标页面的意图Intent名称。而官方文档中只给出了STORY和REELS,并没有FEED动态的具体意图名。
(1)通过获取系统分享所有的意图,找到facebook对应的动态意图。
ACTION_SEND表示能够接受共享文件的Activity,setType设置了共享文件的类型,就排除了一些不能接受对应数据类型的Activity,这里我需要的是共享视屏的actvit,其他依次类推。
Intent it = new Intent(Intent.ACTION_SEND);
it.setType("video/*");
List<ResolveInfo> resInfo = activity.getPackageManager().queryIntentActivities(it, 0);
if (!resInfo.isEmpty()) {
for (ResolveInfo info : resInfo) {
ActivityInfo activityInfo = info.activityInfo;
Log.e("layfolk", "activityInfo:" + activityInfo);
}
}
这样就将系统分享意图的中的Facebook相关的具体意图找到了。再根据名称简单判断或者多次修改CompoentName尝试看看实现效果,最终可以找到我们的目标页面的类。
(2)设置intent 的CompoentName
这样我们就通过调用系统分享的方式,直接能够调起系统分享列表中的任何一个意图了。
在接入其他需要分享的平台时同样可以采取这种方式