在iOS中使用格式说明符表示URL

时间:2014-02-26 21:49:16

标签: ios objective-c zbar-sdk

我在使用url的格式说明符时遇到问题。使用zBar扫描仪扫描php链接。我花了很多时间在这里研究溢出但我找不到答案。

这是我在viewcontroller.m中使用的代码:

 NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://mywebsite.co.uk/TM.php?id=%@",self.scannedValue]]];
//NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"JSON"]];



NSArray *jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:Nil];

我正在尝试获取id之后的部分以获取任何整数,例如200201202203,...

出于某种奇怪的原因,只有在我将数字键入id=201id=202时,它才有效。

当我NSLog使用NSLog(@"%@",scannedValue)时,它显示以下内容:

2014-02-26 21:45:27.185 MeCombine[2412:60b] http://mywebsite.co.uk/TM.php?id=201
2014-02-26 21:45:27.277 MeCombine[2412:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'

有人能告诉我为什么会这样吗?

一些注意事项:

scansValue = sym.data;

是字符串,sumZBarSymbol类对象

ZBarSymbol班级

@property (readonly, nonatomic) NSString *data; 

是起始值。

成功扫描值后,它将在委托方法中返回NSString *data

2 个答案:

答案 0 :(得分:0)

我只能提供一个猜测,因为我没有看到你的所有代码,但这就是我的想法:

您的http链接格式不正确(http::而不是http:)。 jsonData对象如果因任何原因无法加载网址,则为nil

您不进行任何空检查,并且此nil对象将被发送到您的json数据的任何方法处理,如果数据对象为零,则会抛出NSInvalidArgumentException

答案 1 :(得分:0)

NSData的+dataWithContentsOfURL:不允许使用nil URL,在这种情况下由于URL格式不正确而发生,请注意您有两个:在http之后的URL中。正确的URL将是。

http://mywebsite.co.uk/TM.php?id=%@

构建URL的现代且可能更加万无一失的方法是使用NSURLComponents(iOS 7和OS X 10.9)

NSURLComponents *comps = [NSURLComponents componentsWithString:@"http://www.mywebsite.co.uk"];
comps.query = [NSString stringWithFormat:@"id=%@", self.scannedValue];
comps.path = @"/TM.php";
NSURL *URL = comps.URL;

主要的好处是能够将基本URL隔离成一个常量字符串,然后改变来自其他地方的查询/路径,这使得事情比代码中的硬编码值更加模块化和易于维护。