ShareSDK 安装教程

news2024/11/25 7:10:44

一、ShareSDK简介

ShareSDK是一种社会化分享组件,为iOS、Android、WP8 的APP提供社会化功能,集成了一些常用的类库和接口,缩短开发者的开发时间,还有社会化统计分析管理后台。ShareSDK移动开发者服务平台由广州掌淘网络科技有限公司开发。

官方地址:全球领先的数据智能科技平台-MobTech袤博

ShareSDK支持包括QQ、微信、新浪微博、开心网、人人网、豆瓣、网易微博、搜狐微博、facebook、twitter、google+等国内外40多家的主流社交平台(如图所示),帮助开发者轻松实现社会化分享、登录、关注、获得用户资料、获取好友列表等主流的社会化功能,强大的统计分析管理后台,可以实时了解用户、信息流、回流率、传播效率等数据,有效地指导移动APP的日常运营与推广,同时为APP引入更多的流量。

ShareSDK强大功能:

集成快捷,操作简单
40多家主流社交网络,无论是开发还是维护,都需要巨大的工作量才能完成,使用ShareSDK只需要3分钟即可集成完成。
评论和赞功能
可以直接通过第三方登录,发表评论和赞
插件稳定,安装包小
每个开放平台的库包是独立的,开发者可根据需求添加,极大的减小APP体积,使分享内容更稳定。
适配专用游戏引擎
Cocos2d-x;Unity3D;ANE;Java Script的专用游戏引擎社会化分享
社会化统计分析
标准、专业的统计分析后台,实时了解SNS、用户、信息流、转化率、传播效应等基本数据,新增自定义短链、“评论和赞”板块,有效指导日常运营与推广。

二、准备工作

(一)环境搭建(Mac版)

Unity3D: 2017.4.10f1

JDK: 1.8.0_40

SDK:

SDKTools: 25.2.5

buildTools: 28.0.2

platformTools: 28.0.1

Eclipse: Oxygen.3a Release (4.7.3a)

安装可参见链接:

1、mac安装eclipse完整教程_java落的博客-CSDN博客_eclipse mac版安装

2、MAC安装Eclipse及对其进入相关配置(详细)_默默079的博客-CSDN博客_mac eclipse 进入到类中

ShareSDK: 3.2.1

由于Mob提供的平台较多,本章节选取以基于Unity引擎Android平台微信分享SDK为例,进行讲解。

(二)Mob官方操作

1、获取AppKey

如何在Mob官网注册应用得到appkey,请点击链接看里面的操作步骤。

2、下载SDK

3、下载ShareSDK的Unity3D工具类

打开Github下载

GitHub - MobClub/New-Unity-For-ShareSDK: New sample of ShareSDK for Unity, including ios and android.

下载完成之后,进行解压缩,文件结构如图2所示:

(三)微信开放平台官方操作

1、获取AppKey

首先注册微信开放平台账号(开发者资质可在之后验证, 地址:),

微信开放平台 (qq.com)

注册完成进行登录,登录之后,点击导航栏 “管理中心” 选项,即可进行应用创建,如下第一张图所示。

点击创建移动应用按钮,跳转应用信息界面,按照引导填写相关信息,填写完成进行提交即可,接下来的时间就是等待微信开放平台的审核结果啦。如下第二张图所示。

注意:这里应用包名非常重要,要注意填写。

应用包名: 采用反写域名命名规则,即http://com.xx.xxx形式;

使用包名(Package Name)作为应用的唯一标识。即:包名必须唯一,一个包名代表一个应用,不允许两个应用使用同样的包名。包名主要用于系统识别应用,几乎不会被最终用户看到。 因为包名是唯一标识,所以为了避免与其他应用的包名重复产生冲突,您可以这样命名:将您的域名反转过来作为前缀,比如如果您的域名是http://zan.com,那么包名可以用com.zan开头,这样可以有效的避免重复 在后面增加描述产品名称的字符,比如果果您的应用是视频应用,可以命名为com.zan.video;如果您没有域名,可以使用自己的邮箱作为前缀,比如 com.163.WoDeYouXiang。简单说,自己定义一个开发应用的包名;这个包名必须唯一性。一般采用反写域名命名规则。

审核通过后,点击查看,即可获取应用的AppID 与 AppSecret啦, 如下图所示:

至此,所有准备工作已完成

三、ShareSDK接入流程

1、导入ShareSDK

创建Unity3D工程,双击或导入ShareSDK.unitypackage导入相关文件(导入时,只需导入所用平台Jar包以及相关依赖文件即可,避免因为Jar包导致无关平台图标出现)。 注意该操作可能会覆盖您原来已经存在的文件!

导入后如下第一张图,第二张图所示,ShareSDK目录下的AndroidManifest.xml中的包名(package)改成您自己的项目的包名;

2、创建场景

创建并保存场景,在场景中添加一些3D游戏对象,作为场景内容,如下图所示。

也可在场景中创建UI元素,用于点击按钮进行分享,亦或是显示分享反馈信息(本文作为示例工程,将直接采用GUI进行UI创建以及布局)。

3、逻辑处理

首先,打开ShareSDKDevInfo 文件,把不需要分享的平台给注释掉,方便在面板上进行配置,如下图所示。

其次,创建一个游戏对象或者选择场景中的某个游戏对象,挂载Share SDK.cs脚本,将之前获取的Mob平台AppID/AppSecret以及WeChat平台AppID/AppSecret填入以下对应文本框中。如下图所示:

注意:上图中如勾选了BypassApproval,则在分享时会绕过微信验证,但是功能不全,只能以图文方式进行分享。

最后,进行自定义逻辑编写,创建Demo.cs文件,双击打开,编写以下逻辑:

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using cn.sharesdk.unity3d;


public class Demo : MonoBehaviour {


	private ShareSDK ssdk;


	// Use this for initialization
	void Start ()
	{	
		ssdk = this.gameObject.GetComponent<ShareSDK>();
//		ssdk.authHandler = OnAuthResultHandler;
		ssdk.shareHandler = OnShareResultHandler;
//		ssdk.showUserHandler = OnGetUserInfoResultHandler;
//		ssdk.getFriendsHandler = OnGetFriendsResultHandler;
//		ssdk.followFriendHandler = OnFollowFriendResultHandler;
	}


	// Update is called once per frame
	void Update () 
	{
		if (Input.GetKeyDown(KeyCode.Escape)) {
			Application.Quit();
		}
	}
	
	void OnGUI ()
	{
		if (GUI.Button(new Rect(100, 100, 300, 200), "Share"))
		{
			//屏幕截图,将会存储在Application.persistentDataPath + "/Shot.png"位置
//			ScreenCapture.CaptureScreenshot ("Shot.png");


			//开启协程
//			StartCoroutine (ShareToWeChat());


			ShareToWeChat ();
		}
	}


	//分享操作
	void ShareToWeChat(){
		//等待截图完成,0.5秒后继续下面的操作
//		yield return new WaitForSeconds (0.5f);


		//获取到刚刚的截图路径
//		string imgPath = Application.persistentDataPath + "/Shot.png";


		//创建分享内容实例
		ShareContent content = new ShareContent ();


		//设置分享内容的text
		content.SetText ("This is a Test!");


		//设置分享内容的本地图片;如果想加载网络上的图片,可以使用content.SetImageUrl(string URL)方法来设置图片
//		content.SetImagePath (imgPath);
		content.SetImageUrl("http://ww3.sinaimg.cn/mw690/be159dedgw1evgxdt9h3fj218g0xctod.jpg");


		//设置分享所链接到的网页地址
		content.SetUrl ("http://www.ztsskj.com/");


		//设置分享的标题
		content.SetTitle("test title");


		//设置分享的内容类型
		content.SetShareType (ContentType.Webpage);


		//多平台选择,以下语句使得按钮被点击以后会弹出选择分享平台的面板,
		//面板上的显示的平台可以使用PlatformType[] platforms来自己定义,如果sharesdk.ShowPlatformList的
		//第一个参数为null,则会显示ShareSDK支持的所有平台以供选择
		//PlatformType[] platforms = { PlatformType.WeChat, PlatformType.WeChatMoments };
		//sharesdk.ShowPlatformList(platforms, content, 0, 0);


		//单一分享,此语句指示在点击按钮以后直接弹出微信好友分享,若PlatformType.WeChatMoments则为朋友圈分享
//		ssdk.ShowShareContentEditor(PlatformType.WeChat, content);


		ssdk.ShowPlatformList (null, content, 100, 100);
	}


	/// <summary>
	/// 授权回调
	/// </summary>
	/// <param name="reqID">Req I.</param>
	/// <param name="state">State.</param>
	/// <param name="type">Type.</param>
	/// <param name="result">Result.</param>
	void OnAuthResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable result)
	{
		if (state == ResponseState.Success)
		{
			if (result != null && result.Count > 0) {
				print ("authorize success !" + "Platform :" + type + "result:" + MiniJSON.jsonEncode(result));
			} else {
				print ("authorize success !" + "Platform :" + type);
			}
		}
		else if (state == ResponseState.Fail)
		{
			#if UNITY_ANDROID
			print ("fail! throwable stack = " + result["stack"] + "; error msg = " + result["msg"]);
			#elif UNITY_IPHONE
			print ("fail! error code = " + result["error_code"] + "; error msg = " + result["error_msg"]);
			#endif
		}
		else if (state == ResponseState.Cancel) 
		{
			print ("cancel !");
		}
	}


	/// <summary>
	/// 获取用户信息回调
	/// </summary>
	/// <param name="reqID">Req I.</param>
	/// <param name="state">State.</param>
	/// <param name="type">Type.</param>
	/// <param name="result">Result.</param>
	void OnGetUserInfoResultHandler (int reqID, ResponseState state, PlatformType type, Hashtable result)
	{
		if (state == ResponseState.Success)
		{
			print ("get user info result :");
			print (MiniJSON.jsonEncode(result));
			print ("AuthInfo:" + MiniJSON.jsonEncode (ssdk.GetAuthInfo (PlatformType.QQ)));
			print ("Get userInfo success !Platform :" + type );
		}
		else if (state == ResponseState.Fail)
		{
			#if UNITY_ANDROID
			print ("fail! throwable stack = " + result["stack"] + "; error msg = " + result["msg"]);
			#elif UNITY_IPHONE
			print ("fail! error code = " + result["error_code"] + "; error msg = " + result["error_msg"]);
			#endif
		}
		else if (state == ResponseState.Cancel) 
		{
			print ("cancel !");
		}
	}


	/// <summary>
	/// 分享结果回调
	/// </summary>
	/// <param name="reqID">Req I.</param>
	/// <param name="state">State.</param>
	/// <param name="type">Type.</param>
	/// <param name="result">Result.</param>
	void OnShareResultHandler (int reqID, ResponseState state, PlatformType type, Hashtable result)
	{
		if (state == ResponseState.Success)
		{
			print ("share successfully - share result :");
			print (MiniJSON.jsonEncode(result));
		}
		else if (state == ResponseState.Fail)
		{
			#if UNITY_ANDROID
			print ("fail! throwable stack = " + result["stack"] + "; error msg = " + result["msg"]);
			#elif UNITY_IPHONE
			print ("fail! error code = " + result["error_code"] + "; error msg = " + result["error_msg"]);
			#endif
		}
		else if (state == ResponseState.Cancel) 
		{
			print ("cancel !");
		}
	}


	/// <summary>
	/// 获取好友列表回调
	/// </summary>
	/// <param name="reqID">Req I.</param>
	/// <param name="state">State.</param>
	/// <param name="type">Type.</param>
	/// <param name="result">Result.</param>
	void OnGetFriendsResultHandler (int reqID, ResponseState state, PlatformType type, Hashtable result)
	{
		if (state == ResponseState.Success)
		{			
			print ("get friend list result :");
			print (MiniJSON.jsonEncode(result));
		}
		else if (state == ResponseState.Fail)
		{
			#if UNITY_ANDROID
			print ("fail! throwable stack = " + result["stack"] + "; error msg = " + result["msg"]);
			#elif UNITY_IPHONE
			print ("fail! error code = " + result["error_code"] + "; error msg = " + result["error_msg"]);
			#endif
		}
		else if (state == ResponseState.Cancel) 
		{
			print ("cancel !");
		}
	}


	void OnFollowFriendResultHandler (int reqID, ResponseState state, PlatformType type, Hashtable result)
	{
		if (state == ResponseState.Success)
		{
			print ("Follow friend successfully !");
		}
		else if (state == ResponseState.Fail)
		{
			#if UNITY_ANDROID
			print ("fail! throwable stack = " + result["stack"] + "; error msg = " + result["msg"]);
			#elif UNITY_IPHONE
			print ("fail! error code = " + result["error_code"] + "; error msg = " + result["error_msg"]);
			#endif
		}
		else if (state == ResponseState.Cancel) 
		{
			print ("cancel !");
		}

逻辑编写完成,将脚本挂载至Main Camera上,接下来就可以进行打包测试了!

四、ShareSDK测试

在进行打包时,请确认当前微信开放平台包名、ShareSDK目录下的AndroidManifest.xml以及下图15所示的Package Name一致。

将打包得到的APK文件安装至安卓手机,并安装签名工具,打开签名工具,输入工程包名,即可获取相应的应用签名,将获取的应用签名填写至微信开放平台,如下两图所示。

至此,所有设置已结束,测试结果如下图18所示:

上图中红色箭头所指处“TapManMan”是项目中使用的微信开放平台的appkey对应的应用名,微信自动添加。

五、ShareSDK总结

在进行ShareSDK微信分享安装时,并不是那么顺利,在此总结接入过程需要注意的点。

1、全程需要关注所使用的应用包名必须一致(微信开放平台应用包名, AndroidManifest.xml文件应用包名、打包时Package Name对应的应用包名)。

2、使用签名工具获取应用签名,并将签名填写至微信开放平台。

3、进行APK测试时,有可能不能够成功拉起微信界面,进行相关分享操作,效果体现为:闪退。在此,可采取以下措施:

(1)检查以上两项(1、 2)是否有误

(2)微信缓存了之前的错误信息,造成闪退,这点一般不会出现,但也可能,不过概率极小,为了保持测试的成功性,可以先清除微信缓存后,在开发应用分享功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++进阶之路第一卷】预编译头加快编译速度

一、前言 最近在写项目的时候&#xff0c;发现随着项目越来越大&#xff0c;编译需要的时间也越来越长&#xff0c; 然后使用了预编译头&#xff0c;时间减少了很多&#xff01; 这个谁用谁知道&#xff0c;很 Nice&#xff01; 1. 预编译头的原理 简单来说就是将一些你认…

广域网简介、PE/CE/P基本概念理解、PPP协议详细介绍、PAP/CHAP认证介绍与配置、PPPOE会话建立详细介绍并配合实验抓包理解报文交互。

3.1.0 广域网&#xff08;简介、PPP、PAP、CHAP、PPPOE&#xff09; 观前温馨提示&#xff1a; 篇幅较大&#xff0c;本章主要有以下大点&#xff0c;可通过目录与右侧导航跳转观看&#xff1a; &#xff08;1&#xff09;广域网基本概念 &#xff08;2&#xff09;PPP协议介…

【Numpy基础知识】在ndarrays上索引

在ndarrays上索引 来源&#xff1a;Numpy官网&#xff1a;https://numpy.org/doc/stable/user/basics.html 文章目录在ndarrays上索引导包【1】基本索引【2】高级索引【3】结合高级索引和基本索引【3】现场访问【4】展开迭代器索引【5】为索引数组赋值【6】处理程序中可变数量的…

Python3 环境搭建

本章节我们将向大家介绍如何在本地搭建 Python3 开发环境。 Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个DOS版本)PalmOSNokia 移动手…

浅谈转行Python的看法,分享我的学习方法

今天跟大家聊一下转行Python的看法和经验。本人之前是做Java开发的&#xff0c;后面因为公司需要Python技术&#xff0c;就接触到了Python&#xff0c;我发现Python比Java更加容易理解&#xff0c;简洁&#xff0c;后面随着Python项目的增多干脆就转行做Python开发了。 Python…

LaTeX教程(三)——文档格式排版

文章目录1. 章节目录1.1 生成章节1.2 生成目录2. 交叉引用和脚注2.1 交叉引用2.2 脚注3. 特殊环境3.1 列表3.2 文本对齐3.3 引用环境3.4 代码环境1. 章节目录 1.1 生成章节 写文章或者论文的时候&#xff0c;章节目录可谓是必不可少的&#xff0c;下面我们来聊聊LaTeX怎么处理…

Linux——安装和使用vmtools

实验1 Linux系统初识 一、安装和使用vmtools vmware tools是虚拟机VMware Workstation自带的一款工具&#xff0c;现在介绍ubuntu linux安装VMare tools。它的作用就是使用户可以从物理主机直接往虚拟机里面拖文件。如果不安装它&#xff0c;我们是无法进行虚拟机和物理…

【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析附Matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

第十三章ThreadLocal

文章目录什么是ThreadLocal基本使用常用方法使用ThreadLocal来解决使用sychronized解决ThreadLocal与synchronized的区别运用场景_事务案例场景构建引入事务JDBC中关于事务的操作的api常规解决方案常规方案的弊端ThreadLocal解决方案ThreadLocal方案的好处ThreaLocal的内部结构…

Java堆排序和代码实现详解

堆的定义 堆是计算机科学中一类特殊的数据结构的统称&#xff0c;堆通常可以被看做是一棵完全二叉树的数组对象。 堆的特性 1.它是完全二叉树&#xff0c;除了树的最后一层结点不需要是满的&#xff0c;其它的每一层从左到右都是满的&#xff0c;如果最后一层结点不是满的&…

Hadoop(入门)

一、Hadoop概述 1.1 Hadoop是什么 1&#xff09;Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2&#xff09;主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。 3&#xff09;广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念—Hadoop生态圈。…

[Vue3]自定义指令实现组件元素可拖拽移动

实现思路&#xff1a; 元素移动设计思路 1.在光标按下的时刻记录下光标的绝对位置坐标&#xff08;以视窗左上角为原点&#xff09;&#xff08;const {clientX, clientY} evt&#xff09; clientX / clientY 事件属性返回当事件被触发时光标指针相对于浏览器页面当前 body …

flutter系列之:移动端手势的具体使用

文章目录简介赋予widget可以点击的功能会动的组件可删除的组件总结简介 之前我们介绍了GestureDetector的定义和其提供的一些基本的方法&#xff0c;GestureDetector的好处就是可以把任何一个widget都赋予类似button的功能。 今天将会通过几个具体的例子来讲解一下GestureDet…

用ChatGPT写一段嵌入式代码

已剪辑自: https://mp.weixin.qq.com/s/uKkUwXx32LPkUYQK44z1lw 废话不多说&#xff0c;开整&#xff01; ChatGPT: Optimizing Language Models for Dialogue&#xff0c;即优化对话的语言模型&#xff0c;它以对话的方式进行交互。对话形式使ChatGPT能够回答后续问题&#…

性能测试---LoadRunner

目录 1.LoadRunner对比Jmeter的优势 2.LoadRunner三个组件之间的关系 3.学习VUG的使用 3.1创建性能测试脚本并进行录制 第一步:打开VUG,创建一个新的性能测试的脚本 第二步:对新建的脚本进行设置 第三步:启动WebTours服务 第四步:回到VUG中,点击录制按钮并设置录制选项…

学习编程的五个关键点!你需要get它,并运用!

总体来说&#xff0c;学习如何编程是一件较难的事情。我最近发现大学里的计算机课程和各种编程训练营错过了编程的一些重要因素&#xff0c;对新手的教学用了不太恰当的方法。于是&#xff0c;我准备分享一个成功的编程课程应该具备的五大基本支柱。 菜鸟的目标是掌握编程的基…

form表单发送put、delete、patch请求的实现过程

关于发送put、delete、patch请求底层实现过程 对于put这些请求&#xff0c;我们无法直接通过form表单发送&#xff0c;form表单仅支持get和post请求&#xff1b; 虽然我们无法直接通过form表单发送这些请求&#xff0c;但我们可以以form表单为载体做二次请求&#xff1a;使用f…

[附源码]计算机毕业设计Node.js宠物商店管理系统(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

48数据流中的中位数 49表达式 50两数之和

48数据流中的中位数 第一次没看到要求排序&#xff0c;还以为题目答案写错了&#xff0c;用排序的内置函数也正好是nlogn import java.util.ArrayList;public class Solution {ArrayList<Integer> list new ArrayList<>();public void Insert(Integer num) {list…

小满nestjs(第二十七章 nestjs typeOrm关系)

在我们开始的过程中&#xff0c;肯定不会把数据存在一个表里面&#xff0c;我们会进行分表&#xff0c;把数据分开存&#xff0c;然后通过关联关系&#xff0c;联合查询。 typeOrm 文档 一对一 | TypeORM 中文文档 前端代码还是复用上一章的 增加了一个添加Tag <template…