首页 > 解决方案 > 从 base64 字符串 Siwft 4 生成二维码

问题描述

我正在尝试创建一个 VCard,然后将其转换为 QR 码。在我在 VCard 中添加 base64 照片字符串之前,一切都运行良好。在这种情况下,由于字符串的大小,二维码生成失败。我尝试了一些技巧,但似乎没有任何效果。

下面是我用二维码生成 VCard 的代码。

 func textBasedVCard()-> Data?{
    var string = "BEGIN:VCARD\nVERSION:3.0\n"
    string += "FN:\(self.firstnameTextField.text!)\nN:\(self.lastnameTextField.text!)\nORG:\(self.companyTextField.text!)\nTITLE:\(self.titleTextField.text!)\nTEL;TYPE=WORK,VOICE:\(self.phoneNumberTextField.text!)\nADR;TYPE=WORK:;;\(self.adressTextField.text!)\nPOSTALCODE:\(self.postcodeTextField.text!)\nCITY:\(self.cityTextField.text!)\nitem3.URL:\(self.linkedinTextField.text!)\nitem4.URL:\(self.twitterTextField.text!)\nEMAIL;TYPE=PREF,INTERNET:\(self.emailAdressTextField.text!)\nPHOTO;ENCODING=BASE64;TYPE=JPEG:\(self.base64ImageString)\nEND:VCARD"
    let utf8str = string.data(using: String.Encoding.utf8)
    if let base64Encoded = utf8str?.base64EncodedString(options: .init(rawValue: 0))

    {
        self.generateQRCode(string: string)
        return Data(base64Encoded: base64Encoded)!
    }
    return nil
}

 func generateQRCode(string: String) {
    if qrcodeImage == nil {

        let data = string.data(using: String.Encoding.ascii, allowLossyConversion: false)
        let filter = CIFilter(name: "CIQRCodeGenerator")
        filter?.setValue(data, forKey: "inputMessage")
        filter?.setValue("Q", forKey: "inputCorrectionLevel")

        qrcodeImage = filter?.outputImage

        let context:CIContext = CIContext.init(options: nil)
        let cgImage:CGImage = context.createCGImage(qrcodeImage, from: qrcodeImage.extent)!
        let image:UIImage = UIImage.init(cgImage: cgImage)

        self.imageData = UIImagePNGRepresentation(image)! as NSData
        print(imageData)
    }
}

这是错误

在隐式展开可选值时意外发现 nil

此错误位于 generateQRCode() 中的 cgImage 行上。原因是过滤器什么都没有。即无

如果我从 VCard 中删除照片,那么evertyhting 工作正常。

请帮助 TIA

标签: swiftqr-codetobase64string

解决方案


推荐阅读