Unity接SDK - 极光推送

news2024/12/27 11:42:30

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);
    }
}

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


  • 博客杂货铺
  • GoF23 种设计模式的分类和功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux系统安全及应用

目录一、账号安全控制1.1基本安全措施1.1.1系统账号的清理1.1.1.1将非登录用户的Shell设为/sbin/nologin1.1.1.2锁定长期不使用的账号1.1.1.3删除无用账号1.1.1.4锁定账号文件passwd、shadow1.1.2密码安全控制1.1.2.1设置密码有效期1.1.2.2要求用户下次登录时修改密码1.1.3命令…

服务端开发之Java秋招面试11

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧&#xff01; 目录 1.MySQL的多版本并发控制具体实现过程&#xff1f;…

目标检测YOLO系列-YOLOVX运行步骤(推理、训练全过程)

下载项目&#xff1a;点击下载 进入项目根目录&#xff08;通过cd命令&#xff09; apex的安装与下载 下载apex git clone https://github.com/NVIDIA/apex进入apex目录 cd apex执行安装命令 python setup.py install首先安装相关的类库&#xff1a; pip install -i https://p…

深入学习MongoDB---1---入门篇+基础重点篇

MongoDB入门 MongDB作为NoSQL数据库之一&#xff0c;主要关注&#xff1a;灵活性、扩展性、高可用灵活性&#xff1a;NoSQL的特点就是反范式理论&#xff0c;为数据的水平扩展和字段的组织提供了巨大的便利高可用&#xff1a;天生就伴随副本集&#xff08;从节点&#xff09;的…

计数排序的实现

计数排序是非比较排序的一种&#xff0c;是对哈希直接定址法的变形应用&#xff0c;其操作步骤如下&#xff1a; 1.统计相同元素出现的次数。 2.根据统计结果将序列回收到原来的序列中。 拿一组重复元素较多的数组来举例子&#xff1a; 10 11 10 15 14 15…

Disruptor-源码解读

前言 Disruptor的高性能&#xff0c;是多种技术结合以及本身架构的结果。本文主要讲源码&#xff0c;涉及到的相关知识点需要读者自行去了解&#xff0c;以下列出&#xff1a; 锁和CAS伪共享和缓存行volatile和内存屏障 原理 此节结合demo来看更容易理解&#xff1a;传送门…

数云融合|新手入门,5分钟秒懂开源

目录一、开源软件开源领域的两大组织&#xff1a;FSF和OSI二、开源许可证开源意味着免费吗&#xff1f;三、开源技术应用领域四、总结一、开源软件 开源即开放源代码&#xff0c;他的核心是源代码公开&#xff0c;任何人都可以查看、使用、修改和分发。与之相对的是闭源&#…

js排序算法

排序算法 - jsjs交换两个值的三种方法方式1&#xff1a;算术运算方式2&#xff1a;ES6解构方式3&#xff1a;数组的特性冒泡排序实现思路图解bubbleSort参考视频选择排序实现思路图解selectionSort参考视频插入排序实现思路图解insertionSort参考视频js交换两个值的三种方法 方…

javaSccript---call()、 bind()、 apply()的区别

call()、apply()、bind() 都是用来重定义 this 这个对象的 语法&#xff1a; function.apply(thisArg, [argsArray])//argsArray 是一个可选的数组 function.call(thisArg, arg1, arg2, ...)//arg1、arg2、... 是将传递给函数的参数列表 function.bind(thisArg, arg1, arg2, ..…

Webstorm是什么软件?你了解吗

WebStorm 是一款由 JetBrains 开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它是专门为开发 Web 应用程序而设计的。它提供了许多功能&#xff0c;例如代码自动完成、错误突出显示、重构、调试、版本控制等&#xff0c;可以帮助开发人员提高效率和代码质量。WebS…

Vector 高性能日志收集工具

文章目录Vector 简介相关概念事件Data modelEvent typesLog eventsMetric eventsTraces组件构成源转换接收器PipelineBuffersBackpressureRolesAgentDaemonSidecarAggregatorTopology分布式集中式基于流Vector 简介 Vector 是一种高性能的可观察性数据管道&#xff0c;可让组织…

天梯赛练习集-L1-031到L1-040–python - java

文章目录PythonL1-031 到底是不是太胖了L1-032 Left-padL1-033 出生年L1-034 点赞L1-035 情人节L1-036 A乘以BL1-037 A除以BL1-038 新世界L1-039 古风排版L1-040 最佳情侣身高差JavaL1-031 到底是不是太胖了L1-032 Left-padL1-033 出生年L1-034 点赞L1-035 情人节L1-036 A乘以B…

ChatGPT入门必知必会

2023年是真正意义上的AI之年&#xff0c;因为ChatGPT 2007年&#xff0c;iPhone开启了智能手机时代&#xff0c;2023年&#xff0c;我们迎来了人工智能时代&#xff0c;我们正处于历史的大转折点上&#xff0c;这也许是启蒙运动级别的思想和社会转折&#xff0c;工业革命级别的…

5万元内最经济双卡4090深度学习方案

深度学习双卡4090攒机方案 znsoft 一枚快乐的炼丹师 AMD 7950x 双4090方案 不到5万&#xff0c;目前最经济的双卡人工智能服务器方案 主板&#xff1a; 华硕 x670EA 吹雪 3000元 CPU: amd 7950x 3500元 内存&#xff1a; 32G4 128G DDR5 800x4 3200元 机箱&#xff1a; 追…

【eMMC学习记录】emmc相关名词解释和基础概念

名词解释 NAND Flash:半导体闪存 HDD&#xff1a;机械硬盘 FW:固件 Peak Power:峰值功率 Active Power:读写功耗 Idle Power:空闲功耗 standby/sleep Power Dev Sleep Power:SSD内部休眠功耗 RAM:掉电丢失数据 FGT:浮栅晶体管 FormFactor:尺寸标准件 AFA:全闪存整列…

线段树之延迟数组_20230410

线段树 之 延迟数组 前言 线段树是一类特殊的完全二叉树&#xff0c;其本质是对递归过程信息的再处理和再记忆&#xff0c;线段树构造完成后&#xff0c;可以脱离原始数组或线性表&#xff0c;直接对线段树进行查询或更新操作即可。线段树的储存结构和堆结构类似&#xff0c;…

springboot——集成elasticsearch进行搜索并高亮关键词

目录 1.elasticsearch概述 3.springboot集成elasticsearch 4.实现搜索并高亮关键词 1.elasticsearch概述 &#xff08;1&#xff09;是什么&#xff1a; Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。 Lucene 可以被认为是迄今为止最先进、性能最好的…

软测界的黑科技,难道不来瞧瞧?

写在前面&#xff1a; 在当今互联网时代&#xff0c;软件已经渗透到了人们生活的方方面面&#xff0c;各种类型的软件应运而生&#xff0c;为人们的工作和生活提供了更便捷的服务。然而&#xff0c;随着软件的不断增长和复杂性的不断提高&#xff0c;软件测试变得越来越重要。…

字节跳动AI-LAB | 算法三轮技术面分享

作者 | 太蔡了整理 | NewBeeNLP面试锦囊之面经分享系列&#xff0c;持续更新中 可以后台回复"面试"加入交流讨论组噢写在前面楼主是C9末流渣硕一枚&#xff0c;现在已经正式确定offer要去我宇宙条了&#xff01;当时为了准备面试几乎把网上头条的面经翻了个底朝天&am…

php(phar)反序列化漏洞及各种绕过姿势

概念&#xff1a; 序列化其实就是将数据转化成一种可逆的数据结构&#xff0c;自然&#xff0c;逆向的过程就叫做反序列化。简单来说就是我在一个地方构造了一个类&#xff0c;但我要在另一个地方去使用它&#xff0c;那怎么传过去呢&#xff1f;于是就想到了序列化这种东西&a…