创建新联系人并分配图像数据时,图像不会显示。尽管数据为非空,文件为普通的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
可能有问题?
进一步的测试揭示了以下代码,可以直接在其中输入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
如果有建议,将打开新问题。