Как добавить событие в календарь при сканировании QR-сканером в swift iOS - PullRequest
1 голос
/ 29 июня 2019

До публикации я искал этот ответ, но не нашел того, что мне нужно, поэтому хотел бы спросить, не могли бы вы мне помочь.

У меня есть приложение iOS Swift, которое сканирует QR-коды, которые есть в моем событии календаря, а затем показывает его как всплывающее окно с предупреждением. Мне нужно отсканировать QR-код (событие календаря) и при сканировании вывести запрос на добавление события в календарь, а также ограничить сканирование QR-кодами события.

Код работал с https://medium.com/@gayatri.hedau/qr-code-scanner-with-avcapturesession-ios-swift-5007ee498b49,, но там вы можете просто подтвердить, что видели отсканированную информацию.

QR-код с информацией о событии создан на https://qrcode.tec -it.com / ru / Calendar

Я не так много знаю, но я думаю, что нижняя часть кода должна быть скорректирована, так как эта часть показывает предупреждающий QR-код.

   func receivedCode(qrcode: String) {
    print(qrcode)
    let alertController = UIAlertController(title: "Do you want to add event into your calendar?", message: qrcode, preferredStyle: .alert)
    let action1 = UIAlertAction(title: "Ok", style: .default) { (action:UIAlertAction) in
        self.dismiss(animated: true)
    }
    alertController.addAction(action1)
    self.present(alertController, animated: true, completion: nil)
}

При сканировании QR-кода я получаю это

НАЧАТЬ: VEVENT РЕЗЮМЕ: Студенческая встреча июль ОПИСАНИЕ: присутствовать на студенческом собрании РАСПОЛОЖЕНИЕ: конференц-зал 21 DTSTART: 20190710T140000Z END: VEVENT

Также при сканировании с помощью аналогичных сканеров приложений QR Code из AppStore показывается, что это событие календаря.

1 Ответ

0 голосов
/ 11 июля 2019

Я нашел решение, манипулируя строковым значением, возвращаемым QR-кодом:

var aStr = codeString.replacingOccurrences(of: "BEGIN:VEVENT", with: "")
aStr = aStr.replacingOccurrences(of: "\n", with: "")
aStr = aStr.replacingOccurrences(of: "SUMMARY:", with: "")
aStr = aStr.replacingOccurrences(of: "LOCATION:", with: "_")
aStr = aStr.replacingOccurrences(of: "DTSTART:", with: "_")
aStr = aStr.replacingOccurrences(of: "DTEND:", with: "_")
aStr = aStr.replacingOccurrences(of: "END:VEVENT", with: "")
print("\nEVENT STRING: \(aStr)\n")

// Make an array of aStr items
let evArr = aStr.components(separatedBy: "_")
let startDateStr = "\(evArr[2])"
let endDateStr = "\(evArr[3])"

// Get dates from Strings
let df = DateFormatter()
df.locale = Locale(identifier: "en_US_POSIX")
df.timeZone = TimeZone.autoupdatingCurrent
df.dateFormat = "yyyyMMdd'T'HHmmss"
let startDate = df.date(from: startDateStr)
let endDate = df.date(from: endDateStr)

// Store Event in Calendar
let eventStore = EKEventStore()
eventStore.requestAccess(to: EKEntityType.event) { (granted, error) in
    if granted && error == nil {
        print("ACCESS GRANTED \(granted)")
        print("ERROR: \(String(describing: error))")

        let event = EKEvent(eventStore: eventStore)
        event.title = "\(evArr[0])"
        event.startDate = startDate!
        event.endDate = endDate!
        event.notes = "EVENT: \(evArr[0])\nLOCATION: \(evArr[1])"
        // Save Event...
        event.calendar = eventStore.defaultCalendarForNewEvents
        do { try eventStore.save(event, span: .thisEvent)
        } catch let error as NSError { print("Failed to save Event: \(error)") }

        print("Event saved in your Calendar app")
// error
} else { print("Failed to save Event: \(error!.localizedDescription)") }


Обратите внимание, что этот код обрабатывает QR-код типа vEvent , созданный https://www.qrcode -monkey.com / # event .
Но если вы создадите событие на https://www.qrstuff.com,, то это будет событие типа vCalendar , поэтому вам потребуется код ниже, чтобы сохранить его в приложении Календарь iOS:

var aStr = codeString.replacingOccurrences(of: "BEGIN:VCALENDAR", with: "")
aStr = aStr.replacingOccurrences(of: "VERSION:2.0", with: "")
aStr = aStr.replacingOccurrences(of: "BEGIN:VEVENT", with: "")
aStr = aStr.replacingOccurrences(of: "\n", with: "")
aStr = aStr.replacingOccurrences(of: "\r", with: "")
aStr = aStr.replacingOccurrences(of: "SUMMARY;CHARSET=utf-8:", with: "")
aStr = aStr.replacingOccurrences(of: "LOCATION;CHARSET=utf-8:", with: "_")
aStr = aStr.replacingOccurrences(of: "DTSTART:", with: "_")
aStr = aStr.replacingOccurrences(of: "DTEND:", with: "_")
aStr = aStr.replacingOccurrences(of: "END:VEVENT", with: "")
aStr = aStr.replacingOccurrences(of: "END:VCALENDAR", with: "")

// Make an array of aStr items
let evArr = aStr.components(separatedBy: "_")
let startDateStr = "\(evArr[2])"
let endDateStr = "\(evArr[3])"

// Get dates from Strings
let df = DateFormatter()
df.locale = Locale(identifier: "en_US_POSIX")
df.timeZone = TimeZone.autoupdatingCurrent
df.dateFormat = "yyyyMMdd'T'HHmmssZ"
let startDate = df.date(from: startDateStr)
let endDate = df.date(from: endDateStr)

// Store Event in Calendar
let eventStore = EKEventStore()
eventStore.requestAccess(to: EKEntityType.event) { (granted, error) in
    if granted && error == nil {
         print("ACCESS GRANTED \(granted)")
         print("ERROR: \(String(describing: error))")

         let event = EKEvent(eventStore: eventStore)
         event.title = "\(evArr[0])"
         event.startDate = startDate!
         event.endDate = endDate!
         event.notes = "EVENT: \(evArr[0])\nLOCATION: \(evArr[1])"

         // Save Event...
         event.calendar = eventStore.defaultCalendarForNewEvents
         do { try eventStore.save(event, span: .thisEvent)
         } catch let error as NSError { print("Failed to save Event: \(error)") }
         print("This Event has been saved in your Calendar app")

// error
} else { print("Failed to save Event: \(error!.localizedDescription)") }
...