1

我们在我们公司使用了一个 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:...]

不幸的是没有运气...

4

2 回答 2

1

好的,我找到了解决方案。基于 Ken Thomases 的出色评论。

事实证明,该令牌包含一个换行符。听起来很愚蠢吧?这可能会发生,因为在用户授权应用程序后,我必须从一个非常简单的页面的 DOM 中过滤代码。

我想 NSURL 的实现发生了一些变化,所以它不允许在 url 字符串的末尾使用换行符(它不应该)。不过,我不会排除任何其他可行解释的存在。

于 2013-11-14T07:28:15.603 回答
-1

代码似乎没问题!
无论如何,你可以用这个替换第一行,看看它是否有效:

NSString *token = [[[NSUserDefaults standardUserDefaults] objectForKey:TRELLOTOKEN] description];

这只是一个想法,可能是这样,也可能不是!我的想法是您使用的方法正在返回(id),可以将其传递给NSString,它应该像在NSLog消息输出(和以前的操作系统)中一样工作。description 方法只返回(NSString *)与令牌对象相同的类型。(id)是动态类型,可能会导致一些问题。最好按照您想要返回的方式编写代码NSString
顺便说一句,[[NSUserDefaults standardUserDefaults] objectForKey:TRELLOTOKEN]可能会返回nil(取决于您的代码的逻辑!)。所以最好像这样使用它:

NSString *token;
NSObject *tokenObj = [[NSUserDefaults standardUserDefaults] objectForKey:TRELLOTOKEN];
if (token != nil) {
    token = [tokenObj description];
} else {
    token = @"";
}
NSString *urlString = [NSString stringWithFormat:@"/1/cards/%@/idList?value=%@&key=%@&token=%@", taskID, DOINGLISTID, TRELLOKEY, token];    
NSURL *url = [NSURL URLWithString:urlString relativeToURL:[NSURL URLWithString:TRELLOLOGENDPOINT]];
NSLog(@"URL: %@", url);

希望能解决你的难题!;)

于 2013-11-13T14:37:03.393 回答