uniapp添加极光推送

Posted 天空中的星~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uniapp添加极光推送相关的知识,希望对你有一定的参考价值。

1.从dcloud插件市场下载极光SDK插件 (可以云打包,也可以离线打包)

 极光JCore官方SDK下载地址

https://ext.dcloud.net.cn/plugin?id=4028https://ext.dcloud.net.cn/plugin?id=4028

极光JPush官方SDK下载地址

极光JPush官方SDK - DCloud 插件市场极光JPush官方SDK HBuilder插件版本https://ext.dcloud.net.cn/plugin?id=4035

下载SDK插件 

云打包:从插件市场点击for打云包,

离线打包:点击离线打包,将SDK下载到本地,在根目录中新建【nativeplugins】文件夹,将下载的文件放在里面

 2.在项目中红配置mainifest.json

(1)本地插件,点击mainifest.json中的【APP原生插件配置】,选择本地插件,点击确定按钮导入,在mainifest.json的源码视图中配置应用包名和AppKey

添加本地插件

 配置JG-JPUSH,设置androidios的应用包名

android_package_name:"包名" 

ios_bundle_id:"包名"

配置JG-JCore ,设置Android和ios的应用包名和极光官网信息的AppKey

android_package_name:"包名"

ios_bundle_id:"包名"

JPUSH_APPKEY_ANDROID:"AppKey"

(2)云端插件配置

点击mainifest.json中的【APP原生插件配置】,选择云端插件,点击确定按钮导入,在mainifest.json的源码视图中配置应用包名和AppKey(跟上述一致)

3.页面代码

 在App.vue中添加以下代码

<script>
const jpushModule = uni.requireNativePlugin('JG-JPush')
	export default 
		onLaunch: function() 
			console.log('App Launch')
			if (uni.getSystemInfoSync().platform == "ios") 
				// 请求定位权限
				let locationServicesEnabled = jpushModule.locationServicesEnabled()
				let locationAuthorizationStatus = jpushModule.getLocationAuthorizationStatus()
				console.log('locationAuthorizationStatus', locationAuthorizationStatus)
				if (locationServicesEnabled == true && locationAuthorizationStatus < 3) 
					jpushModule.requestLocationAuthorization((result) => 
						console.log('定位权限', result.status)
					)
				
				jpushModule.requestNotificationAuthorization((result) => 
					let status = result.status
					if (status < 2) 
						uni.showToast(
							icon: 'none',
							title: '您还没有打开通知权限',
							duration: 3000
						)
					
				)
			

			jpushModule.initJPushService();
			jpushModule.setLoggerEnable(true);
			jpushModule.addConnectEventListener(result => 
				console.log(result)
				let connectEnable = result.connectEnable
				uni.$emit('connectStatusChange', connectEnable)
			);


			jpushModule.addNotificationListener(result => 
				console.log(result)
				if (result.notificationEventType == "notificationOpened") 
				  //点击窗口通知栏推送的消息 跳转指定页面
					uni.navigateTo(
						url: '/pages/home/warningCenter/warningCenter',
						complete(res) 
							console.log(res);
						
					)
				

			);

			jpushModule.addCustomMessageListener(result => 
				let type = result.type
				let messageType = result.messageType
				let content = result.content
				uni.showToast(
					icon: 'none',
					title: JSON.stringify(result),
					duration: 3000
				)
			)

			jpushModule.addLocalNotificationListener(result => 
				let messageID = result.messageID
				let title = result.title
				let content = result.content
				let extras = result.extras
				uni.showToast(
					icon: 'none',
					title: JSON.stringify(result),
					duration: 3000
				)
			)

			jpushModule.addGeofenceListener(result => 
				let code = result.code
				let type = result.type
				let geofenceId = result.geofenceId
				let userInfo = result.userInfo
				uni.showToast(
					icon: 'none',
					title: '触发地理围栏',
					duration: 3000
				)
			)

			jpushModule.setIsAllowedInMessagePop(true)
			jpushModule.pullInMessage(result => 
				let code = result.code
				console.log(code)
			)

			jpushModule.addInMessageListener(result => 
				let eventType = result.eventType
				let messageType = result.messageType
				let content = result.content
				console.log('inMessageListener', eventType, messageType, content)

				uni.showToast(
					icon: 'none',
					title: JSON.stringify(result),
					duration: 3000
				)
			)
		,
		onShow: function() 
			console.log('App Show')
		,
		onHide: function() 
			console.log('App Hide')
		
	
</script>

登录页代码

<script>
	const jpushModule = uni.requireNativePlugin('JG-JPush')
	export default 
		data() 
			return 
				//极光推送
				connectStatus: '未连接',
				registrationID: '未获得',
			
		,
		methods: 
			//点击登录按钮
			login() 
              //登录成功后
                 //设置别名
				jpushModule.setAlias(
						'alias': this.phone,
						'sequence': 1
						)
			,
			connect() 
				uni.$on('connectStatusChange', (connectStatus) => 
					console.log('进入连接')
					var connectStr = ''
					if (connectStatus == true) 
						connectStr = '已连接'
						this.getRegistrationID()
					 else 
						connectStr = '未连接'
					
					console.log('监听到了连接状态变化 --- ', connectStr)
					this.connectStatus = connectStr
				)
			,
			//获取推送ID
			getRegistrationID() 
				jpushModule.getRegistrationID(result => 
					let registerID = result.registerID
					console.log(result)
					this.registrationID = registerID
				)
			
		,
		onLoad() 
			this.connect()
		
	
</script>

极光推送实战感受

最近公司的项目新增一个消息中心的功能,使用的是极光推送,现在项目上线了,分享一下做这个功能的感受。写的不好,希望大家多多指正

第一步: 集成极光SDK

  集成极光文档主要的还是按照极光文档一步步来,导入一些系统框架,添加极光的.a文件和极光头文件,然后在相应的地方添加代码。添加代码极光文档都写的很详细,极光也有案例,可以参考案例

第二步:创建应用,或者appKey

  创建应用需要到登陆自己的极光账号(没有注册一个),到控制台创建一个应用,填写应用相应的信息。其中涉及到开发环境和开发环境的p12文件,这就需要到苹果开发者平台去配置推送证书,我这儿有一个网址 http://jingyan.baidu.com/article/5d6edee20f3ae599eadeec35.html 。 推送证书配置好了下载下来之后,双击会放到钥匙串中,在钥匙串中,选中推送证书右键,就有一个导出的选项,导出之后就是p12文件,这时候就可以选择了。创建完应用之后便可以拿到一个appKey,在程序的didFinishLaunchingWithOptions 集成的极光代码中,需要使用的这个appKey. 此时极光推送也就集成好了,在极光的后台也可以测试推送。 推送是根据程序bundle Id来识别某个app的,所以在极光上创建应用的时候跟配置证书的时候bundle Id 一定要跟程序bundle ID 一致

第三步:点击通知栏进行页面跳转

  推送的目的就是为了增加用户的活跃度,所以推送推到用户手机上之后,点击通知栏应该进行相应的页面跳转。页面跳转就设计到程序内部的了,每一个程序结构和内容都不一样,所以我就不做详细介绍了。我讲解一下我是如何进行页面跳转的吧。 首先后台开发人员会给客户端提供他们推送的数据包含哪些字段,这些字段分别都表示什么,有什么作用。当点击通知栏的时候这些数据会传递过来,这里又分为几种清空。

第一种程序没有杀死,app在后台的时候,并且手机系统为10.0以下的时候,点击通知栏会调用下面这个方法,后台推送的数据会包含在userInfo这个字典当中

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

 

10.0 以上的系统调用下面这个方法,后台推送的数据包含在response.notification.request.content.userInfo里面

 

 

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center

 

 didReceiveNotificationResponse:(UNNotificationResponse *)response

 

          withCompletionHandler:(void (^)())completionHandler

 

 

第二种程序没有杀死,app在前台的时候,这种情况咱就不考虑了,因为app在前台的时候通常是不会进行界面跳转的

 

第三种情况就是程序杀死了,点击通知栏会调用didFinishLaunchingWithOptions 方法,后台推送的数据包含在launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey],launchOptions这个字典的这个UIApplicationLaunchOptionsRemoteNotificationKey字段中

 

我们需要进行界面跳转,以及数据展示,那么就必须把这些数据保存起来,我的做法是定义一个单利模型,用KVC的方式,为模型赋值,将数据保存到单例模型中。然后跳转的话,可以通过通知的方式,在app首页接收通知,一律在首页进行界面跳转,因为首页一定是存在的(app登陆之后到退出的这段时间)。然后实现通知观察者的方法,在根据推送数据模型的数据进行页面跳转。

 

说到这儿,我不得不提出我在开发当中遇到的两个比较严重的问题

1. 页面连续跳转多次

2. 当程序杀死的时候,收到通知,点击通知栏无法进行跳转

 

第一个问题跳转多次的原因是通知观察者没有移除的原因。或许跟我的项目框架有关系,我们的项目框架是从登陆控制器push到tabBar控制器,这样就可能导致退出登陆之后首页控制器没有及时被销毁,然后再次登陆,首页就注册了两个通知观察者,就会导致重复跳转的清空,所以通知观察者一定要记得移除,还有推送数据单利模型的值在退出登陆之后也应该清空

 

第二个问题程序杀死了收不到通知,这就涉及到程序的生命周期了。程序杀死了,收到通知,点击通知栏进入的是didFinishLaunchingWithOptions这个方法,推送的数据也是在这个方法中进行存储的。然后程序启动进入到首页(因为程序杀死了之后一定会进入到首页,所以这里就不发送通知了),在首页我们手动在调一次接收到推送通知后执行的方法进行界面跳转,当然在这个方法中需要做判断,判断单例模型的某一个属性的值是否为空(这个值必须确保有推送的时候一定是不为空的),然后在进行页面跳转。不然的话,即使没有通知,首页进行初始化也进行跳转的话就出问题了。但是!!!!! 这个但是很重要,主动调用接收到通知的方法 这是一定要加的,还要将这个方法放到异步主线程中执行。因为程序杀死之后点击通知栏需要重新初始化首页控制器,而在viewDidLoad调用界面跳转的方法跳转的时候,首页控制器还没有初始化完毕,需要等到viewDidLoad执行完毕之后才能进行跳转,所以要加一个异步主线程,这样才能在程序杀死之后也能进行界面跳转

 

 

 

 

以上是关于uniapp添加极光推送的主要内容,如果未能解决你的问题,请参考以下文章

uniapp中unipush推送的使用

uni-app 使用微信小程序消息推送

uni-app 使用腾讯云im开发app聊天室

unipush 小米厂商推送不好用?

混合开发之uni-app

uniapp支付之微信支付