颤振通道方法字符串不用作 URL



我的 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