起因: 產(chǎn)品提個需求武鲁,調(diào)起短信頁面之后,要把短信內(nèi)容傳輸過去蝠检,且點擊取消要返回短信列表頁面沐鼠,而不是返回 APP。叹谁。饲梭。
下面來分步解決需求。需求可以分兩個部分:
1.講短信內(nèi)容傳輸?shù)蕉绦彭撁?br>
2.取消或發(fā)送后留在短信頁面
1.短信內(nèi)容傳輸?shù)蕉绦彭撁?/h4>
實現(xiàn)此功能焰檩,一般使用程序內(nèi)調(diào)用系統(tǒng)憔涉。首先將頭文件引入
#import <MessageUI/MessageUI.h>
實現(xiàn)代碼:
if( [MFMessageComposeViewController canSendText]) {
MFMessageComposeViewController * controller = [[MFMessageComposeViewController alloc] init];
controller.recipients = @[@"10086"];//發(fā)送短信的號碼,數(shù)組形式入?yún)? controller.navigationBar.tintColor = [UIColor redColor];
controller.body = @"body"; //此處的body就是短信將要發(fā)生的內(nèi)容
controller.messageComposeDelegate = self;
[self presentViewController:controller animated:YES completion:nil];
[[[[controller viewControllers] lastObject] navigationItem] setTitle:@"title"];//修改短信界面標題
}
else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示信息"
message:@"該設(shè)備不支持短信功能"
delegate:nil
cancelButtonTitle:@"確定"
otherButtonTitles:nil, nil];
[alert show];
}
如要獲取發(fā)送狀態(tài)析苫,遵守代理 MFMessageComposeViewControllerDelegate
并實現(xiàn)代理方法
-(void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
[self dismissViewControllerAnimated:YES completion:nil];
switch (result) {
case MessageComposeResultSent:
//信息傳送成功
break;
case MessageComposeResultFailed:
//信息傳送失敗
break;
case MessageComposeResultCancelled:
//信息被用戶取消傳送
break;
default:
break;
}
}
此方法優(yōu)點在于
1.發(fā)完短信或取消后能直接返回 APP
2.可將多個號碼傳輸?shù)蕉绦彭撁?/strong>
2.取消或發(fā)送后留在短信頁面
這個就很簡單啦兜叨,直接調(diào)用 openURL穿扳。發(fā)完短信或取消后將會到短信列表頁,不會直接返A(chǔ)PP国旷。但只能把一個號碼傳輸?shù)蕉绦彭撁?/strong>
NSString *phoneStr = [NSString stringWithFormat:@"10086"];//發(fā)短信的號碼
NSString *urlStr = [NSString stringWithFormat:@"sms://%@", phoneStr];
NSURL *url = [NSURL URLWithString:urlStr];
[[UIApplication sharedApplication] openURL:url];
至此矛物,兩個需求都分別完成,但是并沒有達到產(chǎn)品的要求跪但。經(jīng)過分析得知履羞,要停留在短信頁面,只能用采取第二種方法屡久。所以吧雹,接下來需要解決的是怎么才能用第二種方法把短信內(nèi)容傳過去尔苦。
觀察 openURL 傳入的參數(shù) sms://手機號碼蛛砰,這種格式于 url 有些相似,url 要拼接多個參數(shù)用 &郭蕉,所以可以嘗試一下在號碼后拼接一個參數(shù)蛤售。在第一種方法中丁鹉,短信內(nèi)容賦值給 body,所以嘗試把入?yún)⑵闯?sms://手機號碼&body=短信內(nèi)容悴能。就這樣完成需求揣钦。
NSString *phoneStr = [NSString stringWithFormat:@"10086"];//發(fā)短信的號碼
NSString *smsContentStr = [NSString stringWithFormat:@"短信內(nèi)容"];
NSString *urlStr = [NSString stringWithFormat:@"sms://%@&body=%@", phoneStr, smsContentStr];
NSURL *url = [NSURL URLWithString:urlStr];
[[UIApplication sharedApplication] openURL:url];
關(guān)于拼參數(shù)的方法,并不是所有都是顯而易見的漠酿,也遇到過很多問題:例如是要 & 還是用 ? 來拼接冯凹;短信內(nèi)容前是否需要帶參數(shù)名等等問題,經(jīng)常很多次嘗試最終才得到的結(jié)果炒嘲,深感不易宇姚。
2019.3.29 更新
之前一直沒注意傳輸中文, 會導(dǎo)致 URL 為 nil 的問題, 樓下有人提醒, 特此來修改
NSString *phoneStr = [NSString stringWithFormat:@"10086"];//發(fā)短信的號碼
NSString *smsContentStr = [NSString stringWithFormat:@"短信內(nèi)容"];
NSString *urlStr = [NSString stringWithFormat:@"sms://%@&body=%@", phoneStr, smsContentStr];
urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; // 對中文進行編碼
NSURL *url = [NSURL URLWithString:urlStr];
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
[[UIApplication sharedApplication] openURL:url];
}