前面讲沙盒目录的时候说过,iOS应用都是被一个小箱子锁起来的独立个体,里面的数据出不来,外面的数据进不去,除了某些特殊的情况。博客传送门
我们在开发App的时候可以预留一些Api用来与其他应用进行交互,而对于系统应用来说,比如地图,相册,照相机这些预装应用,苹果也为我们提供了一些工具来访问它们。
那怎么做呢?
PS:以下代码大部分均需在真机上调试才有效果。
照片
使用照片应用,一般用来取照片或者保存照片,以下介绍这两种方法的实现。
取出照片
首先遵守协议
#import "ViewController.h" @interface ViewController () <UIImagePickerControllerDelegate,UINavigationControllerDelegate> @end
打开相册
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { NSLog(@"没有相册权限,请到设置中打开"); return; } UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; ipc.delegate = self; [self presentViewController:ipc animated:YES completion:nil];
实现协议方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info { [picker dismissViewControllerAnimated:YES completion:nil]; // 1.取出选中的图片 UIImage *image = info[UIImagePickerControllerOriginalImage]; }
保存图片
保存图片
UIImage *image = [UIImage imageNamed:@"testImage.jpg"]; UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
实现保存图片的方法(不需要遵守协议)
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { if(error != NULL){ NSLog(@"保存图片失败"); }else{ NSLog(@"保存图片成功"); } }
相机
有些App经常需要应用相机拍照的功能,该功能的使用和照片类似。
首先遵守协议
#import "ViewController.h" @interface ViewController () <UIImagePickerControllerDelegate,UINavigationControllerDelegate> @end
打开相机
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { NSLog(@"没有相机权限,请到设置中打开"); return; } UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; ipc.sourceType = UIImagePickerControllerSourceTypeCamera; ipc.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; ipc.delegate = self; [self presentViewController:ipc animated:YES completion:nil];
实现协议方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info { [picker dismissViewControllerAnimated:YES completion:nil]; // 1.取出选中的图片 UIImage *image = info[UIImagePickerControllerOriginalImage]; }
打电话
打电话有3种方式,推荐第三种方式。
直接跳转拨号界面拨打电话
NSString *num = [[NSString alloc] initWithFormat:@"tel://%@", @"10086"]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:num]];
拨号之前弹窗询问(私有Api,可能无法过审)
NSURL *url = [NSURL URLWithString:@”telprompt://10086”];
[[UIApplication sharedApplication] openURL:url];创建一个UIWebView来加载URL,拨完能自动回到原应用
UIWebView *webView = [[UIWebView alloc]init]; NSURL *url = [NSURL URLWithString:@"tel://10086"]; [webView loadRequest:[NSURLRequest requestWithURL:url ]];
发送短信
发送短信有两种方式。
直接跳转发短信界面发送短信
NSURL *url = [NSURL URLWithString:@"sms://10086"]; [[UIApplication sharedApplication] openURL:url];
使用MessageUI框架发送短信
首先包含头文件,然后遵守协议
#import <MessageUI/MessageUI.h> @interface ViewController () <MFMessageComposeViewControllerDelegate> @end
编写短信内容,设置收件人
// 判断是否允许发短信 if ([MFMessageComposeViewController canSendText]) { MFMessageComposeViewController *vc = [[MFMessageComposeViewController alloc]init]; //设置短信内容 vc.body = @"吃饭了没"; //设置收件人列表 vc.recipients = @[@"10010",@"10086"]; //设置代理 vc.messageComposeDelegate = self; //显示控制器 [self presentViewController:vc animated:YES completion:nil]; }
实现协议方法
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result { NSLog(@"发送完成"); }
发送邮件
发送邮件的方式和短信差不多,同样也有两种。
跳转邮件客户端
NSURL *url = [NSURL URLWithString:@"mailto://maizi@qq.com"]; [[UIApplication sharedApplication] openURL:url];
使用MessageUI框架发送邮件
首先包含头文件,然后遵守协议
#import <MessageUI/MessageUI.h> @interface ViewController () <MFMailComposeViewControllerDelegate> @end
编写邮件内容,设置收件人
// 判断是否允许发邮件 if ([MFMailComposeViewController canSendMail]) { MFMailComposeViewController *mvc = [[MFMailComposeViewController alloc] init]; //设置邮件主题 [mvc setSubject:@"测试会议"]; //设置邮件内容 [mvc setMessageBody:@"开会" isHTML:NO]; //设置收件人列表 [mvc setToRecipients:@[@"test@qq.com"]]; //设置抄送人列表 [mvc setCcRecipients:@[@"test1@qq.com"]]; mvc.mailComposeDelegate = self; [self presentViewController:mvc animated:YES completion:nil]; }
实现协议方法
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(nullable NSError *)error { if (error) { NSLog(@"发送失败"); } else { NSLog(@"发送成功"); } }
Safari打开网址
通过Safari打开网址只需要调用openURL:方法即可。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
打开App Store
跳转AppStore首页
NSString *str = [NSString stringWithFormat: @"itms-apps://itunes.apple.com"]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];
找到应用程序的描述链接,然后将
http://
替换为itms://
或者itms-apps://:
。或者在iTunes Connect中找到应用程序id进行拼接。NSString *str = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/app/id%@",appleID]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];