我们在我们公司使用了一个 Mac 应用程序,该应用程序曾经在 OS X Mountain Lion 中完美运行。升级到 OS X Mavericks 后,它停止工作。由于我们还没有全部升级,我们可以清楚地看到,在 ML 机器上它仍然可以工作,而在 Mavericks 机器上却不行。
深入研究代码并从 Xcode 5 运行它,很快就会发现,负责构建对 Trello 的 API 调用的以下代码块的行为与预期不同:
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 *token:
[NSString stringWithString:...]
不幸的是没有运气...