Перед публикацией я искал этот ответ, но не нашел того, что мне нужно, поэтому хотел бы спросить, не могли бы вы мне помочь.
У меня есть приложение iOS Swift, которое сканирует QR-коды, которые в моем случае являются событиями календаря, а затем отображают их как всплывающее окно с предупреждением. Что мне нужно, так это сканировать QR-код (событие календаря) и при сканировании запрашивать, будет ли событие добавлено в календарь, а также ограничивать сканирование QR-кодами событий.
Работающий код взят из https://medium.com/@gayatri.hedau/qr-code-scanner-with-avcapturesession-ios-swift-5007ee498b49, но там вы можете просто подтвердить, что видели отсканированную информацию.
QR-код с информацией о событии создан на https://qrcode.tec-it.com/en/Календарь
Я не так много знаю, но я думаю, что нижеследующая часть кода должна быть скорректирована, так как эта часть показывает предупреждающий 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-кода я получаю это
BEGIN:VEVENT SUMMARY:Student meeting July DESCRIPTION:Attend student meeting LOCATION:Meeting room 21 DTSTART:20190710T140000Z END:VEVENT
Также при сканировании с помощью аналогичных сканеров приложений QR-кода из AppStore он показывает, что это событие календаря.
Я смотрю на этот код andrewcbancroft.com/2016/06/02/…, который имеет аналогичный UIAalert. Все еще не уверен, как совместить это с вышеизложенным или, может быть, что-то с NSString stringWithFormat, что QR-код отформатирован в iCal или аналогичный. Все равно не хватает ума, чтобы сделать это :)
И вот этот QR-код для контактов - то, что нам нужно, но для календаря stackoverflow.com/questions/38051598/… ТАК, если кто-то может посмотреть на это и подсказать.
Я нашел решение, манипулируя строковым значением, возвращаемым 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, такое событие будет иметь тип события vКалендарь, поэтому вам понадобится приведенный ниже код, чтобы сохранить его в приложении Календарь 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)") }
Я использовал ваш первый код, импортировал EKEvent, также изменил «var aStr = codeString» на «var aStr = qrcode», потому что это моя строка, как вы можете видеть в вопросе, но после сканирования ничего не происходит, пожалуйста, сообщите, если вы использовали код внутри функции 'func ReceiveCode (qrcode: String)'?
да, мой код находится внутри кнопки s, а переменная codeString — это значение, полученное после сканирования QR-кода
Спасибо, у меня версия с автоматическим сканированием. Проверим так.
Надеюсь кто-нибудь ответит, у меня проблема