iOS - Phone 电话
2016-09-09
1230
简介:
1、调用电话
1.1 拨打系统电话
调用系统自带的打电话程序,要跳转到打电话程序,打完电话自动跳转回来。
在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + 系统中要实现应用间跳转还需要配置协议白名单。
1、调用电话
1.1 拨打系统电话
调用系统自带的打电话程序,要跳转到打电话程序,打完电话自动跳转回来。
-
在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + 系统中要实现应用间跳转还需要配置协议白名单。在发起跳转的 App 的 Info.plist 文件中增加一个 LSApplicationQueriesSchemes 字段,把它设置为数组类型,并配置需要跳转的协议名单。

URL 地址:tel://电话号码
-
iOS 系统版本 < 10.0
NSURL *url = [NSURL URLWithString:@"tel://10086"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"没有安装应用");
}
-
iOS 系统版本 >= 10.0
NSURL *url = [NSURL URLWithString:@"tel://10086"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
NSLog(@"没有安装应用");
}
1.2 拨打电话
-
在应用内部打电话,不需要跳出程序,完全在自己的程序中,打完电话自动跳转回来。
UIWebView *callWebView = [[UIWebView alloc] init];
NSURL *url = [NSURL URLWithString:@"tel:10086"];
[callWebView loadRequest:[NSURLRequest requestWithURL:url]];
[self.view addSubview:callWebView];
2、调用短信
2.1 调用系统短信
调用系统自带的信息程序,要跳转到信息程序,发完短信后不会跳转回来。
-
在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + 系统中要实现应用间跳转还需要配置协议白名单。在发起跳转的 App 的 Info.plist 文件中增加一个 LSApplicationQueriesSchemes 字段,把它设置为数组类型,并配置需要跳转的协议名单。

URL 地址:sms://电话号码
-
iOS 系统版本 < 10.0
NSURL *url = [NSURL URLWithString:@"sms://10086"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"没有安装应用");
}
-
iOS 系统版本 >= 10.0
NSURL *url = [NSURL URLWithString:@"sms://10086"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
NSLog(@"没有安装应用");
}
2.2 带内容发送短信
在应用内部发送短信,不需要跳出程序,完全在自己的程序中,发送短信后自动跳转回来。可以在程序中设置发送的短信内容。
-
添加 MessageUI.framework 框架。

-
在发起发送短信的视图控制器中
// 引入头文件
#import <MessageUI/MessageUI.h>
// 遵守协议
<MFMessageComposeViewControllerDelegate>
-
发送短信
if ([MFMessageComposeViewController canSendText]) {
MFMessageComposeViewController *messageVC = [[MFMessageComposeViewController alloc] init];
messageVC.messageComposeDelegate = self;
// 设置电话号码
messageVC.recipients = @[@"10086"];
// 设置短信内容
messageVC.body = @"话费余额";
// 调用系统发送短信界面
[self presentViewController:messageVC animated:YES completion:nil];
}
-
处理发送响应结果
// MFMessageComposeViewControllerDelegate 协议方法
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
[self dismissViewControllerAnimated:YES completion:nil];
if (result == MessageComposeResultCancelled) {
NSLog(@"Message cancelled");
} else if (result == MessageComposeResultSent) {
NSLog(@"Message sent");
} else {
NSLog(@"Message failed");
}
}
3、调用邮件
3.1 发送系统邮件
调用系统自带的邮件程序,要跳转到邮件程序,发完邮件后不会跳转回来。
-
在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + 系统中要实现应用间跳转还需要配置协议白名单。在发起跳转的 App 的 Info.plist 文件中增加一个 LSApplicationQueriesSchemes 字段,把它设置为数组类型,并配置需要跳转的协议名单。

URL 地址:mailto://邮件地址
-
iOS 系统版本 < 10.0
NSURL *url = [NSURL URLWithString:@"mailto://qq0228@163.com"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"没有安装应用");
}
-
iOS 系统版本 >= 10.0
NSURL *url = [NSURL URLWithString:@"mailto://qq0228@163.com"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
NSLog(@"没有安装应用");
}
3.2 带内容发送邮件
在应用内部发送邮件,不需要跳出程序,完全在自己的程序中,发送邮件后自动跳转回来。可以在程序中设置发送的邮件内容。
-
添加 MessageUI.framework 框架。

-
在发起发送邮件的视图控制器中
// 引入头文件
#import <MessageUI/MessageUI.h>
// 遵守协议
<MFMailComposeViewControllerDelegate>
-
发送邮件
if ([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init];
mailVC.mailComposeDelegate = self;
// 设置邮箱
[mailVC setToRecipients:@[@"qq0228@163.com"]];
// 设置邮件主题
[mailVC setSubject:@"Hello"];
// 设置邮件内容
[mailVC setMessageBody:@"Lorem ipsum dolor sit amet" isHTML:NO];
// 调用系统发送邮件界面
[self presentViewController:mailVC animated:YES completion:nil];
}
-
处理发送响应结果
// MFMailComposeViewControllerDelegate 协议方法
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
[self dismissViewControllerAnimated:YES completion:nil];
if (result == MFMailComposeResultCancelled) {
NSLog(@"Message cancelled");
} else if (result == MFMailComposeResultSent) {
NSLog(@"Message sent");
} else if (result == MFMailComposeResultSaved) {
NSLog(@"Message saved");
} else {
NSLog(@"Message failed");
}
}
4、调用地图
4.1 调用系统地图
-
在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + 系统中要实现应用间跳转还需要配置协议白名单。在发起跳转的 App 的 Info.plist 文件中增加一个 LSApplicationQueriesSchemes 字段,把它设置为数组类型,并配置需要跳转的协议名单。

URL 地址:maps://
-
iOS 系统版本 < 10.0
NSURL *url = [NSURL URLWithString:@"maps://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"没有安装应用");
}
-
iOS 系统版本 >= 10.0
NSURL *url = [NSURL URLWithString:@"maps://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
NSLog(@"没有安装应用");
}
5、调用浏览器
51 调用系统浏览器
-
在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + 系统中要实现应用间跳转还需要配置协议白名单。在发起跳转的 App 的 Info.plist 文件中增加一个 LSApplicationQueriesSchemes 字段,把它设置为数组类型,并配置需要跳转的协议名单。

URL 地址:http://网址 或:https://网址
-
iOS 系统版本 < 10.0
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"没有安装应用");
}
-
iOS 系统版本 >= 10.0
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
NSLog(@"没有安装应用");
}
6、调用应用商店
6.1 调用系统应用商店
-
找到应用程序的描述链接,然后将 http://
替换为 itms://
或者 itms-apps://
。比如:
http://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8
itms-apps://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8
itms://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8
-
URL 地址:itms-apps://网址 或:itms://网址
itms-apps:// // 调用系统 App Store 应用
itms:// // 调用系统 iTunes Store 应用
-
iOS 系统版本 < 10.0
NSURL *url = [NSURL URLWithString:@"itms-apps://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"没有安装应用");
}
-
iOS 系统版本 >= 10.0
NSURL *url = [NSURL URLWithString:@"itms-apps://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
NSLog(@"没有安装应用");
}
7、保存图片到相册
-
设置系统访问相册权限

-
保存图片到相册
// 将图片存储到相册中
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
// 将图片存储到相册中,完成后调用指定的方法
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
// 保存完成后调用的方法,必须为这个方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
}
8、访问通讯录
9、获取 wifi 信息
9.1 获取 wifi 名称信息
-
具体实现代码见 GitHub 源码 QExtension
#import <SystemConfiguration/CaptiveNetwork.h>
NSString * const BSSIDKey = @"BSSID";
NSString * const SSIDKey = @"SSID";
NSString * const SSIDDATAKey = @"SSIDDATA";
// 获取当前 Wifi 信息
+ (NSDictionary *)q_getCurrentWifiInfo {
NSDictionary *wifiDic = [NSDictionary dictionary];
CFArrayRef arrayRef = CNCopySupportedInterfaces();
if (arrayRef != nil) {
CFDictionaryRef dicRef = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(arrayRef, 0));
CFRelease(arrayRef);
if (dicRef != nil) {
wifiDic = (NSDictionary *)CFBridgingRelease(dicRef);
}
}
return wifiDic;
}
// 获取当前 Wifi 信息
NSDictionary *wifiInfo = [NSDictionary q_getCurrentWifiInfo];
NSLog(@"%@", wifiInfo);
NSString *bssid = wifiInfo[BSSIDKey];
NSString *ssid = wifiInfo[SSIDKey];
NSString *ssidData = [[NSString alloc] initWithData:wifiInfo[SSIDDATAKey] encoding:NSUTF8StringEncoding];
NSLog(@"%@\n %@\n %@", bssid, ssid, ssidData);
9.2 获取 IP 地址
-
具体实现代码见 GitHub 源码 QExtension
#import <arpa/inet.h>
#import <ifaddrs.h>
// 获取本地 IP 地址
+ (NSString *)q_getIPAddress {
NSString *address = @"error";
struct ifaddrs *interfaces = NULL;
struct ifaddrs *temp_addr = NULL;
int success = 0;
// retrieve the current interfaces - returns 0 on success
success = getifaddrs(&interfaces);
if (success == 0) {
// Loop through linked list of interfaces
temp_addr = interfaces;
while (temp_addr != NULL) {
if (temp_addr->ifa_addr->sa_family == AF_INET) {
// Check if interface is en0 which is the wifi connection on the iPhone
if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
// Get NSString from C String
address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
}
}
temp_addr = temp_addr->ifa_next;
}
}
// Free memory
freeifaddrs(interfaces);
return address;
}
// 获取本地 IP 地址
NSString *ipStr = [NSString q_getIPAddress];
NSLog(@"%@", ipStr);
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。