уменьшение int от строкового времени 4:01 до 3:51 в быстром - PullRequest
0 голосов
/ 22 ноября 2018

привет, я хочу сделать локальное уведомление от строкового времени, я хочу, чтобы уведомление запускалось за 10 минут до указанного времени.У меня есть проблема, как сделать время с 4:01 до 3:51, пожалуйста, помогите.это мой код

let a = "4:01"

func startNoftification(prayer: String) {
    let time = prayer.split(separator: ":").map { (x) -> Int in
    return Int(String(x))!
}
   let content = UNMutableNotificationContent()
   content.title = "Adzan"
   content.body = "it's time to sholat dzuhur"

   let gregorian = Calendar(identifier: .gregorian)
   var component = gregorian.dateComponents([.year, .month, .day, .hour, .minute, .second], from: Date())
   component.hour = time[0]
   component.minute = time[1] - 10

   guard let date = gregorian.date(from: component) else { return }
   let triggerDaily = Calendar.current.dateComponents([.hour, .minute, .second], from: date)
   let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)
   let request = UNNotificationRequest(identifier: "Hijrah", content: content, trigger: trigger)

   UNUserNotificationCenter.current().add(request) { (error) in
    if let err = error {
        print("Notif error:", err)
        return
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Здесь у меня есть решение в сочетании с ответом Ракеша Шастри, надеюсь, оно поможет другим.

Сначала импортируйте уведомление пользователя в appDelegate и в ваш контроллер

import UserNotification

и добавьте код для didFinishWithLaunchingWithOptions

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge]) { (granted, error) in
        if let err = error {
            print("Notifications permission denied because:", err)
            return
        }

        if granted {
            print("Notifications permission granted.")
        }
    }
}

и вы можете создать функцию и добавить строковые параметры времени из API или произвольной строки, поскольку я не использую функцию, поэтому я передаю свое решение в viewDidLoad

let adzan = "4:01"

let content = UNMutableNotificationContent()
    content.title = "Adzan"
    content.body = "It's time for sholat"
    content.sound = UNNotificationSound.default

    // Format the date first from string time
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm"

    //addingTimeInterval is where you want to set notification before or after deciding time in this case I set it 10 minute before deciding time
    guard let date = dateFormatter.date(from: adzan)?.addingTimeInterval(-600) else { return }

    // and convert our date into dateComponents
    let triggerDate = Calendar.current.dateComponents([.hour, .minute, .second], from: date)

    let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: true)

    let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

    UNUserNotificationCenter.current().add(request)
0 голосов
/ 22 ноября 2018

Это то, что вам нужно?

let time = "4:01"

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm"

guard let date = dateFormatter.date(from: time) else {
    return 
} 

let targetTime = Date(timeInterval: -(10 * 60), since: date) // Change time interval to required value in seconds
let targetTimeString = dateFormatter.string(from: targetTime)
print(targetTimeString) // Prints 3:51

Или, если в вашем времени обратного отсчета много компонентов времени, используйте DateComponents.

var dateComponents = DateComponents()
dateComponents.minute = -10
// Other components

if let targetTime = Calendar.current.date(byAdding: dateComponents, to: date)
    print(dateFormatter.string(from: targetTime))
}
...