在iOS中创建新联系人时图像不可见

时间:2019-05-31 23:26:45

标签: ios swift image flutter contacts

创建新联系人并分配图像数据时,图像不会显示。尽管数据为非空,文件为普通的jpg或png。

在我的Flutter应用中,我正在使用Channel Method将下载的图像文件路径传递给我的Swift代码。我想使用文件路径,将CNContactViewController与图片一起创建新联系人。

缓存图像的示例,文件路径:/var/mobile/Containers/Data/Application/A8E048D0-1B7F-412F-AV60-E3RFFG316732/Library/Caches/my_images/temp.jpg

我知道该图像是有效文件,因为它可以同时使用Flutter Image小部件和如果通过我的频道方法显示在UIImageView中,则可以成功显示。

我用来显示新创建的联系人的Swift代码:

let arguments : Dictionary = call.arguments as! Dictionary<String,Any>
            guard let firstName : String = arguments["firstName"] as? String else { return result(false); }
            guard let lastName : String = arguments["lastName"] as? String else { return result(false); }

            //create contact
            let newContact = CNMutableContact()
            newContact.contactType = CNContactType.person
            newContact.givenName = firstName
            newContact.familyName = lastName

            //check image and add to contact
            if let filePath : String = arguments["imgPath"] as? String {
                let imageUrl = URL.init(fileURLWithPath: filePath)
                if (imageUrl.isFileURL) {
                    if let image = UIImage(contentsOfFile: imageUrl.path) {
                        newContact.imageData = UIImagePNGRepresentation(image)
                    }
                }
            }

            let contactVC = CNContactViewController(forUnknownContact: newContact)
            contactVC.contactStore = CNContactStore()
            contactVC.delegate = self
            contactVC.allowsActions = false

            let navigationController = UINavigationController(rootViewController: contactVC)
            let cancelBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.cancel, target: nil, action: nil)
            cancelBtn.actionClosure = {
                result(false)
                let controller : FlutterViewController = self.window?.rootViewController as! FlutterViewController
                controller.dismiss(animated: true, completion: nil)
            }
            let doneBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: nil, action: nil)
            doneBtn.actionClosure = {
                // Saving the newly created contact
                let store = CNContactStore()
                let saveRequest = CNSaveRequest()
                saveRequest.add(newContact, toContainerWithIdentifier:nil)
                try! store.execute(saveRequest)

                result(true)
                let controller : FlutterViewController = self.window?.rootViewController as! FlutterViewController
                controller.dismiss(animated: true, completion: nil)
            }
            contactVC.navigationItem.leftBarButtonItem = cancelBtn
            contactVC.navigationItem.rightBarButtonItem = doneBtn
            controller.present(navigationController, animated: true, completion: nil)

这将按预期成功显示Contact ViewController。但是,在90%的情况下,图像将不可见。

将首字母缩写从图像圆中删除,就好像存在图像一样,但是没有显示图像。

我可以对文件/数据进行一些额外的处理或检查吗?

更新

现在尝试仅将图像URL传递到channel方法(swift代码)并使用Swift直接下载它,但结果相同。 CNContactViewController可能有问题?

更新2

进一步的测试揭示了以下代码,可以直接在其中输入url的情况下正常工作。 (修改网址以隐藏内容,实际网址返回图片)

let url = URL(string: "https://23ee7ca4ch9430946b76-4f3bba1a032272305d39a357e474f3b2.ssl.cf1.rackcdn.com/talent/81843293_1556369106.jpeg")
            let data = try? Data(contentsOf: url!)
            newContact.imageData = data

但是,从我的Dart代码中将URL作为字符串传递并使用如下方法失败:

let urlString : String = (arguments["imgUrl"] as? String)! //doesnt work
            let url = URL(string: urlString)
            let data = try? Data(contentsOf: url!)
            newContact.imageData = data

如果有建议,将打开新问题。

0 个答案:

没有答案