【问题标题】:How to add event in Calendar when scanned by QR scanner in swift iOS在swift iOS中通过QR扫描仪扫描时如何在日历中添加事件
【发布时间】:2019-06-29 15:40:34
【问题描述】:

在发布之前,我确实搜索过这个答案,但没有找到我需要的东西,所以想请问您是否可以帮助我。

我有 iOS Swift 应用程序,它扫描 QR 码,在我的情况下是日历事件,然后将其显示为警报弹出窗口。 我需要的是扫描二维码(日历事件),扫描时提示是否将事件添加到日历中,也限制扫描事件二维码。

有效的代码来自https://medium.com/@gayatri.hedau/qr-code-scanner-with-avcapturesession-ios-swift-5007ee498b49,但您可以在那里确认您已看到扫描信息。

https://qrcode.tec-it.com/en/Calendar上创建带有活动信息的二维码

我不太了解,但我认为下面的代码应该调整一下,因为这部分显示了警报二维码。

   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)
}

当扫描二维码时,我得到了这个

开始:事件 摘要:学生会七月 描述:参加学生会议 地点:21号会议室 DTSTART:20190710T140000Z 结束:事件

当使用来自 AppStore 的类似 QR 码应用扫描仪进行扫描时,它会显示这是日历事件。

【问题讨论】:

  • 希望有人回答,我有问题
  • 我正在研究此代码andrewcbancroft.com/2016/06/02/…,它具有类似的 UIAalert。仍然不确定如何将其与上面的内容或可能与 NSString 的 stringWithFormat 将 QR 码格式化为 iCal 或类似的东西放在一起。仍然不够聪明,无法做到这一点:)
  • 我们需要这个联系人的二维码,但对于日历stackoverflow.com/questions/38051598/… SO,如果有人可以看看这个并提出建议。

标签: ios swift events qr-code


【解决方案1】:

我通过操作二维码返回的字符串值找到了解决方案:

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)") }


请注意,此代码处理类型为 vEvent 的 QR 码,创建于 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)") }

【讨论】:

  • 我已经使用了你的第一个代码,导入了 EKEvent,也将 'var aStr = codeString' 更改为 'var aStr = qrcode' 因为这是我的字符串,你可以看到有问题,但扫描后没有任何反应,请问您是否在函数'func receivedCode(qrcode:String)'中使用了代码?
  • 是的,我的code在s按钮里面,codeString变量是扫描二维码后得到的值
  • 谢谢,我的版本是自动扫描。会这样检查。
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 2016-08-15
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多