为 vEvent 生成二维码时出错 "No usable data found"
Generating QR Code for vEvent gives error "No usable data found"
我正在尝试生成一个 QR 码,扫描后会提示用户将活动添加到他们的日历中。我知道这是可能的,因为我已经使用像 qrmonkey 这样的服务来生成代码,我的 iOS 设备会提示我这样做。
我创建了一个函数,可以成功生成二维码并且可以扫描。函数如下
func generateCalendarEvent(summary: String, location: String?, url: String?, description: String?, startDate: Date, endDate: Date) -> UIImage? {
//Generate Event String
var eventString: String = "BEGIN:VEVENT"
eventString.append("\nSUMMARY:\(summary)")
if let locationString: String = location {
eventString.append("\nLOCATION:\(locationString)")
}
if let urlString: String = url {
eventString.append("\nURL:\(urlString)")
}
if let descriptionString: String = description {
eventString.append("\nDESCRIPTION:\(descriptionString)")
}
eventString.append("\nDTSTART:\(startDate.formatted(format: "yyyymmdd'T'hhmmss"))")
eventString.append("\nDTEND:\(endDate.formatted(format: "yyyymmdd'T'hhmmss"))")
eventString.append("\nEND:VEVENT")
//Setup Filter
guard let filter = CIFilter(name: "CIQRCodeGenerator") else {
return nil
}
filter.setValue(eventString.data(using: .utf8), forKey: "inputMessage")
//Setup Transform
let transform = CGAffineTransform(scaleX: 3, y: 3)
guard let output = filter.outputImage?.transformed(by: transform) else {
return nil
}
return UIImage(ciImage: output)
}
当我扫描生成的二维码时,它在 iOS 设备上给我一个错误提示“找不到可用数据”。
您没有显示您使用的是什么 .formatted(format: "yyyymmdd'T'hhmmss")
...
但是,假设它生成了您期望的字符串,问题似乎出在 DTSTART
AND DTEND
.
的格式上
您正在使用 ":"
而您应该使用 ";"
:
DTSTART:
DTEND:
应该是:
DTSTART;
DTEND;
试试这个...如果有效,请使用您的 .formatted(...)
扩展名试试:
func generateCalendarEvent(summary: String, location: String?, url: String?, description: String?, startDate: Date, endDate: Date) -> UIImage? {
//Generate Event String
var eventString: String = "BEGIN:VEVENT"
eventString.append("\nSUMMARY:\(summary)")
if let locationString: String = location {
eventString.append("\nLOCATION:\(locationString)")
}
if let urlString: String = url {
eventString.append("\nURL:\(urlString)")
}
if let descriptionString: String = description {
eventString.append("\nDESCRIPTION:\(descriptionString)")
}
let df = DateFormatter()
df.dateFormat = "yyyymmdd'T'hhmmss"
eventString.append("\nDTSTART;VALUE=DATE:\(df.string(from: startDate))")
eventString.append("\nDTEND;VALUE=DATE:\(df.string(from: startDate))")
eventString.append("\nEND:VEVENT")
//Setup Filter
guard let filter = CIFilter(name: "CIQRCodeGenerator") else {
return nil
}
filter.setValue(eventString.data(using: .utf8), forKey: "inputMessage")
//Setup Transform
let transform = CGAffineTransform(scaleX: 3, y: 3)
guard let output = filter.outputImage?.transformed(by: transform) else {
return nil
}
return UIImage(ciImage: output)
}
我正在尝试生成一个 QR 码,扫描后会提示用户将活动添加到他们的日历中。我知道这是可能的,因为我已经使用像 qrmonkey 这样的服务来生成代码,我的 iOS 设备会提示我这样做。
我创建了一个函数,可以成功生成二维码并且可以扫描。函数如下
func generateCalendarEvent(summary: String, location: String?, url: String?, description: String?, startDate: Date, endDate: Date) -> UIImage? {
//Generate Event String
var eventString: String = "BEGIN:VEVENT"
eventString.append("\nSUMMARY:\(summary)")
if let locationString: String = location {
eventString.append("\nLOCATION:\(locationString)")
}
if let urlString: String = url {
eventString.append("\nURL:\(urlString)")
}
if let descriptionString: String = description {
eventString.append("\nDESCRIPTION:\(descriptionString)")
}
eventString.append("\nDTSTART:\(startDate.formatted(format: "yyyymmdd'T'hhmmss"))")
eventString.append("\nDTEND:\(endDate.formatted(format: "yyyymmdd'T'hhmmss"))")
eventString.append("\nEND:VEVENT")
//Setup Filter
guard let filter = CIFilter(name: "CIQRCodeGenerator") else {
return nil
}
filter.setValue(eventString.data(using: .utf8), forKey: "inputMessage")
//Setup Transform
let transform = CGAffineTransform(scaleX: 3, y: 3)
guard let output = filter.outputImage?.transformed(by: transform) else {
return nil
}
return UIImage(ciImage: output)
}
当我扫描生成的二维码时,它在 iOS 设备上给我一个错误提示“找不到可用数据”。
您没有显示您使用的是什么 .formatted(format: "yyyymmdd'T'hhmmss")
...
但是,假设它生成了您期望的字符串,问题似乎出在 DTSTART
AND DTEND
.
您正在使用 ":"
而您应该使用 ";"
:
DTSTART:
DTEND:
应该是:
DTSTART;
DTEND;
试试这个...如果有效,请使用您的 .formatted(...)
扩展名试试:
func generateCalendarEvent(summary: String, location: String?, url: String?, description: String?, startDate: Date, endDate: Date) -> UIImage? {
//Generate Event String
var eventString: String = "BEGIN:VEVENT"
eventString.append("\nSUMMARY:\(summary)")
if let locationString: String = location {
eventString.append("\nLOCATION:\(locationString)")
}
if let urlString: String = url {
eventString.append("\nURL:\(urlString)")
}
if let descriptionString: String = description {
eventString.append("\nDESCRIPTION:\(descriptionString)")
}
let df = DateFormatter()
df.dateFormat = "yyyymmdd'T'hhmmss"
eventString.append("\nDTSTART;VALUE=DATE:\(df.string(from: startDate))")
eventString.append("\nDTEND;VALUE=DATE:\(df.string(from: startDate))")
eventString.append("\nEND:VEVENT")
//Setup Filter
guard let filter = CIFilter(name: "CIQRCodeGenerator") else {
return nil
}
filter.setValue(eventString.data(using: .utf8), forKey: "inputMessage")
//Setup Transform
let transform = CGAffineTransform(scaleX: 3, y: 3)
guard let output = filter.outputImage?.transformed(by: transform) else {
return nil
}
return UIImage(ciImage: output)
}