美文网首页IOS开发iOS精华nice
iOS获取来电和短信发送状态

iOS获取来电和短信发送状态

作者: zhangferry | 来源:发表于2015-12-29 17:32 被阅读6516次

获取电话状态

在我想要了解iOS获取来电状态时,经常被这是不是允许的,是不是要调用私有库等问题困扰。费了好大劲终于解决了上面问题,你可以获取系统提供的电话相关状态,而且它不属于私有库。为了需要这方面资料的人查阅时少走弯路,我把这些东西写下来,废话少说,上代码。

如何获取电话状态

首先要导入CoreTelephony框架:
@import CoreTelephony;

然后声明一个CTCallCenter变量:

@interface ViewController () {  
CTCallCenter *center_;   //为了避免形成retain cycle而声明的一个变量,指向接收通话中心对象
}  
@end

然后监听电话状态:

- (void) aboutCall{   
    //获取电话接入信息
callCenter.callEventHandler = ^(CTCall *call){
    if ([call.callState isEqualToString:CTCallStateDisconnected]){
        NSLog(@"Call has been disconnected");
         
    }else if ([call.callState isEqualToString:CTCallStateConnected]){
        NSLog(@"Call has just been connected");
        
    }else if([call.callState isEqualToString:CTCallStateIncoming]){
        NSLog(@"Call is incoming");
        
    }else if ([call.callState isEqualToString:CTCallStateDialing]){
        NSLog(@"call is dialing");
        
    }else{
        NSLog(@"Nothing is done");
    }
};
}

还可以获取运营商信息:

- (void)getCarrierInfo{
// 获取运营商信息
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = info.subscriberCellularProvider;
NSLog(@"carrier:%@", [carrier description]);

// 如果运营商变化将更新运营商输出
info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier) {
    NSLog(@"carrier:%@", [carrier description]);
};

// 输出手机的数据业务信息
NSLog(@"Radio Access Technology:%@", info.currentRadioAccessTechnology);
}    

当然这样在真机进行测试,以下为输出信息:

2015-12-29 16:34:14.525 RWBLEManagerDemo[1489:543655] carrier:CTCarrier (0x134e065c0) {
Carrier name: [中国移动]
Mobile Country Code: [460]
Mobile Network Code:[07]
ISO Country Code:[cn]
Allows VOIP? [YES]
}
2015-12-29 16:34:14.526 RWBLEManagerDemo[1489:543655] Radio Access Technology:CTRadioAccessTechnologyHSDPA    

CoreTelephony框架是不是私有库

私有框架的目录为:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/PrivateFrameworks/

FDC2B801-0F1C-41FD-A9A4-399592DF4BEF.png

可以看出CoreTelephony框架是在frameworks内而不是PrivateFrameworks,所以它是可以放心使用的。网上之所以有说CoreTelephony是私有库,是因为在iOS6的时候是私有框架,后来苹果又给公开了。

获取短信状态

关于短信的状态获取,我直接看了
#import <MessageUI/MessageUI.h>
里面就两个头文件:

#import <MessageUI/MFMailComposeViewController.h>
#import <MessageUI/MFMessageComposeViewController.h>

一个是邮件相关的方法,一个短信相关的方法。进到MFMessageComposeViewController.h有一个枚举值:

enum MessageComposeResult {
MessageComposeResultCancelled,
MessageComposeResultSent,
MessageComposeResultFailed
};
typedef enum MessageComposeResult MessageComposeResult;   // available in iPhone 4.0

这是表示短信发送状态的值。要使用这个框架发送自己编辑的内容还需要添加代理:MFMessageComposeViewControllerDelegate

代码如下:

- (void)showMessageView
{
if( [MFMessageComposeViewController canSendText] )// 判断设备能不能发送短信
{
    MFMessageComposeViewController*picker = [[MFMessageComposeViewControlleralloc] init];
    // 设置委托
    picker.messageComposeDelegate= self;
    // 默认信息内容
    picker.body = @"nihao";
    // 默认收件人(可多个)
    picker.recipients = [NSArray arrayWithObject:@"12345678901", nil];
    [self presentModalViewController:picker animated:YES];
    [picker release];
}
else
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示信息"
                                                    message:@"该设备不支持短信功能"
                                                   delegate:self
                                          cancelButtonTitle:nil
                                          otherButtonTitles:@"确定", nil];
    [alert show];
    [alert release];
}
}

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
switch (result){
    case MessageComposeResultCancelled:
        NSLog(@"取消发送");
        break;
    case MessageComposeResultFailed:
        NSLog(@"发送失败");
        break;
    case MessageComposeResultSent:
        NSLog(@"发送成功");
        break;
        
    default:
        break;
}
}

对于来短信的通知没有找到,应该是不能获取的。

参考资料

相关文章

网友评论

  • Sunyc2016:你好,能监测到系统短信是否打开阅读吗?
  • CoderHw:你们的项目居然还是MRC ?
  • 在草地上奔跑的壮汉:也请受我一拜 :pray:
    zhangferry:@在草地上奔跑的壮汉 多谢支持:smile:
  • 巴图鲁:膜拜
    zhangferry:@巴图鲁 :wink:
  • zhangferry:iOS9之后那个方法被弃用了,目前单通过代码是不能进行后台电话监听的
    zhangferry:@开小飞 比如要做手环监测来电这个功能,硬件上实现ANCS就可以了。但这是借助了硬件,如果纯APP那就实现不了了
    开小飞:@勇闯天涯茉莉花茶 等于说现在只能前台监听咯?你说的单单通过代码无法实现后台监听,意思是可以通过其他思路可以解决这个问题咯?可以指点下不~?
    zhangferry:@勇闯天涯茉莉花茶 @开小飞
  • 开小飞:你好~又看到你的文章了~我有个小问题,这个电话监听已经实现了,但是不能在后台继续监听,有什么办法可以实现后台持续监听么?
  • 在没老之前:哦,好的。知道了。3Q :smile:
    zhangferry:@在没老之前 :wink:
  • 在没老之前:楼主,我想请问下。iOS9,我想获取用户短息的内容,这个允许吗?
    或者,我获取用户接收了谁的短信,和短信接收时间,这个可以被允许吗?
    zhangferry:@在没老之前 苹果处于安全性考虑,获取短信内容是不被允许的。ANCS是蓝牙协议,蓝牙能够获取,APP不行
    在没老之前:额,不懂。那就是说还是有办法获取到了咯?我们是做信用卡账单的APP,想获取用户信息的内容。。。
    zhangferry:@在没老之前 这需要硬件支持ANCS,由硬件获得,单是程序这些都无法获取
  • 三分慢先森:请问这个在后台也是可以监听到的吗?
    zhangferry:@猴子不只想要金箍棒 在iOS9之后后台监听的那个方法不会被执行了
  • b99a735540e0:你好,我想做一个:ANCS来电通知 和短信、邮件通知的 模块,用51822 或者 2541BLE来做,请问你可以提供这方面的程序吗?看了你这文章, 应该是可以拿来用的了。谢谢。请联系QQ:1667763282
    zhangferry:@光和影的追逐者 ANCS和平常蓝牙连接逻辑稍有不同,其他像读写数据都是一样的
  • 阿爸:如何监听运营商切换到另一个运营商
  • 我系哆啦:有研究过怎么能获取来电话的电话号码么,不用私有api的话
    zhangferry:@我系哆啦 没研究过,应该是不可以的
  • 0ad148e66577:我家飞飞真棒
    zhangferry:@爱吃橘子的姑娘 那是
  • 远恒之义:飞飞 写文章的感觉如何
    zhangferry:@远恒之义 分享知识的感觉还是挺爽的内 :smile:
  • 王家菇凉:@Jafar 你应该也会吧😄
    952625a28d0d:@王家菇凉 :smile::smile:
    王家菇凉: @Jafar 睡得好晚 我是撑不住了
    952625a28d0d:@王家菇凉 嗯呢:smile:

本文标题:iOS获取来电和短信发送状态

本文链接:https://www.haomeiwen.com/subject/mqlihttx.html