現在的遊戲裡一般都會有本地訊息,比如每天定時12點或者下午6點告訴玩家進入遊戲領取體力。這種東西沒必要伺服器去推送,用戶端就可以完成。Unity裡面提供了本地任務的功能但是只有IOS上才支援,開始我有點不解為什麼Android上不支援,當我把Android的本地通知做完後,我才明白。IOS源生的API中就支援固定時間迴圈推送,而Android上需要自己開啟一個Services,啟動一個AlarmManager的定時器任務,還好我之前開發過Android, 言歸正傳今天我們先說IOS上的本地通知。
代碼其實很簡單,我先說下原理後面給出實現步驟。
1.當遊戲進入背景時候註冊本地通知
2.當遊戲進入前台的時候關閉本地通知
下面上代碼。 C#
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 |
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 ( ) ; } |