开发指南
准备工作
接入前请联系平台同事确认 XDConfig.json 的最新参数。
对应平台的接入准备请参考 接入细节。
【必须】一、打开推送权限
iOS 上接入推送模块,必须每次启动后都使用该接口打开推送权限,否则可能无法收到推送,请在合适的时机调用该接口。
如果是首次调用系统会展示相应的权限框让用户自行选择是否打开推送,用户选择打开才能收到推送,如果选择关闭则无法收到。用户选择后游戏内再调用该接口不会再提示用户。
Android 从版本 13 开始需要通过代码打开推送权限,可以参考下述代码示例。Android 13 以下没有主动打开推送权限的方式,且根据厂商可能有不同表现,包括但不限于默认关闭。
- Android
- iOS
- Unity
- UE
请参考 在 Android 13 及更高版本上请求运行时通知权限。
从 v6.28.0 开始 Android 新增辅助请求通知权限的接口,使用该接口可以在 Android 13 及更高版本上请求运行时通知权限,低于 Android 13 的版本默认有通知权限。
// PushActivity.java
import com.xd.intl.common.base.XDGError;
import com.xd.intl.common.callback.Callback;
import com.xd.sdk.push.XDGPush;
private void requestPushPermission() {
XDGPush.requestPermission(PushActivity.this, new Callback<Boolean>() {
@Override
public void onCallback(Boolean aBoolean, XDGError xdgError) {
if (aBoolean) {
Log.i("Push permission granted");
} else {
Log.e("Error requesting push permission: " + xdgError == null ? "unknown error" : xdgError.getMessage());
}
}
});
}
[XDGPush registerPushWithHandler:^(BOOL success) {
if (success) {
// 推送打开
} else {
// 推送关闭,可以根据需求引导用户去设置中开启推送
}
}];
XDGPush.RequestPermission(granted =>
{
if (granted) {
// 推送打开
} else {
// 推送关闭,可以根据需求引导用户去设置中开启推送
}
});
v6.28.0 新增统一的支持 Android、iOS 的权限申请接口
FXDGPush::RequestPushPermission(FXDGPush::FPermissionRequestDelegate::CreateLambda([Printer, this](bool bEnable)
{
if (bEnable) {
// 推送打开
} else {
// 推送关闭,可以根据需求引导用户去设置中开启推送
}
}));
v6.28.0 之前只支持 iOS 的权限申请接口
#if PLATFORM_IOS
FXDGPush::RegisterPushWithHandler(FXDGPush::FHandlerRegisteredDelegate::CreateLambda([Printer, this](bool success)
{
if (success) {
// 推送打开
} else {
// 推送关闭,可以根据需求引导用户去设置中开启推送
}
}));
#elif PLATFORM_ANDROID
TArray<FString> AndroidPermission;
AndroidPermission.Add(TEXT("android.permission.POST_NOTIFICATIONS"));
UAndroidPermissionFunctionLibrary::AcquirePermissions(AndroidPermission);
#endif
【可选】二、设置推送回调,获取推送内容
如果游戏想获取玩家收到的推送内容,可以设置全局回调,在用户点击推送时会触发回调返回推送内容。
- Android
- iOS
- Unity
- UE
// PushActivity.java
import androidx.annotation.Nullable;
import com.xd.sdk.push.XDGPush;
import com.xd.sdk.push.callback.XDGPushCallback;
import java.util.Map;
// ...
private void setPushCallback() {
XDGPush.setPushCallback(new XDGPushCallback() {
@Override
public void onOpened(@Nullable String title, @Nullable String body, @Nullable Map<String, String> extraMap) {
/*
* title 推送通知标题
* body 推送通知内容
* extraMap 推送通知额外参数,当是国内环境是,会包含阿里云推送自带的参数:
* _ALIYUN_NOTIFICATION_ID_:通知 ID
* _ALIYUN_NOTIFICATION_PRIORITY_:通知优先级
*/
}
});
}
[XDGPush setPushHandler:^(NSString * _Nullable title, NSString * _Nullable body, NSDictionary * _Nullable extra) {
// title 推送标题
// body 推送内容
// extra 推送完整数据,可在此获取自定义数据
}];
XDGPush.SetPushCallback(pushData =>
{
if (pushData != null)
{
SetResultText("收到推送消息: " + JsonConvert.SerializeObject(pushData, Formatting.Indented));
}
else
{
SetResultText("收到推送消息: NULL");
}
});
// 3. 注册推送内容回调,在用户点击推送后调用
FXDGPush::SetPushHandler(FXDGPush::FPushHandlerDelegate::CreateLambda([Printer, this](const FString& Title,const FString& Body,const TSharedPtr<FJsonObject>& Extra)
{
// Title 推送标题
// Body 推送内容
// Extra 推送完整数据,可在此获取自定义数据
}));
【可选】三、获取打开应用前点击的通知内容
如果是在应用未启动时从通知打开的应用想获取推送数据,因为此时推送回调还未设置,无法收到回调,可以使用如下接口获取
- Android
- iOS
- Unity
- UE
// PushActivity.java
import com.xd.sdk.push.XDGPush;
import java.util.Map;
// ...
private void getLatestPushData() {
Map<String, String> latestPushData = XDGPush.getLatestPushData();
if (latestPushData != null) {
String title = latestPushData.get("title"); // title
String summary = latestPushData.get("summary"); // summary
String extraMapStr = latestPushData.get("extraMap"); // extraMap 的 JSON 字符串
// ...
}
}
NSDictionary *pushData = [XDGPush getLatestPushData];
NSString *title = [pushData valueForKey:@"title"];
NSString *body = [pushData valueForKey:@"body"];
NSDictionary *extra = [pushData valueForKey:@"extra"];
var latestPushData = XDGPush.GetLatestPushData();
TSharedPtr<FJsonObject> PushData = FXDGPush::GetLatestPushData();
FString Title = PushData->GetStringField(TEXT("title"));
FString Body = PushData->GetStringField(TEXT("body"));
TSharedPtr<FJsonObject> Extra = PushData->GetObjectField(TEXT("extra"));