接入细节
- Android
- iOS
- Unity
- UE
一、添加 SDK 依赖
添加 XDSDK 分享模块。在项目级别的
build.gradle
文件中添加 XDSDK 分享模块的依赖。// 基础库, 必须
implementation files('libs/XDGCommon_6.23.5.aar')
// 分享模块
implementation files('libs/XDGSharing_6.23.5.aar')添加第三方平台分享 SDK 依赖。请按需添加对应的分享平台集成。
// QQ SDK 因 maven 版本较旧,所以使用本地 lib 依赖
implementation(name: 'open_sdk_3.5.14.3_rc26220c_lite', ext: "jar", group: "", version: "")
// 微信(同微信支付,如已有无需重复添加)
implementation "com.tencent.mm.opensdk:wechat-sdk-android:${rootProject.ext.versions.wechatVersion}"
// 微博
implementation "io.github.sinaweibosdk:core:${rootProject.ext.versions.sinaweiboVersion}@aar"
// 抖音
implementation "com.bytedance.ies.ugc.aweme:opensdk-china-external:${rootProject.ext.versions.douYinSdkVersion}"
implementation "com.bytedance.ies.ugc.aweme:opensdk-common:${rootProject.ext.versions.douYinSdkVersion}"
// 小红书
implementation(name: 'xhssharesdk_release_v1.1.4', ext: "aar", group: "", version: "")
// TapTap
implementation files("libs/taptapshare_1.0.1.jar")
// Facebook
implementation "com.facebook.android:facebook-share:15.2.0"
// Twitter
implementation "com.twitter.sdk.android:twitter:3.3.0"
implementation "com.twitter.sdk.android:tweet-composer:3.3.0"
// LINE 通过 scheme 形式进行分享,无需添加额外 SDK 依赖请注意,对于抖音平台的分享,需要在根目录级别的
build.gradle
文件中添加抖音分享的仓库,否则无法找到抖音 SDK 的依赖。allprojects {
repositories {
...
// 抖音
maven { url 'https://artifact.bytedance.com/repository/AwemeOpenSDK' }
}
}添加额外配置。
a. 请将以下配置添加到项目级别的
AndroidManifest.xml
文件中。<manifest>
<application>
<!-- 微信 -->
<!-- 将 {your_package_name} 替换为游戏正确包名,请注意全路径匹配格式,否则可能无法获取分享结果回调 -->
<activity-alias
android:name="{your_package_name}.wxapi.WXEntryActivity"
android:exported="true"
android:targetActivity="com.xd.sharing.mix.bridge.WXShareEntryActivity"/>
<!-- QQ -->
<!-- 将 {在QQ申请的应用ID} 替换为游戏正确的 QQ AppId(同 XDConfig.json 文件中 QQ 的配置),否则可能无法获取分享结果回调 -->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent{在QQ申请的应用ID}" />
</intent-filter>
</activity>
<!-- Facebook -->
<!-- 将 {your_facebook_application_id} 替换为 Facebook Application ID -->
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="{your_facebook_application_id}" />
<provider
android:name="com.facebook.FacebookContentProvider"
android:authorities="com.facebook.app.FacebookContentProvider{your_facebook_application_id}"
android:exported="true" />
</application>
</manifest>b. 因 Android 11 以以上版本系统存储结构的变化,所以为了兼容对应系统的分享,需配置
FileProvider
。 创建 XML 资源文件,存放在 res/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=""/>
<external-cache-path
name="."
path="." />
</paths>c. 在项目级别的 AndroidManifest.xml 文件中添加 FileProvider 声明:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<application ... >
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${应用包名}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/{资源文件名称}" />
</provider>
</application>
</manifest>d. 构建应用。
二、老版本升级注意事项
从小于 XDSDK 6.17.0 版本升级至这个版本时请将旧版本模块的 SDK 移除,包含国内、海外两个模块,原有分享模块的依赖如下:
// 第三方分享(海外)
implementation files('libs/XDGShare_xxx.aar')
// 第三方分享(国内)
implementation files('libs/XDShare_xxx.aar')移除
AndroidManifest.xml
文件中旧版本微信相关的配置,按照上述「额外配置」进行添加,旧版本微信相关的配置如下:<manifest>
<application>
<activity-alias
android:name="{应用包名}.wxapi.WXEntryActivity"
android:exported="true"
android:targetActivity="com.xd.share.cn.bridge.WXEntryActivity"/>
</application>
</manifest>
三、其他注意事项
由于 Android 系统版本的更新,Android 在存储空间以及访问权限上有一些变化。如果在分享时传入的媒体文件是应用私有目录下的文件则无需关心权限问题,只需要保证上述设置 FileProvider 的内容即可。如果在使用的是公共媒体库中的媒体资源第三方平台可能没有权限访问对应的文件,对于这类资源需要游戏自助申请对应权限(android.permission.READ_EXTERNAL_STORAGE
),
特别需要注意的是从 Android 13 开始,Android 系统的媒体权限被细化成了图片和照片权限(android.permission.READ_MEDIA_IMAGES
)、视频权限(android.permission.READ_MEDIA_VIDEO
),请注意额外区分。详情可参考 Android 13 影响应用的行为变更。
一、添加 SDK 依赖
iOS 的分享模块在 XDGCommonSDK 中,但是需要添加对应平台的 XDxxWrapperSDK (如:XDQQWrapperSDK)才能正常工作。
二、Info.plist 配置
Info.plist 中加入 URL 配置、Queries 配置和相册使用权限说明,其中 {****} 的内容需要按照实际情况替换。(部分平台的图片和视频分享必须先保存到系统相册才能继续,请务必不要遗漏权限配置)
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>line</string>
<key>CFBundleURLSchemes</key>
<array>
<string>line3rdp.{bundle_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>facebook</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fb{facebook_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>google</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.{google_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>twitter</string>
<key>CFBundleURLSchemes</key>
<array>
<string>tdsg.twitter.{twitter_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>wechat</string>
<key>CFBundleURLSchemes</key>
<array>
<string>wx{weixin_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>qq</string>
<key>CFBundleURLSchemes</key>
<array>
<string>tencent{qq_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>weibo</string>
<key>CFBundleURLSchemes</key>
<array>
<string>wb{weibo_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>xhs</string>
<key>CFBundleURLSchemes</key>
<array>
<string>xhs{xhs_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>douyin</string>
<key>CFBundleURLSchemes</key>
<array>
<string>{douyin_app_id}</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>sinaweibo</string>
<string>weibosdk</string>
<string>weibosdk2.5</string>
<string>weibosdk3.3</string>
<string>mqqopensdkapiV2</string>
<string>mqq</string>
<string>mqqapi</string>
<string>tim</string>
<string>mqqopensdknopasteboard</string>
<string>weixin</string>
<string>weixinULAPI</string>
<string>weixinURLParamsAPI</string>
<string>fbapi</string>
<string>fb-messenger-share-api</string>
<string>lineauth2</string>
<string>twitterauth</string>
<string>xhsdiscover</string>
<string>douyinopensdk</string>
<string>douyinliteopensdk</string>
<string>douyinsharesdk</string>
<string>snssdk1128</string>
<string>taptap</string>
</array>
<key>NSPhotoLibraryUsageDescription</key>
<string>游戏内分享需要使用您的相册保存图片</string>
三、entitlements 配置
在您的 xxx.entitlements 文件中配置 associated-domains 参数以优化分享的体验,不配置的话在部分平台每次分享都会在应用间跳转两次。(该配置域名固定,除非您的 universal link 配置不在该域名下)
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:www.xd.com</string>
</array>
一、添加 SDK 依赖
从 6.17.0 版本开始,SDK 统一了分享接口。所以,如需使用统一接口,除了添加 com.xd.sdk.mainland
与 com.xd.sdk.oversea
依赖外,还需要添加 com.xd.sdk.share
。
可在项目 package/manifest.json
中添加,
// UPM
{
"dependencies": {
// ...
"com.xd.sdk.oversea": "https://github.com/xd-platform/xdsdk_common.git#xdsdk-oversea-upm-6.23.4",
"com.xd.sdk.mainland": "https://github.com/xd-platform/xdsdk_common.git#xdsdk-mainland-upm-6.23.4",
"com.xd.sdk.share": "https://github.com/xd-platform/xdsdk_common.git#xdsdk-share-upm-6.23.4",
}
}
// NPM
{
"dependencies": {
// ...
"com.xd.sdk.mainland": "6.23.4",
"com.xd.sdk.oversea": "undefined",
},
"scopedRegistries": {
// ....
{
// 通过 NPMJS 方式添加引用,推荐正常能访问公网环境时使用
// 如果访问 NPMJS 存在问题,提供司内内网的备用方案,url 替换为 http://npm.xindong.com 即可。
"name": "NPMJS",
"url": "https://registry.npmjs.org/",
"scopes": [
"com.xd"
]
}
}
}
二、iOS 配置
1. 相机/相册权限
请确保项目的 TDS-Info.plist 中包含对相机/相册权限的说明,如:
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能访问相册,游戏可以自行修改文案</string>
<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能访问相机,游戏可以自行修改文案</string>
2. entitlements 配置
可以通过配置 Unity-iPhone.entitlements 的 associated-domains 参数以优化分享的体验,不配置的话在部分平台每次分享都会在应用间跳转两次。(该配置域名固定,除非您的 universal link 配置不在该域名下)
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:www.xd.com</string>
</array>
建议通过 Unity Editor Script 增加打包配置,可参考以下代码:
public class AddEntitlementsPostProcess {
[PostProcessBuild(1000)]
public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
if (target == BuildTarget.iOS) {
// 指定你的.entitlements文件路径
string entitlementsPath = Path.Combine(pathToBuiltProject, "Unity-iPhone.entitlements");
// 加载或创建.entitlements文件
var plist = new PlistDocument();
if (File.Exists(entitlementsPath)) {
plist.ReadFromFile(entitlementsPath);
} else {
// 如果.entitlements文件不存在,则创建一个新的
var plistHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" +
"<plist version=\"1.0\">\n<dict>\n</dict>\n</plist>";
File.WriteAllText(entitlementsPath, plistHeader);
plist.ReadFromString(plistHeader);
}
// 添加或修改com.apple.developer.associated-domains
var associatedDomainsArray = plist.root.CreateArray("com.apple.developer.associated-domains");
associatedDomainsArray.AddString("applinks:www.xd.com");
// 保存修改
plist.WriteToFile(entitlementsPath);
// 更新Xcode项目设置
string projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
var pbxProject = new PBXProject();
pbxProject.ReadFromString(File.ReadAllText(projPath));
string targetGuid = pbxProject.GetUnityMainTargetGuid();
pbxProject.AddFileToBuild(targetGuid, pbxProject.AddFile(entitlementsPath, "Unity-iPhone.entitlements", PBXSourceTree.Source));
// 应用修改到Xcode项目文件
File.WriteAllText(projPath, pbxProject.WriteToString());
}
}
}
三、Android 配置
- 需要使用 Unity Custom Main Manifest 配置,即在
Assets/Plugins/Android/AndroidManifest.xml
中配置以下内容:
<manifest>
<application>
<!-- 微信 -->
<!-- 将 {your_package_name} 替换为游戏正确包名,请注意全路径匹配格式,否则可能无法获取分享结果回调 -->
<activity-alias
android:name="{your_package_name}.wxapi.WXEntryActivity"
android:exported="true"
android:targetActivity="com.xd.sharing.mix.bridge.WXShareEntryActivity"/>
<!-- QQ -->
<!-- 将 {在QQ申请的应用ID} 替换为游戏正确的 QQ AppId(同 XDConfig.json 文件中 QQ 的配置),否则可能无法获取分享结果回调 -->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent{在QQ申请的应用ID}" />
</intent-filter>
</activity>
<!-- Facebook -->
<!-- 将 {your_facebook_application_id} 替换为 Facebook Application ID -->
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="{your_facebook_application_id}" />
<provider
android:name="com.facebook.FacebookContentProvider"
android:authorities="com.facebook.app.FacebookContentProvider{your_facebook_application_id}"
android:exported="true" />
</application>
</manifest>
- 因 Android 11 以以上版本系统存储结构的变化,所以为了兼容对应系统的分享,需配置
FileProvider
。 创建 XML 资源文件,存放在Assets/Plugins/Android/res/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=""/>
<external-cache-path
name="."
path="." />
</paths>
- 在项目级别的 AndroidManifest.xml 文件中添加 FileProvider 声明:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<application ... >
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${应用包名}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/{资源文件名称}" />
</provider>
</application>
</manifest>
一、开启插件和添加模块依赖
- 确保开启插件
XDGSharing
- 确保国内或海外开启插件
XDGMainland
或XDGOverseas
(插件包含了分享用到的三方 SDK) ModuleRules
的PrivateDependencyModuleNames
或PublicDependencyModuleNames
添加依赖模块XDGSharing
二、Android 配置
如果项目还没有创建 UPL 文件,则创建。UPL 官方文档
创建 FileProvider XML 资源文件。因 Android 11 以以上版本系统存储结构的变化,所以为了兼容对应系统的分享,需配置 FileProvider。 请参考以下配置进行文件内容撰写,详细可参考链接:
<?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=""/>
<external-cache-path
name="."
path="." />
</paths>在项目 URL 中添加打包拷贝,拷贝到 $S(BuildDir)/res/xml 目录下
<!-- 比如 Demo 中是用的 copyDir 拷贝整个文件夹 -->
<!-- XML 资源文件放在 $S(PluginDir)/Android/res/xml/ 路径下 -->
<resourceCopies>
<copyDir src="$S(PluginDir)/Android/res/" dst="$S(BuildDir)/res/"/>
</resourceCopies>在项目 UPL 中添加 FileProvider 声明
<root xmlns:android="http://schemas.android.com/apk/res/android">
<androidManifestUpdates>
<addElements tag="application">
<!-- 分享相关,targetSdkVersion:30以后必须加 -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="{包名}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/{资源文件名称}" />
</provider>
</addElements>
</androidManifestUpdates>
</root>
三、iOS 配置
如果项目还没有创建 UPL 文件,则创建。UPL 官方文档
在您的 xxx.entitlements 文件中配置 associated-domains 参数以优化分享的体验,不配置的话在部分平台每次分享都会在应用间跳转两次。(该配置域名固定,除非您的 universal link 配置不在该域名下)
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:www.xd.com</string>
</array>在项目 UPL 中添加打包拷贝,拷贝到 $S(BuildDir)/ 目录下
<!-- 比如 Demo 中是用的 copyDir 拷贝整个文件夹 -->
<!-- xxx.entitlements 文件放在 $S(PluginDir)/iOS/app/ 路径下 -->
<resourceCopies>
<copyDir src="$S(PluginDir)/iOS/app/" dst="$S(BuildDir)/"/>
</resourceCopies>在项目 UPL 中添加 Info.plist 的配置
<iosPListUpdates>
<addElements tag="dict" once="true">
<!-- 可选:要把下面的 CFBundleURLSchemes 对应的值配置成自己的参数,第三方 SDK 用,没有可以删除对应配置 -->
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>line</string>
<key>CFBundleURLSchemes</key>
<array>
<string>line3rdp.{bundle_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>facebook</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fb{facebook_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>google</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.{google_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>twitter</string>
<key>CFBundleURLSchemes</key>
<array>
<string>tdsg.twitter.{twitter_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>wechat</string>
<key>CFBundleURLSchemes</key>
<array>
<string>wx{weixin_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>qq</string>
<key>CFBundleURLSchemes</key>
<array>
<string>tencent{qq_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>weibo</string>
<key>CFBundleURLSchemes</key>
<array>
<string>wb{weibo_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>xhs</string>
<key>CFBundleURLSchemes</key>
<array>
<string>xhs{xhs_app_id}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>douyin</string>
<key>CFBundleURLSchemes</key>
<array>
<string>{douyin_app_id}</string>
</array>
</dict>
</array>
<!-- 可选,有就配成游戏参数,不需要可以删除 -->
<key>FacebookAppID</key>
<string>{facebook_app_id}</string>
<!-- 可选,有就配成游戏参数,不需要可以删除 -->
<key>FacebookClientToken</key>
<string>{facebook_client_token}</string>
<!-- 固定值 -->
<key>LSApplicationQueriesSchemes</key>
<array>
<string>sinaweibo</string>
<string>weibosdk</string>
<string>weibosdk2.5</string>
<string>weibosdk3.3</string>
<string>mqqopensdkapiV2</string>
<string>mqq</string>
<string>mqqapi</string>
<string>tim</string>
<string>mqqopensdknopasteboard</string>
<string>weixin</string>
<string>weixinULAPI</string>
<string>weixinURLParamsAPI</string>
<string>fbapi</string>
<string>fb-messenger-share-api</string>
<string>lineauth2</string>
<string>twitterauth</string>
<string>xhsdiscover</string>
<string>douyinopensdk</string>
<string>douyinliteopensdk</string>
<string>douyinsharesdk</string>
<string>snssdk1128</string>
<string>taptap</string>
</array>
<!-- 相册 -->
<key>NSPhotoLibraryUsageDescription</key>
<string>游戏内分享需要使用您的相册保存图片</string>
</addElements>
</iosPListUpdates>