2014年10月26日 星期日

Local Notification介紹

基本設定

請求使用者運允許發送通知
從iOS 8開始,如果打完上面的程式就執行會出現類似下面這樣的錯誤碼

要把下面這段程式加上去,請求使用者允許App發送通知,我們的Local Notification才能正常運作,在iOS 8之前當然也要使用者的同意,不過可能以前是系統自動幫我們問吧,不過就像我常講的,其實我們不太需要知道以前是怎麼樣,反正現在這段程式是一定要寫就對了!

自訂特定的時間
一般fireDate的設定我們都是使用我們既有的資料或是稍微經過dateByAddingTimeInterval之類的處理,如果要完全自訂一個特定的時間的話,可以參考下面的程式碼。你會注意要我只設定了小時跟分鐘,如果想要設定通知是每天固定發出,只要設定小時跟分鐘就可以了。

alertAction
這段程式有個小問題,它可以執行,但我必須要自己去「設定」那裏把alert sytle從Banners改成Alerts,notification才會顯示成alert的形式,我目前還不知道問題出在哪裡,知道的人拜託告訴我~

icon Badge
注意第三行程式,我們也可以讀取目前的IconBadgeNumber做累加的動作

重複

使用自訂的聲音
我沒想到要使用自訂的聲音竟然這麼簡單,只要將想要播放的音檔匯入project中,再如下面的程式碼打就可以了,不過有兩點需要注意:
1音檔的長度不可以超過三十秒,要不然聲音會播不出來,我在Documentation裡沒看到這項規定,是在stackoverflow裡看到這篇回答才知道的,但我確定有這項限制,因為我之前就是卡關在這裡Orz
2音檔只有一些特定的格式可以

在通知中另外夾帶參數(一般是供其它地方的程式辨識用)

取消Local Notification
取消指定的通知
其實沒有一定要用下面的方式來尋找指定的Local Notification,也可以用其他屬性像是fireDate、alertBody...等,只要你能找到你要的特定通知就可以了。另外,雖然可以抓到自己想要的特定通知,但我試過並不能再修改其屬性。

取消全部

按下發送出來的通知後怎麼處理
當App已經沒有在運作

當App已經還在運作(可能在背景或是或是正在使用)


更深入的探討
https://www.facebook.com/groups/iostw/permalink/906779296016087/
https://www.facebook.com/groups/iostw/permalink/934380229922660/
https://www.facebook.com/photo.php?fbid=10202759629864986&set=gm.967383696622313&type=1

用Local Notification實現Alarm
要實作一個Alarm需要做到下面這幾點:
1播放音樂
2在背景執行
3定時
其實上面三點是一句話拆開來講:「在一段時間後在背景播放音樂」
我查了很多資料,發現目前Local Notification是唯一可以完全達到上面要求的方法,但那只是從技術面來看,實際使用的話會遇到兩個問題:
1.1Local Notification的聲音最長只能到三十秒,如果要做的一個鬧鐘的程式,我們絕對不可能讓他只響三十秒,當然我們可以一連排程好幾的Local Notification,可是這樣使用者打開他的iPhone的時候就是看到四五個Notification,這樣的使用者體驗非常差。
1.2我目前想到比較好的方法是:設一連串的Local Notification,只有第一個有設alertBody,後面幾個都設nil,因為我發現如果alertBody設nil,iDevice不會顯示任何東西,但音樂還是會播放。
1.3不過後來經過測試,這樣的UX爛炸了,因為一般我要用自訂的聲音,音檔一般都會像是一首歌之類的,用上面的方法,這首歌每次只會播三十秒就重新播放,越聽只讓我越煩燥而已。
2沒辦法像內建的鬧鐘可以有按鈕讓鬧鐘稍後再播放

我去網路上問,不過看起來應該是無解了Orz