В нашей компании мы используем приложение для Mac, которое отлично работало в OS X Mountain Lion. После обновления до OS X Mavericks он перестал работать. Поскольку мы еще не обновили все, мы ясно видим, что на машинах ML это все еще работает, а на машинах Mavericks - нет.
Погрузившись в код и запустив его из Xcode 5, быстро стало ясно, что следующий фрагмент кода, отвечающий за создание вызова API к Trello, ведет себя не так, как ожидалось:
NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:TRELLOTOKEN];
NSLog(@"TOKEN: %@", token);
NSString *urlString = [NSString stringWithFormat:@"/1/cards/%@/idList?value=%@&key=%@&token=%@", taskID, DOINGLISTID, TRELLOKEY, token];
NSLog(@"URLSTRING: %@", urlString);
NSURL *url = [NSURL URLWithString:urlString relativeToURL:[NSURL URLWithString:TRELLOLOGENDPOINT]];
NSLog(@"URL: %@", url);
Вывод:
TOKEN: thetokenstring
URLSTRING: /1/cards/.../idList?value=...&key=...&token=thetokenstring
URL: (null)
Я изменил переменные taskID, DOINGLISTID, TRELLOKEY на ..., чтобы они были короткими и анонимными. Я могу заверить, что ключи не содержат символов, которые необходимо экранировать (они также должны были бы экранироваться в ML).
Проблема в том, что моя переменная url остается нулевой после назначения с помощью функции NSURL URLWithString.
Есть способ исправить эту ситуацию, просто присвоив строку переменной NSString *token. Итак, если мы заменим первую строку на:
NSString *token = @"thetokenstring";
Тогда это работает. Вы можете просто скопировать и вставить токен из вывода NSLog, если хотите.
Вывод:
TOKEN: thetokenstring
URLSTRING: /1/cards/.../idList?value=...&key=...&token=thetokenstring
URL: /1/cards/.../idList?value=...&key=...&token=thetokenstring -- https://trello.com
Очевидно, мне нужен мой токен из моего NSUserDefaults.
Может ли кто-нибудь пролить свет на это? Я хотел бы знать, почему это не работает (больше) и как я могу это исправить.
Я уже пробовал следующее:
- Явное приведение результата NSUserDefaults к NSString.
Инициализация токена NSString * с помощью:
[NSString строкаWithString:...]
К сожалению, не повезло...
NSLog(@"%@", [NSArray arrayWithObject:token]);
. В описаниях массивов используется старый формат списка ASCII, который будет подсвечиваться, еслиtoken
содержит что-то, чего вы не ожидаете. Думаю, я бы также зарегистрировал[token class]
, пока я этим занимаюсь. - person Ken Thomases   schedule 14.11.2013