IOS 系统应用调用

拨打电话功能

在很多的App中都可以直接拨打指定的电话号码,比如在一些订餐类App上我们可以直接电话联系商家。通过一个简单的案例讲解如何实现调用系统的电话拨打应用。

举例

在模拟器上无法模拟。
为了实现拨打电话的功能,我们搭建一个简单的界面,添加一个UITextField控件用于输入电话号码,以及一个UIButton控件,点击后拨打输入的电话号码。两个控件添加完毕后,建立与与ViewController的连线。

实现方式一:使用openURL:options:completionHandler:方法

在UIApplication类中,提供了openURL:options:completionHandler:方法用于打开特定的URL链接,此时我们需要提供一个遵守tel协议的链接,链接的格式为:tel://电话号码。通过调用openURL:options:completionHandler:方法,即可跳转到通话界面。
在这里插入图片描述

//实现方式一:使用openURL:options:completionHandler:方法
-(void)callByOpenURL{
    NSString *phoneNum=[NSString stringWithFormat:@"tel://%@",self.phoneNumberTextField.text];
    NSURL *url=[NSURL URLWithString:phoneNum];
    UIApplication *app=[UIApplication sharedApplication];
    if ([app canOpenURL:url]) {
        [app openURL:url options:@{} completionHandler:^(BOOL success) {
            NSLog(@"success__");
        }];
    }
}

这里将格式字符串“tel” 改为“telprompt”,电话拨打出去前会弹出询问框

This app is not allowed to query for scheme tel解决

在这里插入图片描述

实现方式二:使用WKWebView

通过WKWebView实现拨打电话功能,拨打前会弹出窗口,询问用户是否拨打电话,用户结束通话后自动返回到应用。

//实现方式二:使用WKWebView
-(void)callByMkWebView{
    NSString *phoneNum=[NSString stringWithFormat:@"telprompt://%@",self.phoneNumberTextField.text];
    WKWebView *webview=[[WKWebView alloc]init];
    webview.navigationDelegate =self;
    [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:phoneNum]]];
    [self.view addSubview:webview];
}
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
    //代理方法中实现界面跳转
    NSURL *url=navigationAction.request.URL;
    UIApplication *app=[UIApplication sharedApplication];
    if ([url.absoluteString hasPrefix:@"tel"]) {
        if ([app canOpenURL:url]) {
            [app openURL:url options:@{} completionHandler:^(BOOL success) {
                NSLog(@"success2");
            }];
        }
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}

实现方式三:使用UIWebView

通过UIWebView同样可以实现拨打电话功能。使用UIWebView实现拨打电话功能时,系统会弹出窗口询问用户是否拨打电话,用户结束通话后自动返回到应用。

- (IBAction)callUp:(id)sender {
    NSString *phoneNum = [NSString stringWithFormat:@"tel://%@",self.textField.text];
    UIWebView *webView = [[UIWebView alloc]init];
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:phoneNum]]];
    [self.view addSubview:wedView];
}

发送短信

苹果官方提供了MFMessageComposeViewController类,为App应用内提供了发送短信功能。

MFMessageComposeViewController简介

MFMessageComposeViewController是MessageUI框架中提供的用于发送短信的类,它可以为用户快速的创建一个用于短信发送的界面。在MFMessageComposeViewController 类中,定义了MFMessageComposeViewControllerDelegate代理协议,该代理协议中提供了当用户完成短信发送后的回调方法。

设置短信发送对象。由于recipients是一个数组,因此,可以提供短信群发功能。

@property(nonatomic,copy,nullable) NSArray<NSString *> *recipients;

设置短信内容。

@property(nonatomic,copy,nullable) NSString *body;

代理对象。

@property(nonatomic,assign,nullable) id<MFMessageComposeViewControllerDelegate> messageComposeDelegate;

检查运行终端是否支持发送短信

+ (BOOL)canSendText;

MFMessageComposeViewControllerDelegate代理协议中定义的用于短信发送完成后调用的代理方法。该代理方法中的result参数会返回短信发送的结果,其取值包括:MessageComposeResultSent(发送成功)、MessageComposeResultFailed(发送失败)、MessageComposeResultCancelled(取消发送)。

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result;

举例

在这里插入图片描述
在我们需要使用到MessageUI框架的地方,需要引入对应的头文件。

#import <MessageUI/MessageUI.h>

遵守协议
MFMessageComposeViewControllerDelegate

/*          发送短信            */
-(void)sendMessage{
    if( [MFMessageComposeViewController canSendText] ){
        MFMessageComposeViewController * messageController = [[MFMessageComposeViewController alloc]init];
        messageController.recipients = [NSArray arrayWithObject:self.phoneNumberTextField.text];
        messageController.body = @"来自99iOS的短信!";
        messageController.messageComposeDelegate = self;
        //显示发送信息界面的控制器
        [self presentViewController:messageController animated:YES completion:nil];
    }else{
        NSLog(@"设备不具备短信功能");
    }
}
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{
    [controller dismissViewControllerAnimated:YES completion:nil];
    if (result ==  MessageComposeResultSent) {
        NSLog(@"发送成功");
    }
}

在这里插入图片描述

发送邮件

MFMailComposeViewController简介

在MessageUI框架中,除了提供短信发送功能之外,还提供了邮件发送功能。发送邮件的实现与发送短信类似,只不过需要用到MFMailComposeViewController类,同样可以在不跳出程序的情况下发送邮件。在MFMailComposeViewController类中,包括了如下几个核心的方法和属性。

设置邮件发送对象。recipients是一个数组,因此,可以提供邮件群发功能。

- (void)setToRecipients:(nullable NSArray<NSString *> *)toRecipients;

设置邮件主题

- (void)setSubject:(NSString *)subject;

设置邮件的内容

- (void)setMessageBody:(NSString *)body isHTML:(BOOL)isHTML;

代理对象

 @property (nonatomic, assign, nullable) id<MFMailComposeViewControllerDelegate> mailComposeDelegate;

MFMailComposeViewControllerDelegate代理协议中定义了用于邮件发送完成后的回调方法。该代理方法中的result参数会返回邮件发送的结果,其取值包括: MFMailComposeResultSaved(邮件存储)、MFMailComposeResultSent(发送成功)、MFMailComposeResultFailed(发送失败)、MFMailComposeResultCancelled(取消发送)。

- (void)mailComposeController:(MFMailComposeViewController*)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError*)error;

举例

遵守协议MFMailComposeViewControllerDelegate

/*         发送邮件     */
-(void)sendMail{
    if ([MFMailComposeViewController canSendMail]) {
        MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
        controller.mailComposeDelegate = self;
        NSString *recipient = [NSString stringWithFormat:@"%@",self.phoneNumberTextField.text];
        [controller setToRecipients:[NSArray arrayWithObjects:recipient, nil]];
        //要发送的邮件主题
        [controller setSubject:@"邮件测试"];
        //要发送邮件的内容
        [controller setMessageBody:@"Hello " isHTML:NO];
        [self presentViewController:controller animated:YES completion:nil];
    }else{
        NSLog(@"设备不具备发送邮件功能");
    }
}
- (void)mailComposeController:(MFMailComposeViewController*)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError*)error {
    if (result == MFMailComposeResultSent) {
        NSLog(@"邮件发送成功");
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

代码

https://github.com/ShaeZhuJiu/CallMessageMail.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值