在iOS开发过程中,我们可能会遇到这样的一个需求,需要调用原生的发送短信,用于自己的一些业务处理
首先,很简单的一个方法就是使用OpenURL的方式,如下
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://需要发送的号码"]];
这个是最基础的调用原生组件的操作,比如打电话、打开网页、调用原生地图导航等等都可以使用openURL的方式
但是这个的一个明显缺点就是需要跳出当前程序,如果遇到需要监听用户操作,并且在程序内操作呢?其实苹果也帮我们想好了。
首先需要导入头文件
1.#import < MessageUI/MessageUI.h>
2.在需要调用发送短信的地方写上
if ([MFMessageComposeViewController canSendText]) {
// 判断一下是否支持发送短信,比如模拟器
MFMessageComposeViewController *messageVC = [[MFMessageComposeViewController alloc] init];
messageVC.recipients = @[@"10086"]; //需要发送的手机号数组
messageVC.body = @"发送的内容";
messageVC.messageComposeDelegate = self; //指定代理
[self presentViewController:messageVC animated:YES completion:nil];
} else {
[SVProgressHUD showErrorWithStatus:@"设备不支持短信功能"];
}
3.当前控制器遵从代理方法 MFMessageComposeViewControllerDelegate
这里可以看到代理方法只有一个
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result;
简单理解的话,就是调用发送结束后对其中操作结果的回调处理
typedef NS_ENUM(NSInteger, MessageComposeResult) {
MessageComposeResultCancelled,
MessageComposeResultSent,
MessageComposeResultFailed
} API_AVAILABLE(ios(4.0));
枚举MessageComposeResult,也只有三个结果:取消、点击了发送(并不一定发送成功)、失败
具体处理如下
#pragma mark MFmessageComposeViewControllerDelegate
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
if (result == MessageComposeResultCancelled) {
[controller dismissViewControllerAnimated:YES completion:nil];
} else if (result == MessageComposeResultFailed) {
[controller dismissViewControllerAnimated:YES completion:^{
[SVProgressHUD showErrorWithStatus:@"邀请发送失败,请稍后重试"];
}];
} else {
[controller dismissViewControllerAnimated:YES completion:^{
[SVProgressHUD showErrorWithStatus:@"邀请发送成功"];
}];
}
}
由此也就完成了发送短信的需求,如果是选择联系人呢?其实苹果也处理好了,东西在下面的头文件里面,如果需要的,也可以查看一下,用法相似
#import <Contacts/Contacts.h>
#import <ContactsUI/ContactsUI.h>