IOS 完成来电归属地

首先是一个库:

然后设置一个工具类

.h

 1 @interface HMFoundLocation : NSObject
 2
 3 AS_SINGLETON(HMFoundLocation)
 4
 5 @property(nonatomic,strong)NSString *address;
 6
 7 @property(nonatomic,strong)NSString *operater;
 8
 9 //  设置归属地 和 运营商两个属性
10 - (void)setAddressAndOperater:(NSString *)telephoneNumber;
11
12 @end

.m

  1 //
  2 //  HMFoundLocation.m
  3 //  contactModel
  4 //
  5 //  Created by mac_mini on 14-10-24.
  6 //  Copyright (c) 2014年 mac_mini. All rights reserved.
  7 //
  8
  9 #import "HMFoundLocation.h"
 10 #import <sqlite3.h>
 11
 12 @implementation HMFoundLocation
 13
 14 DEF_SINGLETON(HMFoundLocation)
 15
 16 - (void)setAddressAndOperater:(NSString *)telephoneNumber{
 17     NSInteger lengthOftel = [telephoneNumber length];
 18     if (lengthOftel == 5) {
 19         [self _doAsServiceNumber:telephoneNumber];
 20     } else if ((lengthOftel == 11) && ([telephoneNumber characterAtIndex:0] == ‘1‘)) {
 21         //  11位手机号 不含+86
 22         NSString *findNumber = [telephoneNumber stringByPaddingToLength:7 withString:nil startingAtIndex:0];
 23         NSString *findNumberMobile = [telephoneNumber stringByPaddingToLength:3 withString:nil startingAtIndex:0];
 24         [self _selectInfoByPhone:findNumber WithMobile:findNumberMobile];
 25     } else if ((lengthOftel == 11) && ([telephoneNumber   characterAtIndex:0] == ‘0‘)) {
 26         //  固话以零开头 区号为3位
 27         NSString *zoneNumber = [telephoneNumber stringByPaddingToLength:3 withString:nil startingAtIndex:0];
 28         NSRange range;
 29         range.location = 0;
 30         range.length = 1;
 31         [self _doAsLinePhone:zoneNumber];
 32         self.operater = @"固话";
 33     } else if (((lengthOftel == 12) && ([telephoneNumber   characterAtIndex:0] == ‘0‘)) || ((lengthOftel == 3) && ([telephoneNumber characterAtIndex:0] == ‘0‘))) {
 34         //  固话以零开头 区号为4位
 35         NSString *zoneNumber = [telephoneNumber stringByPaddingToLength:4 withString:nil startingAtIndex:0];
 36         NSRange range;
 37         range.location = 0;
 38         range.length = 1;
 39         [self _doAsLinePhone:zoneNumber];
 40         self.operater = @"固话";
 41     }
 42     else{
 43         [self _numberUnknown];
 44     }
 45 }
 46
 47 - (void)_selectInfoByPhone:(NSString *)findNumber WithMobile:(NSString *)findNumberMobile{
 48     NSString *SelectWhatMobile = @"SELECT mobile FROM numbermobile where uid=";
 49     NSString *SelectWhatMobileFull = [SelectWhatMobile stringByAppendingFormat:@"%@",findNumberMobile];
 50     sqlite3 *database;
 51     if (sqlite3_open([[self _findDatabase] UTF8String], &database)
 52         != SQLITE_OK) {
 53         sqlite3_close(database);
 54         NSAssert(0, @"Failed to open database");
 55     }
 56     //  获取运营商名称
 57     sqlite3_stmt *stmt;
 58     if (sqlite3_prepare_v2(database, [SelectWhatMobileFull UTF8String], -1, &stmt, nil) == SQLITE_OK) {
 59         while (sqlite3_step(stmt) == SQLITE_ROW) {
 60             int mobilenumber = sqlite3_column_int(stmt, 0);
 61             if (mobilenumber) {
 62                 NSString *mobileNumberString = [NSString stringWithFormat:@"%d",mobilenumber];
 63                 NSString *SelectWhatMobileName = @"SELECT mobile FROM mobilenumber WHERE uid=";
 64                 NSString *SelectWhatMobileNameFull = [SelectWhatMobileName stringByAppendingFormat:@"%@",mobileNumberString];
 65                 sqlite3_stmt *stmt2;
 66                 if (sqlite3_prepare_v2(database, [SelectWhatMobileNameFull UTF8String], -1, &stmt2, nil) == SQLITE_OK) {
 67                     while (sqlite3_step(stmt2) == SQLITE_ROW) {
 68                         char *mobilename = (char *)sqlite3_column_text(stmt2, 0);
 69                         NSString *mobilenamestring = [[NSString alloc] initWithUTF8String:mobilename];
 70                         if (mobilenamestring!= NULL) {
 71                             self.operater = mobilenamestring;
 72                         }
 73                     }
 74                 }sqlite3_finalize(stmt2);
 75             }
 76         }
 77         sqlite3_finalize(stmt);
 78     }
 79     //  获取手机号码归属地
 80     sqlite3_stmt *stmt3;
 81     NSString *SelectCityNumberByPhoneNumber = @"SELECT city FROM phonenumberwithcity WHERE uid=";
 82     NSString *SelectCityNumberByPhoneNumberFull = [SelectCityNumberByPhoneNumber stringByAppendingFormat:@"%@",findNumber];
 83     if (sqlite3_prepare_v2(database, [SelectCityNumberByPhoneNumberFull UTF8String], -1, &stmt3, nil) == SQLITE_OK) {
 84         if (sqlite3_step(stmt3) == SQLITE_ROW) {
 85             int citynumber = sqlite3_column_int(stmt3, 0);
 86             NSString *citynumberNSString = [NSString stringWithFormat:@"%d",citynumber];
 87             if (citynumberNSString != nil) {
 88                 NSString *SelectCityNameAndCtiyZoneByCityBumber = @"SELECT city,zone FROM citywithnumber WHERE uid=";
 89                 NSString *SelectCityNameAndCtiyZoneByCityBumberFull = [SelectCityNameAndCtiyZoneByCityBumber stringByAppendingFormat:@"%@",citynumberNSString];
 90                 sqlite3_stmt *stmt4;
 91                 if (sqlite3_prepare_v2(database, [SelectCityNameAndCtiyZoneByCityBumberFull UTF8String], -1, &stmt4, nil) == SQLITE_OK) {
 92                     if (sqlite3_step(stmt4) == SQLITE_ROW) {
 93                         char *cityname = (char *)sqlite3_column_text(stmt4, 0);
 94                         int cityzonecode = sqlite3_column_int(stmt4, 1);
 95                         NSString *cityNameNSString = [[NSString alloc] initWithUTF8String:cityname];
 96                         NSString *cityzonecodeNnumber = [@"0" stringByAppendingFormat:@"%d",cityzonecode];
 97                         if (cityNameNSString != nil && cityzonecodeNnumber != nil) {
 98                             self.address = cityNameNSString;
 99                         }
100                     }else {
101                         [self _numberUnknown];
102                     }
103                     sqlite3_finalize(stmt4);
104                 }
105             }
106         }else {
107             [self _numberUnknown];
108         }
109         sqlite3_finalize(stmt3);
110     }
111     sqlite3_close(database);
112 }
113
114 //  私有方法
115 -(NSString *)_findDatabase{
116     NSString *path = [[NSBundle mainBundle] pathForResource:@"location_Numbercity_citynumber" ofType:@"db"];
117     return path;
118 }
119
120 - (void)_doAsServiceNumber:(NSString *)telephoneNumber{
121     if([telephoneNumber isEqualToString:@"10000"]){
122         self.address = @"中国电信客服";
123         self.operater = @"中国电信";
124     }else if([telephoneNumber isEqualToString:@"10001"]){
125         self.address = @"中国电信自助服务热线";
126         self.operater = @"中国电信";
127     }else if([telephoneNumber isEqualToString:@"10010"]){
128         self.address = @"中国联通客服";
129         self.operater = @"中国联通";
130     }else if([telephoneNumber isEqualToString:@"10011"]){
131         self.address = @"中国联通充值";
132         self.operater = @"中国联通";
133     }else if([telephoneNumber isEqualToString:@"10086"]){
134         self.address = @"中国移动客服";
135         self.operater = @"中国移动";
136     }else{
137         [self _numberUnknown];
138     }
139 }
140
141 - (void)_doAsLinePhone:(NSString*)telephoneNumber{
142     NSString *SelectCityNameByCityZoneCode = @"SELECT city FROM citywithnumber WHERE zone=";
143     NSString *SelectCityNameByCityZoneCodeFull = [SelectCityNameByCityZoneCode stringByAppendingString:telephoneNumber ];
144     sqlite3 *database;
145     if (sqlite3_open([[self _findDatabase] UTF8String], &database)
146         != SQLITE_OK) {
147         sqlite3_close(database);
148         NSAssert(0, @"Failed to open database");
149     }
150     sqlite3_stmt *stmt;
151     if (sqlite3_prepare_v2(database, [SelectCityNameByCityZoneCodeFull UTF8String], -1, &stmt, nil) == SQLITE_OK) {
152         if (sqlite3_step(stmt) == SQLITE_ROW) {
153             char *cityname = (char *)sqlite3_column_text(stmt, 0);
154             NSString *cityNameNSString = [[NSString alloc] initWithUTF8String:cityname];
155             if (cityname != nil) {
156                 self.address = cityNameNSString;
157             }
158         }else {
159             [self _numberUnknown];
160         }
161         sqlite3_finalize(stmt);
162     }
163     sqlite3_close(database);
164 }
165
166 - (void)_numberUnknown{
167     self.address = @"未知";
168     self.operater = @"未知";
169 }
170
171 @end

这个实例,用到了数据库,首先要把数据库拖到工程中来,然后在Build Phases的Copy Bundle Resources中添加进来。

然后在用到数据库的地方,import sqlite3.h 这个文件夹,里面是系统提供的数据库管理类。具体用法可在网上寻找。

时间: 2024-10-29 04:26:27

IOS 完成来电归属地的相关文章

IOS获取来电去电系统通知达到来电归属地效果(一)

这里的实现原理是获取到来电系统通知,然后根据本地通话的电话号码,把对应电话的联系人. 情况一   来电号码未在通讯录联系人中, 这时候要先在通讯录添加一个临时的联系人(就是新建一个联系人,并保存对应的RecordID) 情况二  已在通讯录的联系人 然后 把对应本次通话的电话标签修改成归属地字符 原文地址    http://blog.csdn.net/leewolf130/article/details/38921921 好了 ,先看看怎么获取系统电话通知 需要的类 //创建电话对象 代码一:

iOS 判断来电状态CTCallCenter代码块不执行问题的解决

项目中需要检测来电状态,使用了CTCallCenter,在AppDelegate中,代码如下: ? CTCallCenter *callCenter = [[CTCallCenter alloc] init]; callCenter.callEventHandler = ^(CTCall *call) { if ([call.callState isEqualToString: CTCallStateDialing]){ NSLog(@"Call Dialing"); } if (ca

android135 360 显示来电归属地

点击会开启服务. sivAddress.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (sivAddress.isChecked()) { sivAddress.setChecked(false); stopService(new Intent(SettingActivity.this,//只写this则表示OnClickListener,所以要写SettingActiv

iphone5s越狱之后必装

一.iphone5s完美越狱之后必装插件一览表 由于iPhone5s配置了强大的64位的A7处理器,所以在iOS7完美越狱后,不少iPhone5s用户发现之前安装的大部分人们插件在越狱后难以兼容.但是这种情况没有持续太久,很多插件都已经升级了,现将推荐安装的插件名单公布如下: 1.[Live Weather Icon]让天气应用图标显示天气动态 2.[KuaiDial]显示来电归属地 3.[MiniPlayer]迷你型界面播放器 4.[SkipLock]取消滑动解锁 5.[7FolderRela

2016WWDC详解

今年苹果WWDC 2016上把所有系统都更新了个遍,watchOS.tvOS.macOS 和 iOS 都或多或少带来了新功能. 本文的主角是更新最多的 iOS 10,第一时间在一部 iPhone 6s Plus 上升级了 iOS 10. 以下是我们认为值得关注的部分.但请注意,目前 iOS 10 还处于开发者测试阶段,如果你不是开发者,我们强烈建议你不要升级. 你一拿起 iPhone,它就亮了 一个很实用的功能,看图就懂. 用 iPhone 6s 的有不少朋友表示每次拿手机只想看时间,结果一按

Android核心基础(手机卫士的一个知识点总结)

注意:有些功能是需要权限的,在这里并没有写出来,在程序运行中,根据程序报的错误,添加相应的权限即可,里面的具体里面可能有一些小细节,没有明确的写出来,具体的需要在程序中自己调试,解决. 这个总结涵盖了Android的一些核心的内容,如四大组建Service.ContentProvider.BroadCastReceiver.Activity,而且四大组建都必须在清单文件中注册. 还涉及了Android手机底层的一些功能,如读取联系人.短信等.还有一些看似牛别点技术,什么短息拦截,电话拦截,黑名单

Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果

目前Android的实现是:有来电时,音乐声音直接停止,铃声直接直接使用设置的铃声音量进行铃声播放. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果. 如果要实现这个效果,首先要搞清楚两大问题: 1.来电时的代码主要实现流程. 2.主流音乐播放器在播放过程中,如果有来电,到底在收到了什么事件后将音乐暂停了? 一:来电时的代码主要实现流程 我不是第一研究来电代码的人,网上已经有高手对这个流程剖析过,不是不完全符合我的要求,我参考过的比较有价值的是如下两个

[android] 手机卫士来电显示号码归属地

继续N天前的项目 开启服务监听手机来电,查询数据库,显示归属地 详细内容可以参考这篇博文:http://www.cnblogs.com/taoshihan/p/5331232.html AddressService.java package com.qingguow.mobilesafe.service; import com.qingguow.mobilesafe.utils.NumberQueryAddressUtil; import android.app.Service; import

android 如何关闭来电号码归属地

MTK平台号码归属地分为两种:1.手机号码归属地:2.固话号码归属地: 手机号码归属地: 是MTK自己做的,关闭只需要关闭MTK_PHONE_NUMBER_GEODESCRIPTION这个option即可: 数据库文件所在路径为 alps/mediatek/external/geocoding/geocoding.db: 仅支持汉语. 固话号码归属地: 是Google Android系统自带的,关闭需要注解掉Google的原始code: 数据库文件所在路径为 alps/external/libp