现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力。这种东西没必要服务器去推送,客户端就可以完成。Unity里面提供了本地任务的功能但是只有IOS上才支持,开始我有点不解为什么Android上不支持,当我把Android的本地通知做完后,我才明白。IOS源生的API中就支持固定时间循环推送,而Android上需要自己开启一个Services,启动一个AlarmManager的定时器任务,还好我之前开发过Android, 言归正传今天我们先说IOS上的本地通知。
代码其实很简单,我先说下原理后面给出实现步骤。
1.当游戏进入后台的时候注册本地通知
2.当游戏进入前台的时候关闭本地通知
下面上代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { //本地推送 public static void NotificationMessage(string message,int hour ,bool isRepeatDay) { int year = System.DateTime.Now.Year; int month = System.DateTime.Now.Month; int day= System.DateTime.Now.Day; System.DateTime newDate = new System.DateTime(year,month,day,hour,0,0); NotificationMessage(message,newDate,isRepeatDay); } //本地推送 你可以传入一个固定的推送时间 public static void NotificationMessage(string message,System.DateTime newDate,bool isRepeatDay) { //推送时间需要大于当前时间 if(newDate > System.DateTime.Now) { LocalNotification localNotification = new LocalNotification(); localNotification.fireDate =newDate; localNotification.alertBody = message; localNotification.applicationIconBadgeNumber = 1; localNotification.hasAction = true; if(isRepeatDay) { //是否每天定期循环 localNotification.repeatCalendar = CalendarIdentifier.ChineseCalendar; localNotification.repeatInterval = CalendarUnit.Day; } localNotification.soundName = LocalNotification.defaultSoundName; NotificationServices.ScheduleLocalNotification(localNotification); } } void Awake() { //第一次进入游戏的时候清空,有可能用户自己把游戏冲后台杀死,这里强制清空 CleanNotification(); } void OnApplicationPause(bool paused) { //程序进入后台时 if(paused) { //10秒后发送 NotificationMessage("雨松MOMO : 10秒后发送",System.DateTime.Now.AddSeconds(10),false); //每天中午12点推送 NotificationMessage("雨松MOMO : 每天中午12点推送",12,true); } else { //程序从后台进入前台时 CleanNotification(); } } //清空所有本地消息 void CleanNotification() { LocalNotification l = new LocalNotification (); l.applicationIconBadgeNumber = -1; NotificationServices.PresentLocalNotificationNow (l); NotificationServices.CancelAllLocalNotifications (); NotificationServices.ClearLocalNotifications (); } } |
弹出的消息通知。
最后是本工程的下载地址,雨松MOMO祝大家学习愉快。
http://vdisk.weibo.com/s/qDm4IY-bnMQb
- 本文固定链接: https://www.xuanyusong.com/archives/2632
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
大神,这个在切后台后推送收不到服务是什么原因
已经无效了?还是要Xcode怎么设置才会有效?
你做好了吗?
松哥,问一下,自定义 提示声音 怎么做?
坐等android 插件版推送
没有声音提示啊 ~ ~ 默认声音提示了。
unity5.2以上要先注册才能生效
想问一下:我也是类似的办法,但是这个app右上角的小红点一直存在,消除不了
感觉是presentLocalNotificationNow没起作用似的
我也是红点一直存在
最后怎么解决的呢
这个怎么解决的呢
远程推送呢,松大大,求帮助啊~
远程推送 这个就和客户端没关系了 得你们服务器去对接苹果的推送协议了
有一点疑问,以前我们游戏在按下Home键挂在后台的时候,在回到游戏里面去,会按着原来的状态回到,可是加了这个之后,回到游戏变成了重开游戏,跟这个有关系的不,很确定是加了这个之后出的问题。
楼主把android的推送也放出来吧
大神,为什么现在是用不了的呢?unity4.6.3,build后用Xcode发布ios8.2的版本,确认脚本是有执行的,但是在手机上就是无法推送。.是否是在手机上需要开启通知,但是没有从渠道出来的包装在手机上怎么管理?在设置里没办法找到自己安装的那个软件
可以支持ios8以上的设备,不过要在NotificationMessage函数中调用NotificationServices.RegisterForLocalNotificationTypes(LocalNotificationType.Badge | LocalNotificationType.Alert | LocalNotificationType.Sound);。在手机上如果注册成功推送的话,会弹出提示框,让用户选择是否允许通知。至于出的裸包安装到手机上,但是在设置里看不到,还是不知道是什么原因。
谢谢~好在有你的提醒
测试了一下,现在的版本badge的数量要想按每次提醒增加应该:localNotification.applicationIconBadgeNumber = NotificationServices.scheduledLocalNotifications.Length + 1;
进入应用消除badge,在执行完 NotificationServices.PresentLocalNotificationNow(l);需要等一帧才执行NotificationServices.CancelAllLocalNotifications();和NotificationServices.ClearLocalNotifications();要不然消除不了。
还有一点newDate > System.DateTime.Now在创建循环推送最好不要用,因为会出现假如我今天下午3点退出程序,它只会创建3点后的推送,到了第二天原本早上9点是有个推送的,而假如在昨天下午3点到第二天都没打开过程序,所以第二天早上9点的推送就不会出现了。
为毛要等一帧
测试了一下,现在的版本badge的数量要想按每次提醒增加应该:localNotification.applicationIconBadgeNumber = NotificationServices.scheduledLocalNotifications.Length 1;
进入应用消除badge,在执行完 NotificationServices.PresentLocalNotificationNow(l);需要等一帧才执行NotificationServices.CancelAllLocalNotifications();和NotificationServices.ClearLocalNotifications();要不然消除不了。
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { // use registerUserNotificationSettings [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [application registerForRemoteNotifications]; } else { // use registerForRemoteNotifications [application registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)]; } #else // use registerForRemoteNotifications [application registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)]; #endif 在UnityAppController.mm中的 didFinishLaunchingWithOptions函数添加以上代码,就可以收到本地推送了
为啥现在不好使了啊,发布到iOS设备上没反应
大神,我碰到了一个非常奇怪的问题。我用www加载网络图片,在PC和安卓上都是正常的,在IPad上却显示的是红问号白底的图片,图片格式是JGP的,尺寸为512×512的
你的问题解决了么,我现在也碰到了同样的问题。我用www加载网络图片,在PC和安卓上都是正常的,在IPad上却显示的是红问号白底的图片
这个好像是没得到用户允许,
我将这个build后用Xcode发布 iOS7.1,我的unity是4.6.3,发现接受不到本地消息。问一下为何。
升级到最新版本, 记得上一次有个朋友还问过我这个, 后来他升级了就好了。
用新xcode打包ipa 在 ios8系统上 运行 会接收不到 本地推送消息,这个unity 还没有修复吧!我们可以什么修复下吗?
前几天好像有人问过这个问题, 后来他说升级到最新版本的Unity就解决, 了所以你试试升级吧。。
貌似即使启动游戏后调用CleanNotification,应用图标上的数字标记仍然不会清除。。。
没遇到啊。 项目都上线了很正常啊。。
ios8.1.3上会偶现。查了半天不知道什么原因。你查到原因了么
请问大神,有研究过Android本地推送怎么做吗,最近自己搞了个推送插件,基本功能可以实现了。就是不知道,推送服务被用户强行杀掉后,如何重新启动。Android3.0后,强杀应用,此应用就监听不到系统广播了,所以通过监听系统广播的方式,重启也行不通了。求指教~~~@@~!