欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

本地推送通知UserNotifications在Swift中的實(shí)現(xiàn)方式

 更新時(shí)間:2021年04月27日 10:10:40   作者:GarveyCalvin  
這篇文章主要介紹了本地推送通知UserNotifications在Swift中的實(shí)現(xiàn)方式,想了解消息推送的同學(xué),一定要看一下

簡(jiǎn)介

消息推送相信在很多人的眼里都不陌生了吧?像即時(shí)聊天微信,好友發(fā)信息給你時(shí)會(huì)在頂部彈下小窗口提醒你。也像是在影院APP預(yù)訂了電影票,在開(kāi)場(chǎng)前一小時(shí)你也會(huì)收到提醒。這類推送是需要經(jīng)過(guò)后端發(fā)送請(qǐng)求的,需要服務(wù)器發(fā)送推送請(qǐng)求,又或者使用如極光推送等第三方渠道。

那么如果我們的APP不需要連網(wǎng)呢?這是不是就不能使用消息推送了?不是的,蘋(píng)果還提供給我們本地消息通知服務(wù),即便APP不連網(wǎng)也能使用,功能也很強(qiáng)大可靠。本地時(shí)鐘的應(yīng)用場(chǎng)景很廣泛,例如手機(jī)上的時(shí)鐘、日歷等。

那么你知道如何去實(shí)現(xiàn)它嗎?這篇文章將告知你答案,同時(shí)以兩個(gè)小案例作為例子,以便更好地去理解它。

筆者環(huán)境

Xcode - Version 11.5 (11E608c)

Swift - version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53).

權(quán)限獲取

UserNotifications 是 iOS10 推出來(lái)的框架,因此你只能在 10 或以上的版本使用它。推送服務(wù)和以往一樣,也是需要用戶授權(quán)的,當(dāng)用戶同意后才能正常注冊(cè)消息通知,當(dāng)用戶拒絕時(shí)應(yīng)該引導(dǎo)用戶去打開(kāi)APP的通知權(quán)限。利用requestAuthorization方法彈出并獲取通知權(quán)限,接收的參數(shù)options是具體的授權(quán)選項(xiàng),一般有彈窗、未讀數(shù)量圖標(biāo)和聲音即可,并在回調(diào)閉包中可以獲取授權(quán)結(jié)果和錯(cuò)誤。

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (status, err) in
    if !status {
    		print("用戶不同意授權(quán)通知權(quán)限")
        return
    }
}

status 為布爾類型,true 表示用戶同意,false 即拒絕。在此種情況下,我們可以使用彈窗去引導(dǎo)用戶去打開(kāi)通知權(quán)限,需要明確告知用戶打開(kāi)后有什么好處,如果關(guān)閉會(huì)造成什么影響等等。如果讓用戶手動(dòng)打開(kāi)設(shè)置,找到APP,為APP開(kāi)啟權(quán)限,這樣未免太過(guò)復(fù)雜,所幸的是可以通過(guò)以下代碼為用戶直接跳轉(zhuǎn)至該應(yīng)用的權(quán)限設(shè)置中心。

guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, completionHandler: nil)
}

應(yīng)彈窗提示用戶,待用戶同意后才跳轉(zhuǎn)至設(shè)置,不然容易引起用戶的不滿心理。

觸發(fā)器

本地消息通知一般有以下三種類型的觸發(fā)器,它們都是繼承于類UNNotificationTrigger:

  • UNTimeIntervalNotificationTrigger - 在經(jīng)過(guò)特定的時(shí)間后觸發(fā)本地消息推送;
  • UNCalendarNotificationTrigger - 在特定的時(shí)間點(diǎn)觸發(fā)本地消息推送;
  • UNLocationNotificationTrigger - 在進(jìn)入或離開(kāi)特定的地理位置時(shí)觸發(fā)本地消息推送。

UNTimeIntervalNotificationTrigger

手機(jī)上的時(shí)鐘用過(guò)吧,里面的計(jì)時(shí)器功能就可以用UNTimeIntervalNotificationTrigger實(shí)現(xiàn),比如開(kāi)始計(jì)時(shí)30分鐘,那么在計(jì)時(shí)器完成的時(shí)候就是使用通知提醒。

那么設(shè)置在經(jīng)過(guò)特定的時(shí)間后觸發(fā)本地消息推送,一般都經(jīng)由以下幾個(gè)步驟:

  • 首先創(chuàng)建UNMutableNotificationContent類,設(shè)定標(biāo)題和內(nèi)容,如果你有子標(biāo)題還可以設(shè)置子標(biāo)題,一般很少見(jiàn)到會(huì)設(shè)置子標(biāo)題的應(yīng)用。
  • 創(chuàng)建觸發(fā)器,這里就是UNTimeIntervalNotificationTrigger,設(shè)定執(zhí)行秒數(shù)和是否循環(huán)通知。
  • 創(chuàng)建通知請(qǐng)求UNNotificationRequest,這里需要指定通知的identifier,內(nèi)容和觸發(fā)器,至于identifier,你可以隨意定義。
  • 最后將通知請(qǐng)求添加到系統(tǒng)的通知中心UNUserNotificationCenter即可。

例子,創(chuàng)建一個(gè)通知,在5秒后執(zhí)行消息推送。實(shí)例代碼展示如下:

let content = UNMutableNotificationContent()
content.title = "添加朋友 對(duì)著月亮敲代碼"
//content.subtitle = "子標(biāo)題"
content.body = "公眾號(hào) gh_6a83a7c19315"
content.badge = 1

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
let request = UNNotificationRequest(identifier: "Notification", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { err in
    err != nil ? print("添加本地通知錯(cuò)誤", err!.localizedDescription) : print("添加本地通知成功")
}

有一處小 Tips,UNTimeIntervalNotificationTrigger創(chuàng)建時(shí)的repeats選項(xiàng),如果你設(shè)定為循環(huán)通知時(shí),即需要每隔N秒觸發(fā)一次通知,那么你必須至少設(shè)置為60秒的時(shí)間間隔,如若低于60秒,你將會(huì)得到這樣一條錯(cuò)誤。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'time interval must be at least 60 if repeating' *** First throw call stack: ( 0 CoreFoundation 0x00007fff23c7127e __exceptionPreprocess + 350 1 libobjc.A.dylib 0x00007fff513fbb20 objc_exception_throw + 48 2 CoreFoundation 0x00007fff23c70ff8 +[NSException raise:format:arguments:] + 88 3 Foundation 0x00007fff256e9b51 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 191 4 UserNotifications 0x00007fff2c7dfc7c -[UNTimeIntervalNotificationTrigger _initWithTimeInterval:repeats:] + 277

UNCalendarNotificationTrigger

手機(jī)上的日歷用過(guò)吧,在新建日程的時(shí)候,你可以選擇一個(gè)提醒時(shí)間,這樣它就會(huì)在你設(shè)定的提醒時(shí)間提醒你,這種情況就很適合用UNCalendarNotificationTrigger去實(shí)現(xiàn)。

舉個(gè)例子,我們要在每晚7點(diǎn)提醒用戶看公眾號(hào)。

let content = UNMutableNotificationContent()
content.title = "添加朋友 對(duì)著月亮敲代碼"
//content.subtitle = "子標(biāo)題"
content.body = "公眾號(hào) gh_6a83a7c19315"
content.badge = 1

let dateComponents = DateComponents(hour: 19) // 1
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true) // 2
let request = UNNotificationRequest(identifier: "Notification", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { err in
    err != nil ? print("添加本地通知錯(cuò)誤", err!.localizedDescription) : print("添加本地通知成功")
}

1 - 創(chuàng)建時(shí)間元件,19點(diǎn)即為晚上7點(diǎn)

2 - 創(chuàng)建UNCalendarNotificationTrigger對(duì)象,并將dateComponents賦值到dateMatching,repeats為true,重復(fù)在每天19點(diǎn)收到通知提醒。

UNLocationNotificationTrigger

這個(gè)觸發(fā)器不在此篇文章講述,留給你們自己去實(shí)現(xiàn)和測(cè)試結(jié)果。

圖標(biāo)

還記得剛剛設(shè)置的屬性badge嗎,我們?cè)O(shè)置值為1,這意味著在iPhone桌面上的應(yīng)用圖標(biāo)在收到通知時(shí),右上角圓點(diǎn)內(nèi)所展示的數(shù)字就是badge的值。

這個(gè)屬性值是applicationIconBadgeNumber,它是UIApplication的屬性,設(shè)置為0即為隱藏,默認(rèn)也是0。

UIApplication.shared.applicationIconBadgeNumber = 0

消息推送回調(diào)代理

接收用戶對(duì)消息推送的反饋事件,比如說(shuō)應(yīng)用在后臺(tái)收到了通知,用戶點(diǎn)擊了這條通知進(jìn)入到了APP里面,我們需要獲取這個(gè)事件去做一些處理,比如跳去某個(gè)界面,這里例子不講這么復(fù)雜,只通過(guò)簡(jiǎn)單地判斷用戶是通過(guò)哪個(gè)通知進(jìn)來(lái)的。

接收回調(diào)代理事件前,需要遵循UNUserNotificationCenterDelegate協(xié)議,并設(shè)置delegate接收的對(duì)象。

xtension AppDelegate: UNUserNotificationCenterDelegate {}

UNUserNotificationCenter.current().delegate = self

在Swift語(yǔ)言中,可以通過(guò)extension擴(kuò)展類遵循的協(xié)議,并在extension。

當(dāng)應(yīng)用在前臺(tái)運(yùn)行時(shí),收到的是這個(gè)-userNotificationCenter:willPresentNotification:withCompletionHandler:代理方法。UNNotification對(duì)象存儲(chǔ)了傳遞到應(yīng)用的一些數(shù)據(jù),通過(guò)此對(duì)象可以拿到此條通知關(guān)聯(lián)的觸發(fā)器notification.request.trigger,從而判斷其類型。

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    guard let trigger = notification.request.trigger else { return; }
    if trigger.isKind(of: UNTimeIntervalNotificationTrigger.classForCoder()) {
        print("Notification did receive, Is class UNTimeIntervalNotificationTrigger")
    } else if trigger.isKind(of: UNCalendarNotificationTrigger.classForCoder()) {
        print("Notification did receive, Is class UNCalendarNotificationTrigger")
    }
}

當(dāng)應(yīng)用在后臺(tái),或者被殺死的狀態(tài)下,收到的是這個(gè)-userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:代理方法。此方法接收UNNotificationResponse類型的參數(shù),它里面包含notification屬性,因此可以參考上面的代碼進(jìn)行觸發(fā)器的判斷。

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    guard let trigger = response.notification.request.trigger else { return; }
    if trigger.isKind(of: UNTimeIntervalNotificationTrigger.classForCoder()) {
        print("Notification did receive, Is class UNTimeIntervalNotificationTrigger")
    } else if trigger.isKind(of: UNCalendarNotificationTrigger.classForCoder()) {
        print("Notification did receive, Is class UNCalendarNotificationTrigger")
    }
}

總結(jié)

本地通知有三種類型的觸發(fā)器,分別是UNTimeIntervalNotificationTrigger、UNCalendarNotificationTrigger和UNLocationNotificationTrigger。

UNTimeIntervalNotificationTrigger在設(shè)置循環(huán)通知時(shí),所設(shè)定的時(shí)間隔不能低于60秒,否則會(huì)報(bào)運(yùn)行時(shí)錯(cuò)誤。

Demo 源碼下載

我已經(jīng)把 Demo 上傳至 GitHub 上面,項(xiàng)目名字是 SwiftUI-Tutorials,https://github.com/GarveyCalvin/SwiftUI-Tutorials,目錄名為GCLocalUserNotification,有需要的朋友可以去下載運(yùn)行一下,當(dāng)然你也可以跟著文章去做一遍,這樣更有利于你掌握此方面的知識(shí)。

以上就是本地推送通知UserNotifications在Swift中的實(shí)現(xiàn)方式的詳細(xì)內(nèi)容,更多關(guān)于Swift推送的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Swift下使用UICollectionView 實(shí)現(xiàn)長(zhǎng)按拖拽功能

    Swift下使用UICollectionView 實(shí)現(xiàn)長(zhǎng)按拖拽功能

    拖拽排序是新聞?lì)惖腁pp可以說(shuō)是必有的交互設(shè)計(jì),如今日頭條,網(wǎng)易新聞等。這篇文章主要介紹了Swift下使用UICollectionView 長(zhǎng)按拖拽功能,需要的朋友可以參考下
    2017-03-03
  • Swift教程之方法詳解

    Swift教程之方法詳解

    這篇文章主要介紹了Swift教程之方法詳解,方法是關(guān)聯(lián)到一個(gè)特定類型的函數(shù),類、結(jié)構(gòu)、枚舉所有可以定義實(shí)例方法,封裝特定任務(wù)和功能處理給定類型的一個(gè)實(shí)例,需要的朋友可以參考下
    2015-01-01
  • Swift免費(fèi)短信驗(yàn)證碼實(shí)現(xiàn)及動(dòng)態(tài)倒計(jì)時(shí)功能

    Swift免費(fèi)短信驗(yàn)證碼實(shí)現(xiàn)及動(dòng)態(tài)倒計(jì)時(shí)功能

    這篇文章主要介紹了Swift免費(fèi)短信驗(yàn)證碼實(shí)現(xiàn)及動(dòng)態(tài)倒計(jì)時(shí)功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • Swift如何優(yōu)雅的進(jìn)行解包

    Swift如何優(yōu)雅的進(jìn)行解包

    這篇文章主要介紹了Swift優(yōu)雅的進(jìn)行解包,對(duì)swift感興趣的同學(xué),可以參考下
    2021-04-04
  • swift guard關(guān)鍵字詳解及使用

    swift guard關(guān)鍵字詳解及使用

    這篇文章主要介紹了swift guard關(guān)鍵字詳解及使用的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Swift利用CoreData如何存儲(chǔ)多種數(shù)據(jù)類的通訊錄

    Swift利用CoreData如何存儲(chǔ)多種數(shù)據(jù)類的通訊錄

    這篇文章主要給大家介紹了關(guān)于Swift利用CoreData如何存儲(chǔ)多種數(shù)據(jù)類的通訊錄的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • swift實(shí)現(xiàn)隨機(jī)背景色

    swift實(shí)現(xiàn)隨機(jī)背景色

    這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)隨機(jī)背景色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift調(diào)用Objective-C代碼

    Swift調(diào)用Objective-C代碼

    目前Swift語(yǔ)言所編寫(xiě)的應(yīng)用才剛剛可以使用Xcode 6 GM版本提交,而Objective-C作為蘋(píng)果的主開(kāi)發(fā)語(yǔ)言存在了很多年了。目前尚無(wú)成熟的Swift庫(kù)可用,所以當(dāng)前編寫(xiě)應(yīng)用可以說(shuō)基本離不開(kāi)調(diào)用Objective-C代碼的情況。
    2014-09-09
  • Swift仿微信語(yǔ)音通話最小化時(shí)后的效果實(shí)例代碼

    Swift仿微信語(yǔ)音通話最小化時(shí)后的效果實(shí)例代碼

    這篇文章主要介紹了Swift仿微信語(yǔ)音通話最小化時(shí)后的效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Swift?Package?技巧及混編兼容問(wèn)題詳解

    Swift?Package?技巧及混編兼容問(wèn)題詳解

    這篇文章主要為大家介紹了Swift?Package?技巧及混編兼容問(wèn)題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論