2016-07-18 16 views
0

Я работаю над раздавливанием некоторых раздражающих ошибок в одном из моих проектов Swift. Мне интересно, есть ли способ передать emoji через HTTP, так что мой код на стороне сервера может сохранить данные emoji для последующего поиска. Проблема в том, что когда запрос будет сформулирован, приложение будет разбиваться при создании NSURL/NSURLSession (не уверен, какой именно), если он содержит Emoji.Ошибка отправки Emoji через NSURLSession

Есть ли способ, которым приложение может не вылетать при вставке Emoji, или есть выделенный способ, которым я могу иметь Emojis в HTTP-запросах?

Alamofire.request(.POST, "removed/api.php?request=setBio&identification=" + identification + "&bio=" + content).responseJSON { response in 
     if let jsonStr = response.result.value { 
      let jsonObj = JSON(jsonStr) 
      print ("response for bio update: \(jsonObj["response"])") 
      self.user.bio = self.bioField.text! 
     } 
    } 

Если строка «content» содержит emoji, она сработает. Alamofire запускает все через NSUrlSession.

сбой здесь в Alamofire (по-видимому, это найти ноль, а разворачивание опционального значения, не знает, почему. Текст не равен нуль.)

let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: URLString.URLString)!) 
+1

Обновите свой вопрос с помощью соответствующего кода и конкретной информации о сбое (полное сообщение об ошибке и укажите точную строку, вызывающую сбой). – rmaddy

+0

(Это может быть проблема с обработкой UTF-16/USC-2. Кодовые точки Emoji не находятся в BMP.) –

+0

@rmaddy Отредактировано сообщение –

ответ

1

Нашел очень простое решение!

Просто добавьте это к переменной содержания:

.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet())! 

, и вы будете иметь возможность отправить запрос с таргетингом на него.

+1

Проблема в том, что если ваша строка содержит символ '+', это будет неправильно интерпретироваться как символ пробела. – Rob

1

Вы должны позволить Alamofire сделать необходимый процент вытекающего запроса:

let parameters = ["request": "setBio", "identification": identification, "bio": content] 

Alamofire.request(.POST, "removed/api.php", parameters: parameters, encoding: .URLEncodedInURL) 
    .responseJSON { response in 
     if let jsonStr = response.result.value { 
      // ... 
     } 
    } 

Честно говоря, я использовал ParameterEncoding.URLEncodedInURL выше, потому что в исходном примере, вы поставите эти параметры в URL. В общем случае с запросами POST вы должны включить эти параметры в тело запроса, достигнув, опуская параметр encoding, или несколько смутно/парадоксально, используя encoding из ParameterEncoding.URL. Включение параметров в тело запроса является более обычным и более безопасным. Но если вы действительно должны включать эти параметры в URL-адрес, укажите значение .URLEncodedInURL для encoding.

Но главное сообщение состоит в том, что Alamofire уже знает, как правильно уклониться от параметров, поэтому пусть это делает, а не вручную создает URL-адрес или NSURLRequest. И, в качестве предупреждения, другие методы, такие как stringByAddingPercentEncodingWithAllowedCharacters (с наборами символов, такими как URLPathAllowedCharacterSet) или NSURLComponents, не только менее прямы, но и не могут должным образом уклоняться от определенных запросов (хотя они будут работать с emoji). Несмотря на это, лучше, чтобы Alamofire справился с этим, так как он действительно побежал правильно.