iPhone 内置应用访问指南
1. 引言
iPhone 拥有一系列内置应用,如联系人、邮件、电话、Safari、短信和日历等,这些应用能满足用户的多种需求。作为开发者,可以利用 iPhone SDK 提供的各种 API 从自己的应用中以编程方式调用这些内置应用。本文将详细介绍如何在 iPhone 应用中调用这些内置应用以及与之交互。
2. 发送邮件
2.1 发送邮件的方式
iPhone 用户经常需要发送邮件,可通过内置的邮件应用来完成。该应用是一个功能丰富的 HTML 邮件客户端,支持 POP3、IMAP、Exchange 等邮件系统,以及 Yahoo! 和 Gmail 等大多数基于 Web 的邮件。在 iPhone 应用中发送邮件有两种方式:
- 构建自己的邮件客户端并实现与邮件服务器通信所需的所有协议。
- 调用内置的邮件应用来发送邮件。
除非你精通网络通信并熟悉所有邮件协议,否则选择调用邮件应用更为合理。
2.2 操作步骤
以下是使用邮件应用发送邮件的具体步骤:
1. 使用 Xcode 创建一个基于视图的应用项目,命名为 Emails。
2. 双击 EmailViewController.xib 文件,在 Interface Builder 中进行编辑。
3. 在视图窗口中添加以下视图:
- Label
- TextField
- Button
4. 在 EmailsViewController.h 文件中插入以下代码:
#import <UIKit/UIKit.h>
@interface EmailsViewController : UIViewController {
IBOutlet UITextField *to;
IBOutlet UITextField *subject;
IBOutlet UITextField *body;
}
@property (nonatomic, retain) UITextField *to;
@property (nonatomic, retain) UITextField *subject;
@property (nonatomic, retain) UITextField *body;
-(IBAction) btnSend: (id) sender;
@end
- 在 Interface Builder 中,按住 Control 键并拖动 File’s Owner 项到三个 TextField 视图,分别选择 to、subject 和 body。
- 按住 Control 键并拖动 Button 视图到 File’s Owner 项,选择 btnSend:。
- 在 EmailsViewController.m 文件中插入以下代码:
#import "EmailsViewController.h"
@implementation EmailsViewController
@synthesize to, subject, body;
- (void) sendEmailTo:(NSString *) toStr
withSubject: (NSString *) subjectStr
withBody: (NSString *) bodyStr {
NSString *emailString = [[NSString alloc]
initWithFormat:@"mailto:?to=%@&subject=%@&body=%@",
[toStr stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],
[subjectStr
stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],
[bodyStr stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:emailString]];
[emailString release];
}
-(IBAction) btnSend: (id) sender{
[self sendEmailTo:to.text withSubject:subject.text withBody:body.text];
}
- (void)dealloc {
[to release];
[subject release];
[body release];
[super dealloc];
}
- 按下 Command - R 在真机上测试应用。在 TextField 视图中填写必要信息后,点击发送按钮,将调用邮件应用并填充你在应用中输入的所有信息。在邮件应用中点击发送按钮即可发送邮件。
2.3 原理分析
调用邮件应用的关键在于
sendEmailTo:withSubject:withBody:
方法中创建的字符串:
NSString *emailString = [[NSString alloc]
initWithFormat:@"mailto:?to=%@&subject=%@&body=%@",
[toStr stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],
[subjectStr
stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],
[bodyStr stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
这是一个带有
mailto:
协议的 URL 字符串,将收件人、主题和正文等参数插入其中。使用
stringByAddingPercentEscapesUsingEncoding:
方法对参数进行编码,以确保最终结果是有效的 URL 字符串。调用邮件应用时,只需调用
sharedApplication
方法返回单例应用实例,然后使用
openURL:
方法调用邮件应用:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:emailString]];
[emailString release];
3. 调用 Safari
若要在 iPhone 上调用 Safari 浏览器,可使用 URL 字符串并调用应用实例的
openURL:
方法,示例代码如下:
[[UIApplication sharedApplication]
openURL:[NSURL URLWithString: @"http://www.apple.com"]];
上述代码将调用 Safari 打开
www.apple.com
页面。
4. 调用电话
使用 iPhone 的拨号器拨打电话,可使用以下 URL 字符串:
[[UIApplication sharedApplication]
openURL:[NSURL URLWithString:@"tel:1234567890"]];
此代码将调用 iPhone 的拨号器并使用指定的电话号码。需要注意的是,该代码仅适用于 iPhone,不适用于 iPod Touch,且需要在真机上测试,在 iPhone 模拟器上无效。
5. 调用短信
使用 URL 字符串可通过短信应用发送短信,示例代码如下:
[[UIApplication sharedApplication]
openURL:[NSURL URLWithString:@"sms:96924065"]];
上述代码将调用短信应用。同样,该代码仅适用于 iPhone,不适用于 iPod Touch,且需在真机上测试。
5.1 拦截短信
目前 iPhone SDK 的版本不支持在应用内拦截传入的短信,也不能直接在应用内发送短信,短信必须通过内置的短信应用发送,这可防止恶意应用在用户不知情的情况下发送短信。
6. 访问相机和照片库
6.1 访问选项
iPhone 和 iPod Touch 都配备了相机,可拍照和录制视频,拍摄的照片和录制的视频都保存在照片应用中。开发者有以下几种操作相机和访问照片应用中存储的图片和视频的方式:
- 调用相机拍照或录制视频。
- 调用照片应用,让用户从相册中选择图片或视频,然后在应用中使用所选的图片或视频。
6.2 访问照片库
6.2.1 操作步骤
可使用
UIImagePickerController
类以编程方式显示一个 UI,让用户从照片应用中选择图片和视频。以下是具体步骤:
1. 使用 Xcode 创建一个基于视图的应用项目,命名为 PhotoLibrary。
2. 双击 PhotoLibraryViewController.xib 文件,在 Interface Builder 中进行编辑。
3. 在视图窗口中添加以下视图:
- Button
- ImageView
4. 在 ImageView 视图的属性检查器窗口中,将模式设置为 Aspect Fit。
5. 在 PhotoLibraryViewController.h 文件中插入以下代码:
#import <UIKit/UIKit.h>
@interface PhotoLibraryViewController :
UIViewController
<UINavigationControllerDelegate,
UIImagePickerControllerDelegate> {
IBOutlet UIImageView *imageView;
UIImagePickerController *imagePicker;
}
@property (nonatomic, retain) UIImageView *imageView;
-(IBAction) btnClicked: (id) sender;
@end
- 在 Interface Builder 中,按住 Control 键并拖动 File’s Owner 项到 ImageView 视图,选择 imageView。
- 按住 Control 键并拖动 Button 视图到 File’s Owner 项,选择 btnClicked:。
- 在 PhotoLibraryViewController.m 文件中插入以下代码:
#import "PhotoLibraryViewController.h"
@implementation PhotoLibraryViewController
@synthesize imageView;
- (void)viewDidLoad {
imagePicker = [[UIImagePickerController alloc] init];
[super viewDidLoad];
}
- (IBAction) btnClicked: (id) sender{
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//---show the Image Picker---
[self presentModalViewController:imagePicker animated:YES];
}
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image;
NSURL *mediaUrl;
mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL];
if (mediaUrl == nil)
{
image = (UIImage *) [info valueForKey:UIImagePickerControllerEditedImage];
if (image == nil)
{
//---original image selected---
image = (UIImage *)
[info valueForKey:UIImagePickerControllerOriginalImage];
//---display the image---
imageView.image = image;
}
else //---edited image picked---
{
//---get the cropping rectangle applied to the image---
CGRect rect =
[[info valueForKey:UIImagePickerControllerCropRect] CGRectValue ];
//---display the image---
imageView.image = image;
}
}
else
{
//---video picked---
//...
}
//---hide the Image Picker---
[picker dismissModalViewControllerAnimated:YES];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
//---user did not select image/video; hide the Image Picker---
[picker dismissModalViewControllerAnimated:YES];
}
- (void)dealloc {
[imageView release];
[imagePicker release];
[super dealloc];
}
- 按下 Command - R 在 iPhone 模拟器上测试应用。
- 应用加载后,点击“Load Photo Library”按钮,iPhone 模拟器上会显示相册。选择一张图片,所选图片将显示在 ImageView 视图中。
6.2.2 原理分析
通过
UIImagePickerController
类可访问照片库,该类提供了在 iPhone 上选择和拍摄图片及视频的 UI。只需创建该类的实例并提供一个符合
UIImagePickerControllerDelegate
协议的委托即可。此外,委托还必须符合
UINavigationControllerDelegate
协议,因为
UIImagePickerController
类使用导航控制器让用户选择相册中的照片。当点击“Load Library”按钮时,设置
UIImagePickerController
类显示的选择器界面类型并以模态方式显示:
- (IBAction) btnClicked: (id) sender{
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:imagePicker animated:YES];
}
若希望用户选择图片时可编辑图片,可添加以下语句:
imagePicker.allowsImageEditing = YES;
默认情况下,源类型为
UIImagePickerControllerSourceTypePhotoLibrary
,也可将其更改为以下类型之一:
-
UIImagePickerControllerSourceTypeCamera
-
UIImagePickerControllerSourceTypeSavedPhotosAlbum
当用户选择图片或视频后,
imagePickerController:didFinishPickingMediaWithInfo:
事件将触发,可通过检查用户选择的媒体类型来处理该事件:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image;
NSURL *mediaUrl;
mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL];
if (mediaUrl == nil)
{
image = (UIImage *) [info valueForKey:UIImagePickerControllerEditedImage];
if (image == nil)
{
image = (UIImage *)
[info valueForKey:UIImagePickerControllerOriginalImage];
imageView.image = image;
}
else
{
CGRect rect =
[[info valueForKey:UIImagePickerControllerCropRect] CGRectValue ];
imageView.image = image;
}
}
else
{
//---video picked---
//...
}
[picker dismissModalViewControllerAnimated:YES];
}
若用户取消选择,
imagePickerControllerDidCancel:
事件将触发,此时只需关闭 Image Picker 即可:
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissModalViewControllerAnimated:YES];
}
6.3 访问相机
6.3.1 操作步骤
可修改之前创建的项目来访问相机,具体步骤如下:
1. 编辑 PhotoLibraryViewController.m 文件,将 Image Picker 的源类型更改为相机:
-(IBAction) btnClicked: (id) sender{
imagePicker.delegate = self;
//---comment this out---
//imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//---invoke the camera---
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.allowsImageEditing = YES;
[self presentModalViewController:imagePicker animated:YES];
}
- 在 PhotoLibraryViewController.h 文件中声明以下两个方法,以便将相机拍摄的图像保存到应用的 Documents 文件夹(在设备上):
#import <UIKit/UIKit.h>
@interface PhotoLibraryViewController : UIViewController
<UINavigationControllerDelegate, UIImagePickerControllerDelegate> {
IBOutlet UIImageView *imageView;
UIImagePickerController *imagePicker;
}
@property (nonatomic, retain) UIImageView *imageView;
-(IBAction) btnClicked: (id) sender;
- (NSString *) filePath: (NSString *) fileName;
- (void) saveImage;
@end
- 在 PhotoLibraryViewController.m 文件中定义上述声明的两个方法:
- (NSString *) filePath: (NSString *) fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:fileName];
}
- (void) saveImage{
NSData *imageData =
[NSData dataWithData:UIImagePNGRepresentation(imageView.image)];
[imageData writeToFile:[self filePath:@"MyPicture.png"] atomically:YES];
}
- 在 Xcode 中右键点击 Frameworks 组,选择“Add ➪ Existing Frameworks”,选择 Frameworks/MediaPlayer.framework。
- 在 PhotoLibraryViewController.h 文件中导入以下头文件:
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
- 插入以下代码:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image;
NSURL *mediaUrl;
mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL];
if (mediaUrl == nil)
{
image = (UIImage *) [info valueForKey:UIImagePickerControllerEditedImage];
if (image == nil)
{
image = (UIImage *)
[info valueForKey:UIImagePickerControllerOriginalImage];
imageView.image = image;
[self saveImage];
}
else
{
CGRect rect =
[[info valueForKey:UIImagePickerControllerCropRect] CGRectValue ];
imageView.image = image;
[self saveImage];
}
}
else
{
MPMoviePlayerController *player = [[MPMoviePlayerController alloc]
initWithContentURL:mediaUrl];
[player play];
}
//---hide the Image Picker---
[picker dismissModalViewControllerAnimated:YES];
}
- 按下 Command - R 在真机上测试应用。
- 点击“Load Photo Library”按钮,即可使用 iPhone 的相机拍照和录制视频。拍照后,照片将保存到应用的 Documents 文件夹中;录制视频后,可使用设备上的媒体播放器播放视频。
6.3.2 原理分析
将 Image Picker 的源类型修改为相机:
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
相机拍摄照片后,照片将在
imagePickerController:didFinishPickingMediaWithInfo:
方法中返回并显示在 ImageView 视图中。需手动将图像保存到手机上的某个位置,通过
filePath:
方法将图片保存到应用的 Documents 文件夹:
- (NSString *) filePath: (NSString *) fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:fileName];
}
saveImage:
方法提取 ImageView 视图上的图像数据,然后调用
filePath:
方法将数据保存到名为 MyPicture.png 的文件中:
- (void) saveImage{
NSData *imageData =
[NSData dataWithData:UIImagePNGRepresentation(imageView.image)];
[imageData writeToFile:[self filePath:@"MyPicture.png"] atomically:YES];
}
对于视频录制,iPhone 相机拍摄的视频将保存到设备上并作为 URL 返回,可使用
MPMoviePlayerController
类(在 MediaPlayer 框架中可用)播放视频:
MPMoviePlayerController *player = [[MPMoviePlayerController alloc]
initWithContentURL:mediaUrl];
[player play];
[player release];
7. 访问联系人应用
7.1 访问联系人
联系人应用是 iPhone 和 iPod Touch 常用的内置应用之一,可存储用户保存的联系人列表。可使用
ABPeoplePickerNavigationController
类从
AddressBookUI
框架中访问联系人应用。以下是具体步骤:
1. 使用 Xcode 创建一个基于视图的应用项目,命名为 AddressBook。
2. 在 Xcode 中右键点击 Frameworks 组,选择“Add ➪ Existing Frameworks”。
3. 选择 Frameworks/AddressBook.framework 和 Frameworks/AddressBookUI.framework,点击“Add”将它们添加到项目中。
4. 双击 AddressBookViewController.xib 文件,在 Interface Builder 中进行编辑。
5. 在视图窗口中添加一个 Button 视图。
6. 在 AddressBookViewController.h 文件中插入以下代码:
#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
@interface AddressBookViewController :
UIViewController
<ABPeoplePickerNavigationControllerDelegate> {
}
-(IBAction) btnClicked: (id) sender;
@end
- 在 Interface Builder 中,按住 Control 键并拖动 Button 视图到 File’s Owner 项,选择 btnClicked:。
- 在 AddressBookViewController.m 文件中插入以下代码:
#import "AddressBookViewController.h"
@implementation AddressBookViewController
-(IBAction) btnClicked: (id) sender{
ABPeoplePickerNavigationController *picker =
[[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
[self presentModalViewController:picker animated:YES];
[picker release];
}
- (void)peoplePickerNavigationControllerDidCancel:
(ABPeoplePickerNavigationController *)peoplePicker {
[self dismissModalViewControllerAnimated:YES];
}
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person {
NSString *str = (NSString *)ABRecordCopyValue(person,
kABPersonFirstNameProperty);
str = [str stringByAppendingString:@"\n"];
str = [str stringByAppendingString:(NSString *)ABRecordCopyValue(
person, kABPersonLastNameProperty)];
str = [str stringByAppendingString:@"\n"];
ABMultiValueRef emailInfo = ABRecordCopyValue(person, kABPersonEmailProperty);
for (NSUInteger i=0; i< ABMultiValueGetCount(emailInfo); i++) {
str = [str stringByAppendingString:
(NSString *)ABMultiValueCopyValueAtIndex(emailInfo, i)];
str = [str stringByAppendingString:@"\n"];
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Selected Contact"
message:str delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
[self dismissModalViewControllerAnimated:YES];
return NO;
}
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier {
[self dismissModalViewControllerAnimated:YES];
return NO;
}
-
若要在 iPhone 模拟器上测试应用,需确保联系人应用中至少有一个联系人填写了以下详细信息:
- 名字
- 姓氏
- 电子邮件
- 按下 Command - R 在 iPhone 模拟器上测试应用。点击“Load Contacts”按钮打开联系人应用,选择一个联系人,其详细信息将显示在警报视图中。
7.2 原理分析
使用
ABPeoplePickerNavigationController
类访问联系人应用,使用前需将 AddressBook 和 AddressBookUI 框架添加到项目中。需遵循
ABPeoplePickerNavigationControllerDelegate
协议,选择联系人后,可能会调用以下方法:
-
peoplePickerNavigationController:shouldContinueAfterSelectingPerson:
-
peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:
-
peoplePickerNavigationControllerDidCancel:
当点击取消按钮时,
peoplePickerNavigationControllerDidCancel:
方法将触发;点击联系人时,
peoplePickerNavigationController:shouldContinueAfterSelectingPerson:
方法将触发,可提取联系人的各种属性并使用
AlertView
类显示:
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person {
NSString *str = (NSString *)ABRecordCopyValue(person,
kABPersonFirstNameProperty);
str = [str stringByAppendingString:@"\n"];
str = [str stringByAppendingString:(NSString *)ABRecordCopyValue(
person, kABPersonLastNameProperty)];
str = [str stringByAppendingString:@"\n"];
ABMultiValueRef emailInfo = ABRecordCopyValue(person, kABPersonEmailProperty);
for (NSUInteger i=0; i< ABMultiValueGetCount(emailInfo); i++) {
str = [str stringByAppendingString:
(NSString *)ABMultiValueCopyValueAtIndex(emailInfo, i)];
str = [str stringByAppendingString:@"\n"];
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Selected Contact"
message:str delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
[self dismissModalViewControllerAnimated:YES];
return NO;
}
peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:
事件在点击联系人查看其属性时触发,仅当
peoplePickerNavigationController:shouldContinueAfterSelectingPerson:
方法返回 YES 时才会触发。在该事件中,返回 YES 可执行所选属性的操作并关闭选择器,返回 NO 则在选择器中显示该联系人。
7.3 添加联系人
可使用以下代码向联系人应用中添加新联系人:
-(void) addContact{
ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef person = ABPersonCreate();
ABRecordSetValue(person, kABPersonFirstNameProperty, @"Wei-Meng" , nil);
ABRecordSetValue(person, kABPersonLastNameProperty, @"Lee", nil);
ABMutableMultiValueRef address =
ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init];
[addressDictionary setObject:@"Some Street Name" forKey:(NSString *)
kABPersonAddressStreetKey];
[addressDictionary setObject:@"New York" forKey:(NSString *)
kABPersonAddressCityKey];
[addressDictionary setObject:@"NY" forKey:(NSString *)
kABPersonAddressStateKey];
[addressDictionary setObject:@"12345" forKey:(NSString *)
kABPersonAddressZIPKey];
[addressDictionary setObject:@"United States" forKey:(NSString *)
kABPersonAddressCountryKey];
[addressDictionary setObject:@"US" forKey:(NSString *)
kABPersonAddressCountryCodeKey];
ABMultiValueAddValueAndLabel(address, addressDictionary, kABHomeLabel, NULL);
ABRecordSetValue(person, kABPersonAddressProperty, address, nil);
ABAddressBookAddRecord(addressBook, person, nil);
ABAddressBookSave(addressBook, nil);
CFRelease(person);
}
该方法将添加一个包含以下信息的联系人:
- 名字
- 姓氏
- 家庭地址
- 街道
- 城市
- 州
- 邮编
- 国家
- 国家代码
7.4 删除联系人
可使用以下代码从联系人应用中删除联系人:
-(void) removeContact: (NSString *) firstName andLastName:(NSString *) lastName {
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex contactsCount = ABAddressBookGetPersonCount(addressBook);
for (int i = 0; i < contactsCount; i++)
{
// 查找匹配的联系人并删除
}
}
综上所述,通过上述方法,开发者可以在 iPhone 应用中方便地调用各种内置应用,并与之进行交互,为用户提供更丰富的功能体验。
8. 总结与对比
8.1 各功能操作总结
为了更清晰地展示前面介绍的各项功能的操作步骤和关键代码,下面以表格形式进行总结:
| 功能 | 操作步骤 | 关键代码 |
| — | — | — |
| 发送邮件 | 1. 创建项目命名为 Emails
2. 编辑 xib 文件添加视图
3. 在 .h 和 .m 文件插入代码
4. 真机测试 |
objc<br>- (void) sendEmailTo:(NSString *) toStr<br> withSubject: (NSString *) subjectStr<br> withBody: (NSString *) bodyStr {<br> NSString *emailString = [[NSString alloc]<br> initWithFormat:@"mailto:?to=%@&subject=%@&body=%@",<br> [toStr stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],<br> [subjectStr<br> stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],<br> [bodyStr stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];<br> [[UIApplication sharedApplication] openURL:[NSURL URLWithString:emailString]];<br> [emailString release];<br>}<br>
|
| 调用 Safari | 直接使用 URL 字符串调用 openURL: 方法 |
objc<br>[[UIApplication sharedApplication]<br> openURL:[NSURL URLWithString: @"http://www.apple.com"]];<br>
|
| 调用电话 | 使用 tel: 协议的 URL 字符串调用 openURL: 方法 |
objc<br>[[UIApplication sharedApplication]<br> openURL:[NSURL URLWithString:@"tel:1234567890"]];<br>
|
| 调用短信 | 使用 sms: 协议的 URL 字符串调用 openURL: 方法 |
objc<br>[[UIApplication sharedApplication]<br> openURL:[NSURL URLWithString:@"sms:96924065"]];<br>
|
| 访问照片库 | 1. 创建项目命名为 PhotoLibrary
2. 编辑 xib 文件添加视图
3. 在 .h 和 .m 文件插入代码
4. 模拟器测试 |
objc<br>- (IBAction) btnClicked: (id) sender{<br> imagePicker.delegate = self;<br> imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;<br> [self presentModalViewController:imagePicker animated:YES];<br>}<br>
|
| 访问相机 | 1. 修改 PhotoLibrary 项目代码
2. 导入 MediaPlayer 框架
3. 真机测试 |
objc<br>imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;<br>
|
| 访问联系人应用 | 1. 创建项目命名为 AddressBook
2. 添加 AddressBook 和 AddressBookUI 框架
3. 编辑 xib 文件添加视图
4. 在 .h 和 .m 文件插入代码
5. 模拟器测试 |
objc<br>-(IBAction) btnClicked: (id) sender{<br> ABPeoplePickerNavigationController *picker =<br> [[ABPeoplePickerNavigationController alloc] init];<br> picker.peoplePickerDelegate = self;<br> [self presentModalViewController:picker animated:YES];<br> [picker release];<br>}<br>
|
| 添加联系人 | 在代码中设置联系人信息并保存 |
objc<br>-(void) addContact{<br> ABAddressBookRef addressBook = ABAddressBookCreate();<br> ABRecordRef person = ABPersonCreate();<br> ABRecordSetValue(person, kABPersonFirstNameProperty, @"Wei-Meng" , nil);<br> ABRecordSetValue(person, kABPersonLastNameProperty, @"Lee", nil);<br> // ...<br> ABAddressBookAddRecord(addressBook, person, nil);<br> ABAddressBookSave(addressBook, nil);<br> CFRelease(person);<br>}<br>
|
| 删除联系人 | 遍历联系人列表查找匹配项并删除 |
objc<br>-(void) removeContact: (NSString *) firstName andLastName:(NSString *) lastName {<br> ABAddressBookRef addressBook = ABAddressBookCreate();<br> CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(addressBook);<br> CFIndex contactsCount = ABAddressBookGetPersonCount(addressBook);<br> for (int i = 0; i < contactsCount; i++)<br> {<br> // 查找匹配的联系人并删除<br> }<br>}<br>
|
8.2 功能调用流程对比
下面通过 mermaid 流程图来对比访问照片库和访问相机的流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(创建项目):::process
B --> C(编辑 xib 文件添加视图):::process
C --> D{访问类型}:::decision
D -->|照片库| E(设置 sourceType 为 PhotoLibrary):::process
D -->|相机| F(设置 sourceType 为 Camera):::process
E --> G(显示 Image Picker):::process
F --> H(导入 MediaPlayer 框架):::process
H --> I(设置允许编辑):::process
I --> G
G --> J(选择媒体):::process
J --> K{是否视频}:::decision
K -->|是| L(播放视频):::process
K -->|否| M(显示图片):::process
M --> N(保存图片):::process
L --> O([结束]):::startend
N --> O
从流程图可以看出,访问照片库和访问相机的前期步骤基本相同,主要区别在于
sourceType
的设置以及访问相机需要额外导入
MediaPlayer
框架和设置允许编辑。
9. 常见问题与解决方法
9.1 真机测试问题
- 问题描述 :部分功能(如发送邮件、调用电话、调用短信、访问相机)在 iPhone 模拟器上无效,需要在真机上测试。
- 解决方法 :按照相关附录(文档中提及但未详细说明,可自行查阅苹果官方文档)的指导,准备好 iPhone 进行测试,包括确保设备已正确连接到开发环境、开启开发者模式等。
9.2 联系人信息显示问题
- 问题描述 :在 iPhone 模拟器上测试访问联系人应用时,若联系人信息不完整(如未填写名字、姓氏、电子邮件),可能无法正常显示联系人详细信息。
- 解决方法 :在测试前,确保联系人应用中至少有一个联系人填写了完整的详细信息,包括名字、姓氏和电子邮件。
9.3 内存管理问题
-
问题描述
:在使用
UIImagePickerController、ABPeoplePickerNavigationController等类时,如果没有正确释放内存,可能会导致内存泄漏。 -
解决方法
:在
dealloc方法中释放相关对象的内存,例如:
- (void)dealloc {
[imageView release];
[imagePicker release];
[picker release]; // 对于 ABPeoplePickerNavigationController 相关
[super dealloc];
}
10. 实际应用场景与拓展
10.1 实际应用场景
- 社交应用 :在社交应用中,用户可能需要发送反馈邮件,此时可以调用邮件应用;还可以让用户从照片库选择头像,或者使用相机拍摄照片作为动态发布。
- 商务应用 :商务应用可能需要调用电话功能直接拨打电话联系客户,也可以访问联系人应用选择联系人进行沟通。
- 摄影应用 :摄影应用主要使用相机功能拍摄照片,并可以对拍摄的照片进行编辑和保存,同时也可以让用户从照片库选择已有照片进行后期处理。
10.2 拓展思路
- 自定义界面 :虽然可以调用内置应用,但可以根据应用的整体风格和需求,对调用界面进行一定的自定义,例如修改按钮样式、添加提示信息等。
- 数据处理 :在获取到联系人信息、照片、视频等数据后,可以进行更复杂的数据处理,如对照片进行滤镜处理、对联系人信息进行分类整理等。
- 多语言支持 :在调用内置应用时,可以根据用户的语言设置,显示不同语言的提示信息,提高用户体验。
11. 总结
本文详细介绍了在 iPhone 应用中调用各种内置应用的方法,包括发送邮件、调用 Safari、电话、短信,访问相机和照片库,以及访问联系人应用等功能。通过具体的操作步骤和代码示例,展示了如何实现这些功能,并对其原理进行了分析。同时,还总结了常见问题及解决方法,以及实际应用场景和拓展思路。希望这些内容能帮助开发者更好地利用 iPhone 的内置应用,为用户提供更丰富、便捷的应用体验。在实际开发过程中,开发者可以根据具体需求,灵活运用这些方法,并不断探索和创新,开发出更优秀的 iPhone 应用。
超级会员免费看
2450

被折叠的 条评论
为什么被折叠?



