Sound/播放提示音, Haptics/触觉反馈, LocalNotification/本地通知 的使用

news2024/12/26 22:22:58

1. Sound 播放提示音

  1.1 音频文件:  tada.mp3, badum.mp3

  1.2 文件位置截图:

  1.3 实现

import AVKit

/// 音频管理器
class SoundManager{
    // 单例对象 Singleton
    static let instance = SoundManager()
    // 音频播放
    var player: AVAudioPlayer?
    
    enum SoundOption: String{
        case tada
        case badum
    }
    
    func playSound(sound: SoundOption){
        // 获取 url
        guard let url =  Bundle.main.url(forResource: sound.rawValue, withExtension: ".mp3") else { return }
        do{
            player = try AVAudioPlayer(contentsOf: url)
            player?.play()
        }catch let error{
            // 打印错误
            print("Error playing sound. \(error.localizedDescription)")
        }
        
    }
}

/// 提示音
struct SoundsBootcamp: View {
    var soundManager = SoundManager()
    
    var body: some View {
        
        VStack(spacing: 40) {
            Button("Play sound 1") {
                SoundManager.instance.playSound(sound: .tada)
            }
            
            Button("Play sound 2") {
                SoundManager.instance.playSound(sound: .badum)
            }
        }
    }
}

2. Haptics 触觉反馈与通知

  2.1 实现

/// 触觉管理器
class HapticManager{
    static let instance = HapticManager()
    
    // 通知
    func notification(type: UINotificationFeedbackGenerator.FeedbackType){
        let generator = UINotificationFeedbackGenerator()
        generator.notificationOccurred(type)
    }
    
    func impact(style: UIImpactFeedbackGenerator.FeedbackStyle){
        // 反馈生成器
        let generator = UIImpactFeedbackGenerator(style: style)
        generator.impactOccurred()
    }
}

/// 触觉反馈与通知
struct HapticsBootcamp: View {
    var body: some View {
        VStack(spacing: 20) {
            Button("Success") { HapticManager.instance.notification(type: .success) }
            Button("Warning") { HapticManager.instance.notification(type: .warning) }
            Button("Error") { HapticManager.instance.notification(type: .error) }
            Divider()
            Button("Soft") { HapticManager.instance.impact(style: .soft) }
            Button("Light") { HapticManager.instance.impact(style: .light) }
            Button("Medium") { HapticManager.instance.impact(style: .medium) }
            Button("Rigid") { HapticManager.instance.impact(style: .rigid) }
            Button("Heavy") { HapticManager.instance.impact(style: .heavy) }
        }
    }
}

3. LocalNotification 本地通知

  3.1 实现

import UserNotifications
import CoreLocation

/// 通知管理类
class NotificationManager{
    // 单例
    static let instance = NotificationManager() // Singleton
    
    // 请求权限
    func requestAuthorization(){
        //
        let options: UNAuthorizationOptions = [.alert, .sound, .badge]
        UNUserNotificationCenter.current().requestAuthorization(options: options) { success, error in
            if let error = error {
                print("ERROR:\(error)")
            }else{
                print("Success:\(success)")
            }
        }
    }
    
    /// 加入一个通知
    func scheduleNotification(){
        let content = UNMutableNotificationContent()
        content.title = "This is my first notification!"
        content.subtitle = "This is was so easy!"
        content.sound = .default
        content.badge = 1
        
        // time 计时器通知
         let trigger = timeNotification()
        
        // calendar 日历通知
        // let trigger = calendarNotification()
        
        // location 位置通知
        //let trigger = locationNotificationTrigger()
   
        // 通知请求
        let request = UNNotificationRequest(
            identifier: UUID().uuidString,
            content: content,
            // 触发器
            trigger: trigger)
        // 当前通知中心,添加一个通知
        UNUserNotificationCenter.current().add(request)
    }

    /// 取消通知
    func cancelNotification(){
        UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
        UNUserNotificationCenter.current().removeAllDeliveredNotifications()
    }
    
    /// 位置通知
    func locationNotificationTrigger()-> UNNotificationTrigger{
        // 经纬度
        let coordinates = CLLocationCoordinate2D(
            latitude: 40.00,
            longitude: 50.00)
        // 区域 radius: 半径,以米为单位
        let region = CLCircularRegion(
            center: coordinates,
            radius: 100,
            identifier: UUID().uuidString)
        region.notifyOnEntry = true; // 进入
        region.notifyOnExit = true;  // 退出
        return UNLocationNotificationTrigger(region: region, repeats: true)
    }
    
    /// 日历通知
    func calendarNotification() -> UNNotificationTrigger{
        // calendar
        var dateComponents = DateComponents()
        dateComponents.hour = 16
        dateComponents.minute = 52
        dateComponents.weekday = 2 // 2: 星期一
        // repeats 是否重复
        return UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
    }
    
    /// 计时器通知 repeats 循环/重复
    func timeNotification() -> UNNotificationTrigger{
        return UNTimeIntervalNotificationTrigger(timeInterval: 5.0, repeats: false);
    }
}

/// 本地通知
struct LocalNotificationBootcamp: View {
    var body: some View {
        VStack(spacing: 40) {
            // 获取权限
            Button("Request permission") {
                NotificationManager.instance.requestAuthorization()
            }
            Button("Schedule notification") {
                NotificationManager.instance.scheduleNotification()
            }
            Button("Cancel notification") {
                NotificationManager.instance.cancelNotification()
            }
        }
        .onAppear {
            UIApplication.shared.applicationIconBadgeNumber = 0
        }
    }
}

  3.2 效果图:

      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python二维码识别tesseract

window安装tesseract 下载路径: https://digi.bib.uni-mannheim.de/tesseract/ 选择 双击安装在D:\sore\teeseract-OCR后: 配置环境变量 配置环境变量Path:D:\sore\teeseract-OCR 配置语言包的环境变量TESSDATA_PREFIX: D:\s…

搭建自己的搜索引擎之五

一、前言 接上文 搭建自己的搜索引擎之四,下面继续介绍茴香豆茴字的另外两种写法。 二、Jest Jest是ES的Java Http Rest客户端,它主要是为了弥补以前ES自有API缺少HttpRest接口客户端的不足,但因为现在ES官方已经提供了RestClient ,该项目已…

Dynamic CRM开发 - 实体窗体(二)主窗体

主窗体是功能最丰富,使用场景最多的窗体。 主窗体界面如下图: 下面按照图中的序号,简述一下窗体的主要功能: 0、窗体的主要布局部分,即用户看到的内容,可以拖动右侧的字段到窗体中想要放置的地方。 默认有标题、常规(选项卡)、页脚三部分,常规处于高亮状态,即可以…

第十二章 类和对象

C面向对象的三大特性为:封装、继承、多态 C认为万事万物都皆为对象,对象上有其属性和行为 例如: 人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌... 车也可以作为对象,…

docker安装apisix全教程包含windows和linux

docker安装apisix 一、Windows安装1、首先需要安装docker和docker compose,如果直接安装docker desktop,会自动安装docker compose。2、重新启动电脑3、访问 Docker 的下载([https://www.docker.com/products/docker-desktop](https://www.do…

RocketMQ 版本升级测试

一、背景 RocketMQ 版本升级,3.6.4升级到5.1.3。 二、机器资源 应用端: 10.XX.67.249【机器 1】 cd /home/product/logs/dolphin_task_test_logs/ vim info.logMQ 服务端: 旧MQ 10.XX.108.249 broker-001。用于测试升级NameServer【机器 2…

react库的基础学习

React介绍 React.js是前端三大新框架:Angular.js、React.js、Vue.js之一,这三大新框架的很多理念是相同的,但是也有各自的特点。 React起源于Facebook的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满…

【数据库】形式化关系查询语言(一):关系代数Relational Algebra

目录 一、关系代数Relational Algebra 1. 基本运算 a. 选择运算(Select Operation) b. 投影运算(Project Operation) 组合 c. 并运算(Union Operation) d. 集合差运算(Set Difference Op…

【C++】vector基本接口介绍

vector接口目录: 一、vector的初步介绍 1.1vector和string的联系与不同 1.2 vector的源码参数 二、vector的四种构造(缺省填充元素迭代器拷贝构造) 三、vecto的扩容操作与机制 3.1resize(老朋友了,不会就去看str…

Linux文件查找,别名,用户组综合练习

1.文件查看: 查看/etc/passwd文件的第5行 [rootserver ~]# head -5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi…

epoll与socket缓冲区的恩恩怨怨

文章目录 前言一、什么是socket缓冲区二、阻塞与非阻塞内核缓冲区1、如果发送缓冲区满了会怎么样阻塞非阻塞 2、如果接受缓冲区为空会怎么样阻塞非阻塞 三、epoll与缓冲区的恩恩怨怨水平触发边缘触发非阻塞阻塞 结论 前言 本文深挖网络编程中的缓冲区,从什么是缓冲…

排序:基数排序算法分析

1.算法思想 假设长度为n的线性表中每个结点aj的关键字由d元组 ( k j d − 1 , k j d − 2 , k j d − 3 , . . . , k j 1 , k j 0 ) (k_{j}^{d-1},k_{j}^{d-2},k_{j}^{d-3},... ,k_{j}^{1} ,k_{j}^{0}) (kjd−1​,kjd−2​,kjd−3​,...,kj1​,kj0​)组成, 其中&am…

微信小程序开发基础(一)认识小程序

微信小程序,小程序的一种,英文名Wechat Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。微信小程序是一种不用下载就能使用的应用,也是…

排序:外部排序算法分析

1.外存与内存之间的数据交换 1.外存(磁盘) 操作系统以“块”为单位对磁盘存储空间进行管理,如:每块大小1KB 各个磁盘块内存放着各种各样的数据。 2.内存 磁盘的读/写以“块”为单位数据读入内存后才能被修改修改完了还要写回磁盘。 2.外…

Purple-Pi-OH OHOS SDK编译手册

一、源码获取 1.1 源码获取 链接:百度网盘 请输入提取码 提取码:1234 $ mkdir purple-pi #将下载的ido_purple_pi_oh_ohos3.2_sdk.tgz拷贝到purple-pi $ cd purple-pi $ md5sum ido_purple_pi_oh_ohos3.2_sdk.tgz e6ca2d96aa7c628992ae0bbf4d14c2ca …

面试买书复习就能进大厂?

大家好,我是苍何。 现在进大仓是越来越难了,想通过简单的刷题面试背书,比几年前难的不少, 但也并非毫无希望,那究竟该如何准备才能有希望进大厂呢? 我总结了 4 点: 1、不差的学历背景 2、丰富…

EcmaScript标准-导入与导出-js

ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,所以它…

lwIP 开发指南(下)

目录 NETCONN 编程接口简介netbuf 数据缓冲区netconn 连接结构netconn 编程API 函数 NETCONN 编程接口UDP 实验NETCONN 实现UDPNETCONN 接口的UDP 实验硬件设计软件设计下载验证 NETCONN 接口编程TCP 客户端实验NETCONN 实现TCP 客户端连接步骤NETCONN 接口的TCPClient 实验硬件…

九、Delay函数

1、两个延时函数 vTaskDelay:至少等待指定个数的Tick Interrupt才能变为就绪态。vTaskDelayUntil:等待到指定的绝对时刻,才能变为就绪态。 2、函数原型 /* xTicksToDelay: 等待多少个Tick */ void vTaskDelay( const TickType_t xTicksToD…

1.(vue3.x+vite)封装组件

前端技术社区总目录(订阅之前请先查看该博客) 关联博客 2.(vue3.x+vite)组件注册并调用 1:创建组件目录package,并创建相关工程结构 2:编写组件内容(index.vue) 3:添加注册组件方法(index.js) 4:添加路由