阿里云移动推送+Unity框架最佳实践

Unity是实时3D互动内容创作和运营平台,包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。

随着使用Unity开发的移动应用越来越多,应用类型越来越广泛,移动推送也成为Unity开发的必备功能。但是对于Unity开发者来说,直接使用原生的Android iOS推送SDK,接入比较困难,而且需要修改原生工程,影响Unity的打包流程。为此,我们专门提供了针对Unity的移动推送插件,方便Unity开发者以熟悉方式接入移动推送功能。

环境说明

Unity 2019.4.21f1c1

项目说明

项目地址:下载地址

本项目是一个unity demo项目,Assets/Plugins 目录下为插件代码。

集成操作

1. 安装 Mobile Notifications package

为了避免引入修改导出后的工程,此处我们依赖Mobile Notifications package解决一些通知配置。

参考:https://docs.unity3d.com/Packages/com.unity.mobile.notifications@1.3/manual/index.html

2. 复制 Assets/Plugins 到 unity项目

目前插件直接以文件的方式提供,后续再考虑封装为Unity Package。

3. 启用推送通知

在Unity的IDE中, 选择Edit > Project Settings > Mobile Notifications,在Mobile Notifications页面勾选Enable Push Notifications

4. 其他通用配置

  1. 应用包名或者bundleId配置,需要和推送平台创建的应用一致。

  2. Android启用了Custom Main ManifestCustom Main Gradle TemplateCustom Base Gradle TemplateCustom Proguard File,如果项目有其他地方也需要定制这些文件,请注意合并修改内容。

Android配置

配置推送参数

  1. 在Assets/Plugins/Android/AndroidManifest.xml文件中配置推送的appKey和appSecret。

        <!-- 请填写阿里云的- appKey appSecret -->
        <meta-data
            android:name="com.alibaba.app.appkey"
            android:value="*******" />
        <meta-data
            android:name="com.alibaba.app.appsecret"
            android:value="*******" />

配置华为厂商通道的appId(可选)

        <!-- 华为通道的参数appid -->
        <meta-data
            android:name="com.huawei.hms.client.appid"
            android:value="appid=*******" />

配置小米厂商通道的参数(可选)

        <!-- 小米通道的参数 -->
        <meta-data
            android:name="com.aliyun.ams.push.xiaomi.id"
            android:value="id=*******" />
        <meta-data
            android:name="com.aliyun.ams.push.xiaomi.key"
            android:value="id=*******" />

配置oppo厂商通道的参数(可选)

        <!-- oppo通道的参数 -->
        <meta-data
            android:name="com.aliyun.ams.push.oppo.key"
            android:value="id=*******" />
        <meta-data
            android:name="com.aliyun.ams.push.oppo.secret"
            android:value="id=*******" />

配置vivo厂商通道的参数(可选)

        <!-- vivo通道的参数api_key为appkey -->
        <meta-data
            android:name="com.vivo.push.api_key"
            android:value="*******" />
        <meta-data
            android:name="com.vivo.push.app_id"
            android:value="*******" />

配置魅族厂商通道的参数(可选)

        <!-- 魅族通道的参数 -->
        <meta-data
            android:name="com.aliyun.ams.push.meizu.id"
            android:value="id=*******" />
        <meta-data
            android:name="com.aliyun.ams.push.meizu.secret"
            android:value="id=*******" />
  1. 初始化时配置Notification Channel,具体请参考Manage notification channels

iOS配置

iOS参数通过API设置,不需要修改插件文件。

API

接口类为 Assets/Plugins/PushHelper.cs

调用示例

using Aliyun.Push;

public class ClickHandler : MonoBehaviour
{
    void Start()
    {

#if UNITY_IOS
        PushHelper.Init("******", "********", (result, data) => Log("Init " + result + " " + data));
#elif UNITY_ANDROID
        PushHelper.Init(null, null, (result, data) => Log("Init " + result + " " + data));
#endif
        PushHelper.SetNotificationReceivedCallback((title, content, data) => Log("receive notification " + title + "\n content " + content + "\n data " + data));
        PushHelper.SetMessageReceivedCallback((title, content) => Log("receive message " + title + "\n content " + content));
    }

    public void Register()
    {
        Log("register push");
        PushHelper.Register(this, (result, data) => Log("Register " + result + " " + data));
    }

    public void BindAccount()
    {
        Log("BindAccount");
        PushHelper.BindAccount("account", (result, data) => Log("BindAccount " + result + " " + data));
    }

    public void UnBindAccount()
    {
        Log("UnBindAccount");
        PushHelper.UnBindAccount((result, data) => Log("UnBindAccount " + result + " " + data));
    }

    public void BindTag()
    {
        Log("BindTag");
        PushHelper.BindTag(1, "hello", null, (result, data) => Log("BindAccount " + result + " " + data));
    }

    public void UnBindTag()
    {
        Log("UnBindTag");
        PushHelper.UnBindTag(1, "hello", null, (result, data) => Log("UnBindTag " + result + " " + data));
    }

    public void TagList()
    {
        Log("ListTag");
        PushHelper.ListTag(1, (result, data) => Log("ListTag " + result + " " + data));
    }

    public void BindAlias()
    {
        Log("AddAlias");
        PushHelper.AddAlias("aliasTemp", (result, data) => Log("AddAlias " + result + " " + data));
    }

    public void UnBindAlias()
    {
        Log("RemoveAlias");
        PushHelper.RemoveAlias("aliasTemp", (result, data) => Log("RemoveAlias " + result + " " + data));
    }

    public void AliasList()
    {
        Log("ListAlias");
        PushHelper.ListAlias((result, data) => Log("ListAlias " + result + " " + data));
    }

    public void BindPhone()
    {
        Log("BindPhone");
        PushHelper.BindPhone("12345678901", (result, data) => Log("BindPhone " + result + " " + data));
    }

    public void UnBindPhone()
    {
        Log("UnBindPhone");
        PushHelper.UnBindPhone((result, data) => Log("UnBindPhone " + result + " " + data));
    }

    public void GetDeviceId()
    {
        Log("device id is " + PushHelper.DeviceId());
    }
}

一般接口的回调说明

除了接收通知和消息的回调接口,其他回调一般格式为Action<bool, string>。

  • 第一个参数bool表示此次请求是否成功。

  • 第二个参数string 当成功时,表示获取到的数据,当失败时,表示错误信息。

主要方法如下:

Init 初始化推送

必须先初始化,才能正常使用。

注意

Android的AppKey appSecret 通过manifest配置,此处只对iOS生效。

public static void Init(string appKey, string appSecret, Action<bool, string> callback)

Register 注册推送

在初始化之后,必须先注册推送通道,才能正常使用。

public static void Register(MonoBehaviour mono, Action<bool, string> callback)

BindAccount 绑定业务账号

给设备绑定业务账号,绑定之后可以使用账号进行推送,具体请参考:https://help.aliyun.com/document_detail/195008.html?#title-zzo-xuu-r3o

public static void BindAccount(string account, Action<bool, string> callback)

UnBindAccount 解绑业务账号

解绑业务账号,解绑之后不可以使用账号进行推送,具体请参考:https://help.aliyun.com/document_detail/195008.html?#title-yd6-fa8-u5g

public static void UnBindAccount(Action<bool, string> callback)

BindTag 添加标签

给特定对象添加标签,以便使用标签进行推送,具体参数请参考:https://help.aliyun.com/document_detail/195010.html?#title-l97-wc7-904

public static void BindTag(int target, string tag, string alias, Action<bool, string> callback)

UnBindTag 移除标签

给特定对象移除标签,具体请参考:

https://help.aliyun.com/document_detail/195010.html?#title-9r1-7qq-5s5

public static void UnBindTag(int target, string tag, string alias, Action<bool, string> callback)

ListTag 查询标签

查询标签,具体请参考:

https://help.aliyun.com/document_detail/195010.html?#title-6q7-wn0-66t

public static void ListTag(int target, Action<bool, string> callback)

AddAlias 添加别名

给设备添加别名,以便使用别名进行推送,具体请参考:https://help.aliyun.com/document_detail/195011.html?#title-kjd-ybj-odm

public static void AddAlias(string alias, Action<bool, string> callback)

RemoveAlias 移除别名

移除设备别名,具体请参考:

https://help.aliyun.com/document_detail/195011.html?#title-p9d-rqh-8oc

public static void RemoveAlias(string alias, Action<bool, string> callback)

ListAlias 查询别名

查询设备别名,具体请参考:

https://help.aliyun.com/document_detail/195011.html?#title-buq-5yf-r0i

public static void ListAlias(Action<bool, string> callback)

BindPhone 绑定手机号

给设备绑定手机号,用于推送短信融合方案,具体请参考:

https://help.aliyun.com/document_detail/195014.html?#title-t02-yj2-n12。

注意

iOS暂不支持绑定手机号。

public static void BindPhone(string phoneName, Action<bool, string> callback)

UnBindPhone 解绑手机号

解绑设备手机号,具体请参考:

https://help.aliyun.com/document_detail/195014.html?#title-k21-32f-fay

public static void UnBindPhone(Action<bool, string> callback)

SetNotificationReceivedCallback 设置推送接收回调

当通知到到达时,回调设置的接口。

Action参数分别是通知标题、通知内容、 通知额外数据。

其中通知额外数据,对应推送接口中iOSExtParameters 和 AndroidExtParameters中以data为key的数据。

public static void SetNotificationReceivedCallback(Action<string, string, string> notificationReceivedCallback)

SetMessageReceivedCallback 设置消息接收回调

当消息到达时,回调设置的接口。

Action的参数分别是消息标题和消息内容。

public static void SetMessageReceivedCallback(Action<string, string> messageReceivedCallback)

DeviceId 获取推送设备标识

获取设备标识,可以基于设备进行推送。

public static string DeviceId()