我的 Flutter 项目中有一个通道方法,它采用字符串 (url(,下载图像并将其作为新联系人的一部分呈现。
但是,对于大多数网址,不会显示该图像。
这是我用来获取图像并添加到新联系人的代码,然后再将其显示在CNContactViewController
中。
let urlString : String = (arguments["imgUrl"] as? String)!
let url = URL(string: urlString)
let data = try? Data(contentsOf: url!)
newContact.imageData = data
我尝试对 url 进行编码并将其转换为NSString
,但没有运气。
有趣的是,如果我像下面这样对 url 进行硬编码,它可以工作。那么在将它从我的 Dart 源代码发送到 Swift 之间发生了什么?
(修改URL以隐藏内容,真实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
更新:
这是完整的代码...
飞镖:
static const platform = const MethodChannel('contacts');
static Future<String> addSystemContact({
String firstName,
String lastName,
String jobTitle,
String company,
String phone,
String email,
String city,
String country,
String profile,
String imgUrl,
}) async {
try {
var result = await platform.invokeMethod(
'addSystemContact',
{
'firstName' : firstName != null && firstName.isNotEmpty ? firstName : "",
'lastName' : lastName != null && lastName.isNotEmpty ? lastName : "",
'jobTitle' : jobTitle,
'company' : company,
'phone' : phone,
'email' : email,
'city' : city,
'country' : country,
'profile' : profile,
'imgUrl': imgUrl,
},
);
return result;
} on PlatformException catch (e) {
return null;
}
}
迅速:
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let contactChannel = FlutterMethodChannel(name: "contacts", binaryMessenger: controller)
contactChannel.setMethodCallHandler({(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
//ADD SYSTEM CONTACT
//
if (call.method == "addSystemContact") {
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
if let jobTitle : String = arguments["jobTitle"] as? String {
newContact.jobTitle = jobTitle
}
if let company : String = arguments["company"] as? String {
newContact.organizationName = company
}
if let phone : String = arguments["phone"] as? String {
newContact.phoneNumbers = [CNLabeledValue(
label:CNLabelPhoneNumberMain,
value:CNPhoneNumber(stringValue:phone))]
}
if let email : NSString = arguments["email"] as? NSString {
newContact.emailAddresses = [CNLabeledValue(label:CNLabelWork, value:email)]
}
let address = CNMutablePostalAddress()
if let city : String = arguments["city"] as? String {
address.city = city
}
if let country : String = arguments["country"] as? String {
address.country = country
}
newContact.postalAddresses = [CNLabeledValue(label:CNLabelWork, value:address)]
if let profile : String = arguments["profile"] as? String {
newContact.socialProfiles = [CNLabeledValue(label:
CNSocialProfileServiceLinkedIn, value: CNSocialProfile.init(urlString: profile, username: nil, userIdentifier: nil, service: nil))]
}
// Offending code...
//
let urlString : String = (arguments["imgUrl"] as? String)!
let url = URL(string: urlString)
let data = try? Data(contentsOf: url!)
newContact.imageData = data
//
//
//presents nav controller with CNContactViewController
self.displayConactViewController(newContact: newContact, result: result)
}
})
你似乎有混合的方法论。您是传递单个字符串作为参数还是映射?不幸的是,您没有显示飞镖端。
以下是一些工作示例,改编自工作插件。
单字符串
飞镖端
static void ping(String pong) {
_channel.invokeMethod('ping', pong);
}
快速结束 - call.arguments
是一个String
case "ping":
NSLog("ping")
if let pong = call.arguments as! String {
// do something
} else {
NSLog("ping - Invalid Args")
}
break
字符串作为映射成员
飞镖端
static void foo(String bar, String baz) {
_channel.invokeMethod('foo', <String, dynamic>{
'bar': bar,
'baz': baz,
});
}
快速结束 - call.arguments
是一个Dictionary
case "foo":
NSLog("foo")
if let args = call.arguments as? Dictionary<String, Any>, let bar = args["bar"] as! String {
// do something with bar and/or args["baz"] as! String
} else {
NSLog("foo - Args is not a Dictionary")
}
break