【问题标题】:Help to decipher iPhone app code帮助破译 iPhone 应用程序代码
【发布时间】:2011-03-28 02:39:06
【问题描述】:

有人可以帮我破译这段代码吗?它在用户按下按钮提交数据时执行,或者在本例中是 iPhone 应用程序中的“问题”。

我知道它正在将字符串发送到我托管在服务器上的 phpscript.php,但我不熟悉发生的一长串命令。

NSUserDefaults *p = [NSUserDefaults standardUserDefaults];
[p setObject:[NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://website.com/phpscript.php?user=%@&pass=%@&cat=%@&sub=%@&body=%@",[[p valueForKey:@"user"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],[[p valueForKey:@"pass"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],sport,@"",[[tvQ.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]]] forKey:@"q"];

【问题讨论】:

  • 这太可怕了。写这篇文章的人需要咨询。
  • 这段代码只是为了说明为什么软件应该写给人类阅读。是的,它有效,是的,它都在一条线上,没有很多一次性变量,但它不可维护。在这些快速优化编译器的日子里,它可能甚至没有效率。写这篇文章的人只是想证明他/她是个铁杆程序员。
  • 我的开发人员这样做了....应用程序完成了,我接手了。现在正试图弄清楚并清理。
  • 哇...我很惊讶他并没有把所有内容都放在一行上,而是将p 替换为[NSUserDefaults standardUserDefaults]
  • @BigMike:所以你接手是因为你解雇了你的开发者?

标签: iphone objective-c


【解决方案1】:

分解它会更容易一些。

NSUserDefaults *p = [NSUserDefaults standardUserDefaults];
NSString* string1 = [[p valueForKey:@"user"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* string2 = [[p valueForKey:@"pass"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* string3 = [[tvQ.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* urlString = [NSString stringWithFormat:@"http://website.com/phpscript.php?user=%@&pass=%@&cat=%@&sub=%@&body=%@",string1,string2,sport,@"",string3];
id val1 = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]];
[p setObject:val1 forKey:@"q"];

所以 p 是从用户默认值加载的字典对象,看起来像是一些登录凭据,可能是上次运行应用程序时保存的。

stringByAddingPercentEscapesUsingEncoding 是一种标准方法,可以安全地在请求中传输 ' '(空格)或 '%' 等字符。它应用于字符串,以确保请求能够像预期的那样到达服务器。

String1 和 String2 大概是用户名和密码。我猜 String3 是查询的主体。

当构建 URL 时,它会执行由 urlString 表示的查询(代码将在执行 fetch 时暂停 - 希望整个块已经在辅助线程上)。查询结果存储在字典 p 中,可以通过键 @"q" 访问。

显式处理 & 符号:

[myString replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString];

此方法可以应用于任何字符串 - 如果将其应用于同一字符串两次,那么第二次将不会执行任何操作。

【讨论】:

  • 亚当,这太棒了。谢谢你。这里有什么地方可以让它接受与号 (&) 以便我可以将它传递给我的 php 脚本?我看到它正在编码其他特殊字符。
  • stackoverflow.com/questions/705448/… 中,Roger Nolan 给出了一个代码示例,它将处理 stringByAddingPercentEscapesUsingEncoding 不能处理的所有内容。但是如果你只想要'&' - 你可以使用“%26”。请参阅添加到答案中的代码行。
  • Adam,很抱歉没有跟上进度,但是如果我想用 Roger Nolan 示例覆盖我的所有基础,我应该在哪里插入“NSMutableString *escaped”代码示例您在上面提供的干净代码?
  • 假设您有一些普通的文本。用类似 NSString* myString = [NSString stringWithFormat:@"%s" myOrdinaryASCIITextString] 的东西使它成为一个 NSString。然后您可以使用如图所示的 replaceOccurrencesOfString 方法。然后字符串就可以发送了。您可能会将其作为示例中 string3 的一部分,或者将其附加到字符串 3?
  • 它看起来像 NSString* string3 = [[tvQ.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "] [[tvQ.text replaceOccurrencesOfString:@"&" withString:@" %26" 选项:NSCaseInsensitiveSearch range:wholeString] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
【解决方案2】:

它从 tvQ.text 创建一个字符串,用空格替换任何新行,然后使用上面的字符串和它抓取的其他字符串(用户默认值中的值,从事物)。然后它会修复这个 url 字符串中的百分比转义,然后从 NSString 创建一个 NSURL 对象。然后将此 NSURL 设置为用户默认值中键“q”的对象。

这让我头疼。

【讨论】:

  • 是的,我的头已经很痛了。无论如何要清理这个?我遇到了一个与符号 (&) 没有传递给我的 php 脚本的问题,该脚本然后插入到我的数据库中。绳子被切断。例如,如果我在应用程序中键入“hello & goodbye”,它最终只会将“hello”传递给我的脚本,该脚本会被放入数据库中。
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多