我在Xcode 5中添加了sparkle框架时遇到了问题。它基本上是in this post所描述的。问题是sparkle没有复制到frameworks文件夹。解决方案是下载源代码,更改一些设置并自行构建。但是:在建设过程中我得到一个错误:
NSAlert *alert = [NSAlert alertWithMessageText:SULocalizedString(@"Update Error!", nil) defaultButton:SULocalizedString(@"Cancel Update", nil) alternateButton:nil otherButton:nil informativeTextWithFormat:[error localizedDescription]];
产生
格式字符串不是字符串文字(可能不安全)
我无法弄清楚如何解决这个问题。有人可以帮忙吗?
答案 0 :(得分:4)
我今天遇到了同样的问题。这种变化非常简单。
变化:
NSAlert *alert = [NSAlert alertWithMessageText:SULocalizedString(@"Update Error!", nil)
defaultButton:SULocalizedString(@"Cancel Update", nil)
alternateButton:nil
otherButton:nil
informativeTextWithFormat:[error localizedDescription]];
要:
NSAlert *alert = [NSAlert alertWithMessageText:SULocalizedString(@"Update Error!", nil)
defaultButton:SULocalizedString(@"Cancel Update", nil)
alternateButton:nil
otherButton:nil
informativeTextWithFormat:@"%@", [error localizedDescription]];
如果您感兴趣,解释是informativeTextWithFormat
实际上是变量参数列表的开头,其中第一个参数是格式字符串,后续的是该格式的输入。错误是因为格式来自运行时字符串(而不是编译时常量字符串),因此无法在编译时验证它 - 恶意用户可能(以某种方式)在运行时更改格式字符串从此应用程序中执行恶意代码。
与以下区别相同:
NSLog([error localizatedDescription]);
和
NSLog( @"%@", [error localizatedDescription]);
希望这有帮助。