Мне пришлось переключиться с stringByAddingPercentEscapesUsingEncoding на CFURLCreateStringByAddingPercentEscapes, потому что он не избегает вопросительных знаков (?). Мне любопытно, что именно он сбегает, и обоснование частичного экранирования по сравнению с RFC 3986.