- 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)
- }
- }
- }
- }
- /// 触觉管理器
- 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) }
- }
- }
- }
- 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
- }
- }
- }