开发指南(国内)
国内分享支持 QQ 、微信、微博等目标平台,其中 QQ 、微信支持分享到聊天窗及朋友圈(空间)。
各个目标平台分享时其对应平台客户端必须安装,否则会分享失败。
分享内容包括纯文本、纯图片、网页分享等。接口声明如下:
设置分享回调
- iOS
- Android
- Unity
- UE
// 当cancel为NO,error为nil时,表示分享成功
typedef void (^XDShareResultHandler)(NSError *_Nullable error, BOOL cancel);
当分享失败时,会返回对应错误码和错误描述,错误码对应如下:
错误码 | 描述 |
---|---|
-1 ( XDShareErrorCodeInvalidParams ) | 传递的参数无效,包括字符串为空或 null,对应路径文件不存在等 |
-2 ( XDShareErrorCodeNotInit ) | 该目标平台未初始化,请检查对应平台参数配置是否正常 |
-3 ( XDShareErrorCodeTargetNotInstalled ) | 该目标平台未安装 |
-4 ( XDShareErrorCodeOther ) | 其他错误,例如目标平台返回的其他异常 |
public interface XDShareCallback {
//分享成功
void onSuccess();
//分享失败
void onFail(int code, String error);
//分享取消
void onCancel();
}
当分享失败时,会返回对应错误码和错误描述,错误码对应如下:
错误码 | 描述 |
---|---|
-1 ( XDShare.ERROR_CODE_INVALID_PARAMS ) | 传递的参数无效,包括字符串为空或 null,对应路径文件不存在等 |
-2 ( XDShare.ERROR_CODE_NOT_INIT ) | 该目标平台未初始化,请检查对应平台参数配置是否正常 |
-3 ( XDShare.ERROR_CODE_TARGET_NOT_INSTALLED ) | 该目标平台未安装 |
-4 ( XDShare.ERROR_CODE_OTHER ) | 其他错误,例如目标平台返回的其他异常 |
public interface IXDShareCallback{
//分享成功
void OnSuccess();
//分享失败
void OnFail(int code, string msg);
//分享取消
void OnCancel();
}
当分享失败时,会返回对应错误码和错误描述,错误码对应如下:
错误码 | 描述 |
---|---|
-1 ( ShareConstants.ShareErrorCode.INVALID_PARAMS ) | 传递的参数无效,包括字符串为空或 null,对应路径文件不存在等 |
-2 ( ShareConstants.ShareErrorCode.NOT_INIT ) | 该目标平台未初始化,请检查对应平台参数配置是否正常 |
-3 ( ShareConstants.ShareErrorCode.TARGET_NOT_INSTALLED ) | 该目标平台未安装 |
-4 ( ShareConstants.ShareErrorCode.OTHER ) | 其他错误,例如目标平台返回的其他异常 |
enum class EXDShareState : int64
{
Success,
Cancel,
Error,
};
struct XDGCOMMON_API FXDShareResult {
EXDShareState GetState() const;
EXDShareErrorCode GetErrorCode() const;
FString GetMsg() const;
};
当分享失败时,会返回对应错误码和错误描述,错误码对应如下:
错误码 | 描述 |
---|---|
-1 ( EXDShareErrorCode::InvalidParams ) | 传递的参数无效,包括字符串为空或 null,对应路径文件不存在等 |
-2 ( EXDShareErrorCode::NotInit ) | 该目标平台未初始化,请检查对应平台参数配置是否正常 |
-3 ( EXDShareErrorCode::TargetNotInstalled ) | 该目标平台未安装 |
-4 ( EXDShareErrorCode::Other ) | 其他错误,例如目标平台返回的其他异常 |
分享参数类型说明
- iOS
- Android
- Unity
- UE
typedef NS_ENUM(NSInteger, XDShareTarget) {
XDShareTargetWeChat = 0,
XDShareTargetQQ,
XDShareTargetWeibo,
};
typedef NS_ENUM(NSInteger, XDShareSceneType) {
XDShareSceneTypeSession = 0, // 聊天会话
XDShareSceneTypeTimeline, // 朋友圈、QQ空间等
};
/**
* WebPage 实体信息,
* 包括标题、摘要、缩略图、点击后跳转 URL
*/
@interface XDShareWebPage : NSObject
/// 标题,必选
@property (nonatomic, strong) NSString *title;
/// 摘要,可选
@property (nonatomic, strong, nullable) NSString *summary;
/// 缩略图路径,可选
@property (nonatomic, strong, nullable) NSString *thumbUri;
/// 跳转 URL。必选
@property (nonatomic, strong) NSString *url;
@end
XDShareTarget
- XDShareTarget.QQ(QQ)
- XDShareTarget.WECHAT(微信)
- XDShareTarget.WEIBO(微博)
scene
- XDSceneType.SESSION(聊天窗)
- XDSceneType.TIMELINE(朋友圈或空间)
WebPageData
参数 WebPageData 为网页配置信息,内容如下:
参数名 | 类型 | 描述 |
---|---|---|
title | String | 标题(必选) |
summary | String | 摘要 |
thumbUri | String | 缩略图路径 |
url | String | 点击后跳转链接(必选) |
XDShareTarget
- ShareConstants.ShareTarget.QQ(QQ)
- ShareConstants.ShareTarget.WECHAT(微信)
- ShareConstants.ShareTarget.WEIBO(微博)
scene
- ShareConstants.ShareScene.SESSION(聊天窗)
- ShareConstants.ShareScene.TIMELINE(朋友圈或空间)
WebPageData
参数 WebPageData 为网页配置信息,内容如下:
参数名 | 类型 | 描述 |
---|---|---|
title | String | 标题(必选) |
summary | String | 摘要 |
thumbUri | String | 缩略图路径 |
url | String | 点击后跳转链接(必选) |
UENUM(BlueprintType)
enum class EXDShareTarget : uint8
{
WeChat = 0,
QQ,
Weibo
};
UENUM(BlueprintType)
enum class EXDShareSceneType : uint8
{
Session = 0, // 聊天会话
Timeline // 朋友圈、QQ空间等
};
/**
* WebPage 实体信息,
* 包括标题、摘要、缩略图、点击后跳转 URL
*/
struct XDGCOMMON_API FXDShareWebpage {
/**
* @brief 标题,必选
*/
FString Title;
/**
* @brief 跳转 URL。必选
*/
FString Url;
/**
* @brief 缩略图路径,可选
*/
FString ThumbUri;
/**
* @brief 缩略图数据,可选。如果和ThumbUri都存在,优先取ThumbData
*/
TArray<uint8> ThumbData;
/**
* @brief 摘要,可选
*/
FString Summary;
};
@end
分享
- iOS
- Android
- Unity
- UE
// 判断微信是否安装
[XDShare isTargetInstalled:XDShareTargetWeChat];
XDShareResultHandler ShareResultHandler = ^(NSError * _Nullable error, BOOL cancel) {
if (cancel) {
// 取消逻辑
} else if (error) {
// 分享失败逻辑
} else {
// 分享成功逻辑
}
};
// 分享文本到微信
[XDShare shareWithTarget:XDShareTargetWeChat sceneType:XDShareSceneTypeSession text:@"要分享的文案" completeHandler:ShareResultHandler];
// 分享图片到微信
[XDShare shareWithTarget:XDShareTargetWeChat sceneType:XDShareSceneTypeSession imageUri:@"这里填图片在本地的路径" completeHandler:ShareResultHandler];
// 分享网页到微信
XDShareWebPage *webPage = [[XDShareWebPage alloc] init];
webPage.title = @"标题";
webPage.summary = @"描述";
webPage.url = @"要分享的网页链接";
webPage.thumbUri = @"缩略图本地路径";
[XDShare shareWithTarget:XDShareTargetWeChat sceneType:XDShareSceneTypeSession text:@"test" completeHandler:ShareResultHandler];
/**
* 对应目标平台是否安装
* @param target 目标平台
*/
public static boolean isTargetInstalled(@XDShareTarget int target);
/**
* 分享纯文本 (注:QQ 不支持在聊天窗分享纯文本)
* @param target 目标平台
* @param scene 平台场景,例如聊天窗、朋友圈(空间)等,当 type 为 weibo 时,会忽略该值
* @param text 分享内容
* @param callback 结果回调
*/
public static void shareText(@XDShareTarget int target, @XDSceneType int scene, String text, XDShareCallback callback);
/**
* 分享纯图片
* @param target 目标平台
* @param scene 平台场景,例如聊天窗、朋友圈(空间)等,当 type 为 weibo 时,会忽略该值
* @param imageUri 本地图片地址
* @param callback 结果回调
*/
public static void shareImage(@XDShareTarget int target, @XDSceneType int scene, String imageUri, XDShareCallback callback);
/**
* 分享纯图片
* @param target 目标平台
* @param scene 平台场景,例如聊天窗、朋友圈(空间)等,当 type 为 weibo 时,会忽略该值
* @param imageData 图片字节数据
* @param callback 结果回调
*/
public static void shareImage(@XDShareTarget int target, @XDSceneType int scene, byte[] imageData, XDShareCallback callback){
XDShareCore.getInstance().shareImage(target, scene, imageData, callback);
}
/**
* 分享图文
* @param target 目标平台
* @param scene 平台场景,例如聊天窗、朋友圈(空间)等,当 type 为 weibo 时,会忽略该值
* @param webPageData 分享网页信息配置
* @param callback 结果回调
*/
public static void shareWebPage(@XDShareTarget int target, @XDSceneType int scene, WebPageData webPageData, XDShareCallback callback);
/**
* 对应目标平台是否安装
* @param target 目标平台
*/
void IsTargetInstalled(ShareConstants.ShareTarget target, Action<bool> callback);
/**
* 分享纯文本 (注:Android QQ 不支持在聊天窗分享纯文本)
* @param target 目标平台
* @param scene 平台场景,例如聊天窗、朋友圈(空间)等,当 type 为 weibo 时,会忽略该值
* @param text 分享内容
* @param callback 结果回调
*/
void ShareText(ShareConstants.ShareTarget target, ShareConstants.ShareScene scene, string text, IXDShareCallback callback);
/**
* 分享纯图片
* @param target 目标平台
* @param scene 平台场景,例如聊天窗、朋友圈(空间)等,当 type 为 weibo 时,会忽略该值
* @param imageUri 本地图片地址
* @param callback 结果回调
*/
void ShareImage(ShareConstants.ShareTarget target, ShareConstants.ShareScene scene, string imageUri, IXDShareCallback callback);
/**
* 分享纯图片
* @param target 目标平台
* @param scene 平台场景,例如聊天窗、朋友圈(空间)等,当 type 为 weibo 时,会忽略该值
* @param imageData 图片字节数据
* @param callback 结果回调
*/
void ShareImage(ShareConstants.ShareTarget target, ShareConstants.ShareScene scene, byte[] imageData, IXDShareCallback callback);
/**
* 分享图文
* @param target 目标平台
* @param scene 平台场景,例如聊天窗、朋友圈(空间)等,当 type 为 weibo 时,会忽略该值
* @param webPageData 分享网页信息配置
* @param callback 结果回调
*/
void ShareWebPage(ShareConstants.ShareTarget target, ShareConstants.ShareScene scene, WebPageData data, IXDShareCallback callback);
class XDGMAINLAND_API FXDShare {
public:
/**
* @platfrom [iOS] [Android]
* @brief 判断该平台APP是否安装
* @param Target 目标平台APP
* @return 是否安装
*/
static bool IsTargetInstalled(EXDShareTarget Target);
/**
* @platfrom [iOS] [Android]
* @brief 分享文字
* @param Target 目标平台APP
* @param Scene 分享的场景
* @param Text 要分享的文字
* @param CallBack 分享的回调,结果仅供参考(可能不回调)
*/
static void ShareText(EXDShareTarget Target, EXDShareSceneType Scene, const FString& Text, FXDShareResult::FDelegate CallBack);
/**
* @platfrom [iOS] [Android]
* @brief 分享图片
* @param Target 目标平台APP
* @param Scene 分享的场景
* @param ImageUri 要分享的图片本地路径
* @param CallBack 分享的回调,结果仅供参考(可能不回调)
*/
static void ShareImage(EXDShareTarget Target, EXDShareSceneType Scene, const FString& ImageUri, FXDShareResult::FDelegate CallBack);
/**
* @platfrom [iOS] [Android]
* @brief 分享图片
* @param Target 目标平台APP
* @param Scene 分享的场景
* @param ImageData 要分享的图片本地路径
* @param CallBack 分享的回调,结果仅供参考(可能不回调)
*/
static void ShareImage(EXDShareTarget Target, EXDShareSceneType Scene, const TArray<uint8>& ImageData, FXDShareResult::FDelegate CallBack);
/**
* @platfrom [iOS] [Android]
* @brief 分享网页
* @param Target 目标平台APP
* @param Scene 分享的场景
* @param Webpage 要分享的网页对象
* @param CallBack 分享的回调,结果仅供参考(可能不回调)
*/
static void ShareWebpage(EXDShareTarget Target, EXDShareSceneType Scene, const FXDShareWebpage& Webpage, FXDShareResult::FDelegate CallBack);
};
项目工程配置
因 Android 11 及以上版本,系统存储结构发生变化,所以为了兼容对应系统设备,分享游戏目录内文件,游戏需添加以下配置。
1. 添加 filePath 文件配置
游戏在 Android 工程 res/xml
目录下新建 xdshare_filepath.xml 文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="share"
path="." />
<files-path
name="images"
path="."/>
<root-path
name="external_files"
path=""/>
</paths>
2. 清单文件添加声明
在应用 AndroidManifest.xml
文件中的 <application>
节点下添加如下声明:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<application .... >
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/xdshare_filepath" />
</provider>
</application>
</manifest>
其中 ${applicationId}
为游戏的包名