您现在的位置是:首页 >技术交流 >Unity接SDK - 极光推送网站首页技术交流

Unity接SDK - 极光推送

青衫磊落长歌行 2023-05-20 08:00:02
简介Unity接SDK - 极光推送

2021.09.09记录,2023发布,如有不对,还请包含。发晚了

如果想看Android原生接入JPush - SDK,移步Android原生集成JPush SDK_jpush android sdk v4.7.2

极光推送 - 接入

版本:

  •     Unity 2020.3.10f1
  •     JPush - Unity  3.2.0

官方插件:GitHub - jpush/jpush-unity3d-plugin: JPush's officially supported Unity3d plugin (Android & iOS). 极光推送官方支持的 Unity3d 插件(Android & iOS)。

下载Zip压缩包解压,然后把Plugins文件及其子文件全部复制到Unity的Assets下:

先做一件事,打开我们的AndroidManifest文件,然后更改文件内容,把包名全部替换为工程包名,然后替换其中的APPKEY为官网申请相对应软件的APPKEY值。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="包名">
  <!-- Required -->
  <permission
      android:name="包名.permission.JPUSH_MESSAGE"
      android:protectionLevel="signature" />
  <!-- Required  一些系统要求的权限,如访问网络等 -->
  <uses-permission android:name="包名.permission.JPUSH_MESSAGE" />
  <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <!-- Optional for location -->
  <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
  <!-- Android Q后台定位权限 -->
  <uses-permission 
android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
  <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  <uses-permission android:name="android.permission.GET_TASKS" />

  <uses-feature android:glEsVersion="0x00030000" />
  <uses-feature
      android:name="android.hardware.vulkan.version"
      android:required="false" />
  <uses-feature
      android:name="android.hardware.touchscreen"
      android:required="false" />
  <uses-feature
      android:name="android.hardware.touchscreen.multitouch"
      android:required="false" />
  <uses-feature
      android:name="android.hardware.touchscreen.multitouch.distinct"
      android:required="false" />

  <application
      android:allowBackup="false"
      android:label="@string/app_name">
    <activity android:name="包名.MainActivity"></activity>
    <!-- For test only. Demo 的主程序 start -->
    <activity
        android:name="cn.jiguang.unity.push.UnityPluginActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>

      <meta-data
          android:name="android.notch_support"
          android:value="true" />
    </activity>
    <!-- For test only. 测试的主程序 end -->
    <!-- Rich push 核心功能 since 2.0.6 -->
    <activity
        android:name="cn.jpush.android.ui.PopWinActivity"
        android:exported="false"
        android:theme="@style/MyDialogStyle"></activity>
    <!-- Required SDK核心功能 -->
    <activity
        android:name="cn.jpush.android.ui.PushActivity"
        android:configChanges="orientation|keyboardHidden"
        android:exported="false"
        android:theme="@android:style/Theme.NoTitleBar">
      <intent-filter>
        <action android:name="cn.jpush.android.ui.PushActivity" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="包名" />
      </intent-filter>
    </activity>
    <!-- Required SDK 核心功能 -->
    <!-- 可配置android:process参数将PushService放在其他进程中 -->
    <service
        android:name="cn.jpush.android.service.PushService"
        android:exported="false"
        android:process=":pushcore">
      <intent-filter>
        <action android:name="cn.jpush.android.intent.REGISTER" />
        <action android:name="cn.jpush.android.intent.REPORT" />
        <action android:name="cn.jpush.android.intent.PushService" />
        <action android:name="cn.jpush.android.intent.PUSH_TIME" />
      </intent-filter>
    </service>
    <!-- since 3.0.9 Required SDK 核心功能 -->
    <provider
        android:name="cn.jpush.android.service.DataProvider"
        android:authorities="包名.DataProvider"
        android:exported="false"
        android:process=":pushcore" />
    <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 
-->
    <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
    <service
        android:name="cn.jpush.android.service.DaemonService"
        android:enabled="true"
        android:exported="true">
      <intent-filter>
        <action android:name="cn.jpush.android.intent.DaemonService" />

        <category android:name="包名" />
      </intent-filter>
    </service>
    <!-- since 3.1.0 Required SDK 核心功能 -->
    <provider
        android:name="cn.jpush.android.service.DownloadProvider"
        android:authorities="包名.DownloadProvider"
        android:exported="true" />
    <!-- Required SDK核心功能 -->
    <receiver
        android:name="cn.jpush.android.service.PushReceiver"
        android:enabled="true"
        android:exported="false">
      <intent-filter android:priority="1000">
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" 
/>
        <!-- Required  显示通知栏 -->
        <category android:name="包名" />
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.USER_PRESENT" />
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
      </intent-filter>
      <!-- Optional -->
      <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />

        <data android:scheme="package" />
      </intent-filter>
    </receiver>
    <!-- Required SDK核心功能 -->
    <receiver
        android:name="cn.jpush.android.service.AlarmReceiver"
        android:exported="false" />
    <!-- since 3.3.0 接收JPush相关事件 -->
    <receiver android:name="cn.jiguang.unity.push.JPushEventReceiver">
      <intent-filter>
        <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />

        <category android:name="包名"></category>
      </intent-filter>
    </receiver>
    <!-- since 3.3.0 Required SDK核心功能 -->
    <activity
        android:name="cn.jpush.android.service.JNotifyActivity"
        android:exported="true"
        android:taskAffinity="jpush.custom"
        android:theme="@android:style/Theme.Translucent.NoTitleBar">
      <intent-filter>
        <action android:name="cn.jpush.android.intent.JNotifyActivity" />

        <category android:name="包名" />
      </intent-filter>
    </activity>
    <!-- since 3.3.0 Required SDK 核心功能 -->
    <!-- 可配置android:process参数将PushService放在其他进程中 -->
    <!-- User defined.  For test only 继承自cn.jpush.android.service.JCommonService 
-->
    <service
        android:name="cn.jiguang.unity.push.PushService"
        android:process=":pushcore">
      <intent-filter>
        <action android:name="cn.jiguang.user.service.action" />
      </intent-filter>
    </service>
    <!-- Required  . Enable it you can get statistics data with channel -->
    <meta-data
        android:name="JPUSH_CHANNEL"
        android:value="developer-default" />
    <meta-data
        android:name="JPUSH_APPKEY"
        android:value="这里是JPush平台申请的APPKEY" />
    <!-- </>值来自开发者平台取得的AppKey -->
    <meta-data
        android:name="unity.splash-mode"
        android:value="0" />
    <meta-data
        android:name="unity.splash-enable"
        android:value="True" />
    <meta-data
        android:name="android.max_aspect"
        android:value="2.1" />
    <meta-data
        android:name="notch.config"
        android:value="portrait|landscape" />
    <meta-data
        android:name="unity.build-id"
        android:value="380dd5c3-e02d-40fc-babf-8ecc0e24faf6" />
  </application>

</manifest>

还有一个坑记录一下,就是Unity需要设置AndroidManifest为自定模式,然后选择我们更改后的文件,不然打包出来程序启动后,JPush会提示各种问题,总结下来就是一个问题:包名不一致。

 

至此,JPushSKD相关内容已全部放入到Unity


接下来我们要开始写代码,注册事件:

Push官网推荐我们在开发阶段中,在Init前开启调试模式,所以我们调用JPushBinding.SetDebug(true);

 紧接着我们初始化,参数是游戏场景中一个拥有唯一名字的物体,用来接收JPush传递的参数。

接着我们去JPush官网开始推送消息

Unity与原生交互的同学就知道了,原生会通过我们发送的对应物体名字,找到其中函数,在函数被触发后,再次调用Unity相关物体下的对应函数。

using JPush;
using UnityEngine;

public class Routation : MonoBehaviour
{
    void Start()
    {
        JPushBinding.SetDebug(true);
        JPushBinding.Init(this.name);
    }
    // 开发者自己处理由 JPush 推送下来的消息。
    void OnReceiveMessage(string jsonStr)
    {
        Debuger.Log("recv----message-----" + jsonStr);
    }

    /** 接收到的内容格式为如下内容:
    *  {
    *      "msgid":"xxxxxxxxxxxxxxxx"
    *      "extras":
    *      {      
    *          "key1": "value1"
    *          "key2": "value2"
    *      }
    *      "title":"相关标题"
    *      "content":"相关内容"
    *  }      
    *  
    *  我们常用到的函数为:
    *   OnReceiveNotification
    *   OnOpenNotification
    *   
    *   在一些高级应用中,我们会触发其他函数:
    *   OnJPushTagOperateResult
    *   OnJPushAliasOperateResult
    *   OnGetRegistrationId
    *   OnMobileNumberOperatorResult
    */
    void OnReceiveNotification(string jsonStr)
    {
        Debuger.Log("recv---notification---" + jsonStr);
    }

    void OnOpenNotification(string jsonStr)
    {
        Debuger.Log("recv---openNotification---" + jsonStr);
    }

    /// <summary>
    /// JPush 的 tag 操作回调。
    /// </summary>
    /// <param name="result">操作结果,为 json 字符串。</param>
    void OnJPushTagOperateResult(string result)
    {
        Debuger.Log("JPush tag operate result: " + result);
    }

    /// <summary>
    /// JPush 的 alias 操作回调。
    /// </summary>
    /// <param name="result">操作结果,为 json 字符串。</param>
    void OnJPushAliasOperateResult(string result)
    {
        Debuger.Log("JPush alias operate result: " + result);
    }

    void OnGetRegistrationId(string result)
    {
        Debuger.Log("JPush on get registration Id: " + result);
    }

    void OnMobileNumberOperatorResult(string result)
    {
        Debuger.Log("JPush On Mobile Number Operator Result: " + result);
    }
}

接着打包发布,然后查看结果就好。


风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。