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