ios 手机查询
首先用到一个手机归属地查询的服务网站。http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx
SOAP是简单对象访问协议,它可看成是HTTP与XML的结合,其中XML部分是作为HTTP报文的实体主体部分
[webData setLength: 0]; //注意这里需要改正一下:webData=[NSMutableData alloc ]init];
1、运行Xcode 4.4.1,新建一个Single View Application,名称为SOAP Test:
2、界面设计:打开ViewController.xib,设计界面如下所示:
在文本输入框的Attribute Inspector中设置其Keyboard属性为Number Pad。
3、之后向ViewController.h中,为文本输入框创建OutLet映射,名称为:phoneNumber;为“查询”按钮创建Action映射,事件类型为Touch Up Inside,名称为:doQuery。建立映射的方法就是打开Assistant Editor,选中某一控件,按住Ctrl,拖向ViewController.h,可以参考前面的文章。
4、在ViewController.h中添加代码:
4.1 在@interface那行最后添加代码
<NSXMLParserDelegate, NSURLConnectionDelegate>
使ViewController遵守这两个协议。前者用来解析XML,后者用于网络连接。
4.2 在@end之前添加代码
@property (strong, nonatomic) NSMutableData *webData; @property (strong, nonatomic) NSMutableString *soapResults; @property (strong, nonatomic) NSXMLParser *xmlParser; @property (nonatomic) BOOL elementFound; @property (strong, nonatomic) NSString *matchingElement; @property (strong, nonatomic) NSURLConnection *conn;
5、在ViewController.m中添加代码:
5.1 在@implementation之后添加代码
@synthesize webData; @synthesize soapResults; @synthesize xmlParser; @synthesize elementFound; @synthesize matchingElement; @synthesize conn;
5.2 实现doQuery方法
- (IBAction)doQuery:(id)sender { NSString *number = phoneNumber.text; // 设置我们之后解析XML时用的关键字,与响应报文中Body标签之间的getMobileCodeInfoResult标签对应 matchingElement = @"getMobileCodeInfoResult"; // 创建SOAP消息,内容格式就是网站上提示的请求报文的实体主体部分 NSString *soapMsg = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<soap12:Envelope " "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " "xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">" "<soap12:Body>" "<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">" "<mobileCode>%@</mobileCode>" "<userID>%@</userID>" "</getMobileCodeInfo>" "</soap12:Body>" "</soap12:Envelope>", number, @""]; // 将这个XML字符串打印出来 NSLog(@"%@", soapMsg); // 创建URL,内容是前面的请求报文报文中第二行主机地址加上第一行URL字段 NSURL *url = [NSURL URLWithString: @"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"]; // 根据上面的URL创建一个请求 NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMsg length]]; // 添加请求的详细信息,与请求报文前半部分的各字段对应 [req addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [req addValue:msgLength forHTTPHeaderField:@"Content-Length"]; // 设置请求行方法为POST,与请求报文第一行对应 [req setHTTPMethod:@"POST"]; // 将SOAP消息加到请求中 [req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]]; // 创建连接 conn = [[NSURLConnection alloc] initWithRequest:req delegate:self]; if (conn) { webData = [NSMutableData data]; }}5.3 在@end之前添加代码
#pragma mark -#pragma mark URL Connection Data Delegate Methods // 刚开始接受响应时调用-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *) response{ [webData setLength: 0]; //注意这里需要改正一下:webData=[NSMutableData alloc ]init];} // 每接收到一部分数据就追加到webData中-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *) data { [webData appendData:data];} // 出现错误时-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *) error { conn = nil; webData = nil;} // 完成接收数据时调用-(void) connectionDidFinishLoading:(NSURLConnection *) connection { NSString *theXML = [[NSString alloc] initWithBytes:[webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; // 打印出得到的XML NSLog(@"%@", theXML); // 使用NSXMLParser解析出我们想要的结果 xmlParser = [[NSXMLParser alloc] initWithData: webData]; [xmlParser setDelegate: self]; [xmlParser setShouldResolveExternalEntities: YES]; [xmlParser parse];}
5.4 在@end之前添加代码#pragma mark -#pragma mark XML Parser Delegate Methods // 开始解析一个元素名-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict { if ([elementName isEqualToString:matchingElement]) { if (!soapResults) { soapResults = [[NSMutableString alloc] init]; } elementFound = YES; }} // 追加找到的元素值,一个元素值可能要分几次追加-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string { if (elementFound) { [soapResults appendString: string]; }} // 结束解析这个元素名-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:matchingElement]) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"手机号码信息" message:[NSString stringWithFormat:@"%@", soapResults] delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alert show]; elementFound = FALSE; // 强制放弃解析 [xmlParser abortParsing]; }} // 解析整个文件结束后- (void)parserDidEndDocument:(NSXMLParser *)parser { if (soapResults) { soapResults = nil; }} // 出错时,例如强制结束解析- (void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { if (soapResults) { soapResults = nil; }}
#parm mark=======下面都是重复的了。=============
// 开始查询- (IBAction)doQuery:(id)sender { NSString *number = phoneNumber.text; // 设置我们之后解析XML时用的关键字,与响应报文中Body标签之间的getMobileCodeInfoResult标签对应 matchingElement = @"getMobileCodeInfoResult"; // 创建SOAP消息,内容格式就是网站上提示的请求报文的实体主体部分 NSString *soapMsg = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<soap12:Envelope " "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " "xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">" "<soap12:Body>" "<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">" "<mobileCode>%@</mobileCode>" "<userID>%@</userID>" "</getMobileCodeInfo>" "</soap12:Body>" "</soap12:Envelope>", number, @""]; // 将这个XML字符串打印出来 NSLog(@"%@", soapMsg); // 创建URL,内容是前面的请求报文报文中第二行主机地址加上第一行URL字段 NSURL *url = [NSURL URLWithString: @"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"]; // 根据上面的URL创建一个请求 NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMsg length]]; // 添加请求的详细信息,与请求报文前半部分的各字段对应 [req addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [req addValue:msgLength forHTTPHeaderField:@"Content-Length"]; // 设置请求行方法为POST,与请求报文第一行对应 [req setHTTPMethod:@"POST"]; // 将SOAP消息加到请求中 [req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]]; // 创建连接 conn = [[NSURLConnection alloc] initWithRequest:req delegate:self]; if (conn) { webData = [NSMutableData data]; }}5.3 在@end之前添加代码#pragma mark -#pragma mark URL Connection Data Delegate Methods // 刚开始接受响应时调用-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *) response{ [webData setLength: 0];} // 每接收到一部分数据就追加到webData中-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *) data { [webData appendData:data];} // 出现错误时-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *) error { conn = nil; webData = nil;} // 完成接收数据时调用-(void) connectionDidFinishLoading:(NSURLConnection *) connection { NSString *theXML = [[NSString alloc] initWithBytes:[webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; // 打印出得到的XML NSLog(@"%@", theXML); // 使用NSXMLParser解析出我们想要的结果 xmlParser = [[NSXMLParser alloc] initWithData: webData]; [xmlParser setDelegate: self]; [xmlParser setShouldResolveExternalEntities: YES]; [xmlParser parse];}
5.4 在@end之前添加代码#pragma mark -#pragma mark XML Parser Delegate Methods // 开始解析一个元素名-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict { if ([elementName isEqualToString:matchingElement]) { if (!soapResults) { soapResults = [[NSMutableString alloc] init]; } elementFound = YES; }} // 追加找到的元素值,一个元素值可能要分几次追加-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string { if (elementFound) { [soapResults appendString: string]; }} // 结束解析这个元素名-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:matchingElement]) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"手机号码信息" message:[NSString stringWithFormat:@"%@", soapResults] delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alert show]; elementFound = FALSE; // 强制放弃解析 [xmlParser abortParsing]; }} // 解析整个文件结束后- (void)parserDidEndDocument:(NSXMLParser *)parser { if (soapResults) { soapResults = nil; }} // 出错时,例如强制结束解析- (void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { if (soapResults) { soapResults = nil; }}
6、运行
其中,输入号码时单击查询,打印出的响应XML如下:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/"> <getMobileCodeInfoResult>151898XXXXX:江苏 南京 江苏移动全球通卡 </getMobileCodeInfoResult> </getMobileCodeInfoResponse> </soap:Body></soap:Envelope>
上面的XML进行了缩进处理,实际上打印出来的是一行。
相关推荐
在iOS平台上实现“手机查询归属地”这一功能,通常涉及到网络通信、数据解析以及地理位置信息处理等多个技术领域。以下是对这个功能的详细说明: 首先,我们需要理解“归属地”概念,它指的是移动设备所绑定的运营...
这个“iOS手机归属地查询demo”提供了一个基本的框架,展示如何在iOS应用中集成这样的功能。下面我们将深入探讨这个项目涉及到的关键知识点。 1. **iOS开发环境**:首先,你需要具备Xcode IDE,这是Apple官方提供的...
在iOS开发中,获取国际手机区号是一项常见的需求,特别是在涉及到国际通信或者用户地理位置信息处理时。本资源“ios-获取国际手机区号.zip”提供了一个解决方案,帮助开发者能够便捷地获取不同国家和地区的手机区号...
尽管这个模板设计风格源自iOS 7,但作为开发者或网站管理员,你需要考虑如何根据自己的品牌和用户群体进行适当的定制,同时确保模板在各种设备和浏览器上都能正常工作,这可能涉及到CSS3媒体查询、图片适配等技术。...
本资源“iPhone iOS数据库查询源代码”聚焦于如何在iOS应用中实现对SQLite数据库的高效查询。下面我们将深入探讨相关知识点。 1. **SQLite简介**: SQLite是一个开源、自包含、无服务器、零配置、事务性的SQL...
在IT行业中,"查询手机...总的来说,实现"查询手机号归属地"的功能涉及到iOS应用开发的多个核心部分:编程语言基础,网络请求,数据解析,UI设计以及事件处理。通过这个小demo,开发者可以深入理解和实践这些关键技能。
### iOS手机即时通讯软件开发知识点 #### 一、系统概述 **系统介绍** 该文档主要介绍了AnyChat for iOS SDK的开发手册,适用于iOS平台上的即时通讯应用开发。AnyChat for iOS SDK提供了丰富的功能,旨在帮助...
在iOS开发中,获取手机本地音乐是常见的需求,这通常涉及到多媒体编程,特别是与Apple的Media Library服务交互。本文将详细介绍如何使用Objective-C或Swift语言来实现这一功能,以及涉及的相关知识点。 首先,我们...
为了在Android平台上实现类似的用户体验,我们可以创建一个“仿iOS手机通讯录效果”的应用。这个应用旨在模仿iOS通讯录的主要功能和视觉样式,包括获取手机联系人、按首字母排序显示、实时搜索联系人以及显示和拨打...
对于合法且需要获取设备应用信息的场景,开发者可以考虑使用Apple提供的公开API,如`SpringBoardServices`框架(仅限于系统应用),或者在用户授权的情况下使用`LSApplicationQueriesSchemes`来查询特定应用的存在。
在iOS应用开发中,查询手机号归属地是一项常见的需求,例如用于验证用户输入的手机号是否有效或者展示联系人的地区信息。本资源"IOS应用源码之Soap请求查询手机号归属地.zip"提供了一种实现方法,主要涉及到的技术点...
在iOS开发中,获取手机通信录是一项常见的功能,尤其在社交应用、支付应用以及生活服务类应用中,如微信、支付宝等,用户可能需要通过通讯录来查找联系人进行转账或者分享信息。本文将详细讲解如何在iOS中实现类似...
"iOS手机银行卡号输入格式化"这个主题主要涉及到以下几个方面的知识点: 1. **文本字段(UITextField)的自定义格式化**:在iOS中,我们通常使用UITextField来接收用户的输入,特别是银行卡号这种较长的数字序列。...
这是基于STM32F103ZET6设计的遥控小车手机APP源码,采用QT框架设计,跨平台设计,支持windows、Android、IOS、Linux平台编译运行,代码不变,一套代码编译到任何平台。通过ESP8266与手机APP相连接,手机APP可以控制...
在iOS平台上,获取手机通讯录是一项常见的功能,它允许应用程序访问用户的联系人信息,并进行展示或处理。在本文中,我们将深入探讨如何在iOS中实现这一功能,以及如何将获取到的数据以表格形式呈现。 首先,为了...
- `UIFontDescriptor`类可以用来查询和选择支持特定Unicode范围的字体。 7. **挑战与解决方案** - Unicode处理中的常见问题包括不正确的编码转换、文本排序错误、 emoji处理等。使用`CFStringTransform`函数可以...
4. **响应式设计**:确保自定义的下拉框在不同屏幕尺寸和方向下都能正常工作,这可能涉及到媒体查询和适配性处理。 5. **测试和兼容性**:在实际项目中,务必在多种iOS设备和版本上进行测试,因为不同的iOS版本可能...
在iOS开发中,将照片保存到用户手机的相册或者从相册中加载图片到应用程序是常见的需求。这篇教程将详细讲解如何实现这个功能,特别适合初学者学习。我们将主要探讨以下几个方面: 1. **使用Photos Framework** ...
当用户同意授权后,可以使用`HKHealthStore`的`querySampleType(_:predicate:completion:)`方法来查询步数数据。通常,我们会设置一个日期范围的谓词,以便获取特定时间段内的步数。 写入步数数据则适用于那些需要...
在iOS开发中,获取手机通讯录、自定义Cell展示、实现Cell左滑菜单以及某条记录置顶效果是常见的功能需求。以下将详细介绍这些知识点。 首先,**获取手机通讯录**是iOS应用中的一项基本功能,主要涉及到Contacts框架...