注册 登录
主题 : Email 和 addressbook
级别: 新手上路
UID: 935
精华: 1
发帖: 15
可可豆: 586 CB
威望: 586 点
在线时间: 71(时)
注册时间: 2008-10-04
最后登录: 2012-12-21
0 楼:  发表于: 2009-02-18 00:10    发自: Web Page
来源于 iPhone类代码 分类

Email 和 addressbook    (在iOS代码库中浏览本帖)

管理提醒: 本帖被 lvyile 从 iPhone/iPod Touch开发一般讨论区 移动到本区(2009-08-27)
不知是放在这里还是资源里,抱歉。

我个人感觉 iphone的 addressbook api 还是有些难度。学起来费时费力,做了个例子给大家。希望可以节省一些时间和精力。

把你iphone 上的私有数据用email发出
注:simulator上没有mail, 只能看到界面。要是真发Email,还得用device。

1。建立个简易界面和一个button 叫 “send Email”(action:doEmail:)
2。在doEmail 里
建立ABPeoplePickerNavigationController作为察看address book 的界面。
把self 作为 ABPeoplePickerNavigationControllerDelegate 的delegate
3。实现3个 ABPeoplePickerNavigationControllerDelegate 的方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
不要被长名字吓倒,实现起来不难。
4。实现一个helper方法:-(void)sendDataViaEmail:(NSString*)email
//主要是建立一个mailto的NSString 我把一个2D的array加在body里面。这样就可以把你的local数据以email发出。

最后,codes是在main()里。这种style我不提倡。为了upload方便不得已。

--codes:
//
//  main.m
//  EmailMe
//
//  Created by 张海男 on 2/17/09.
//

#import 
#import 
#import 

@interface EmailMeViewController : UIViewController {
    NSMutableArray *data;
}
@end

@implementation EmailMeViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        self.title = @"Email me";
        self.tabBarItem.image = [UIImage imageNamed:@"about_tabBar.png"];
        
        //let's set up data first:
        data = [NSMutableArray arrayWithObjects:[NSMutableArray arrayWithObjects:@"front1",@"back1",@"date1",nil],
                [NSMutableArray arrayWithObjects:@"front2",@"back2",@"date2",nil],
                [NSMutableArray arrayWithObjects:@"front3",@"back3",@"date3",nil],
                [NSMutableArray arrayWithObjects:@"front4",@"back4",@"date4",nil],
                [NSMutableArray arrayWithObjects:@"front5",@"back5",@"date5",nil],nil];
        [data retain]; 
    }
    return self;
}

- (void) loadView {
    self.view = [[UIView alloc] init];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(doEmail:)];
}
-(IBAction) doEmail: (id) sender{
    ABPeoplePickerNavigationController *pplPicker = [[ABPeoplePickerNavigationController alloc]init];
    pplPicker.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonEmailProperty]];
    pplPicker.addressBook = ABAddressBookCreate();
    pplPicker.peoplePickerDelegate = self;
    [self presentModalViewController:pplPicker animated:YES];
    [pplPicker release];
}
-(void)sendDataViaEmail:(NSString*)email{
    //building email content:
    NSString *emailContent = @"This%20is%20an%20Email%20from%20ProjectBlah,%0A";
    for (int i = 0;i<[data count];i++){
        emailContent = [emailContent stringByAppendingString: [[data objectAtIndex:i]objectAtIndex:0]];
        emailContent = [emailContent stringByAppendingString: @"%20"];
        emailContent = [emailContent stringByAppendingString: [[data objectAtIndex:i]objectAtIndex:1]];
        emailContent = [emailContent stringByAppendingString: @"%20"];
        emailContent = [emailContent stringByAppendingString: [[data objectAtIndex:i]objectAtIndex:2]];
        emailContent = [emailContent stringByAppendingString: @"%20%0A"];
    }
    NSString *urlString = [NSString stringWithFormat: @"mailto:%@?subject=%@&body=%@",email,@"Your%20Card%20from%20ProjectBlah",emailContent];
    NSURL *url = [NSURL URLWithString:urlString];
    [[UIApplication sharedApplication] openURL:url];
}

#pragma mark ABPeoplePickerNavigationControllerDelegate
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
    [self dismissModalViewControllerAnimated:YES];
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
    return YES;
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
    ABMultiValueRef emails = ABRecordCopyValue(person, property);
    CFIndex emailIndex = ABMultiValueGetIndexForIdentifier(emails, identifier);
    CFStringRef email = ABMultiValueCopyValueAtIndex(emails, emailIndex);
    [self sendDataViaEmail:(NSString*)email];
    CFRelease(email);
    CFRelease(emails);
    
    [self dismissModalViewControllerAnimated:YES];
    return NO;
}
- (void)dealloc {
    [data release];
    [super dealloc];
}
@end

@interface EmailMeAppDelegate : NSObject  
{}
@end
@implementation EmailMeAppDelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after app launch
    EmailMeViewController *viewController = [[EmailMeViewController alloc] initWithNibName:nil bundle:nil];
    UINavigationController *nvc = [[UINavigationController alloc]initWithRootViewController:viewController];
    [viewController release];
    [window addSubview:nvc.view];
    [window makeKeyAndVisible];
}


- (void)dealloc {
    [super dealloc];
}
@end

int main(int argc, char *argv[]) {
    
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"EmailMeAppDelegate");
    [pool release];
    return retVal;
}

老猪 2009 02 17
[ 此帖被lvyile在2009-04-01 03:01 AM重新编辑 ]

清空我的评分动态本帖最近评分记录: 共威望条评分记录
gagaga 贡献值 +5 2008-09-19
隐藏评分记录
级别: 侠客
UID: 644
精华: 0
发帖: 60
可可豆: 1602 CB
威望: 1602 点
在线时间: 409(时)
注册时间: 2008-09-08
最后登录: 2011-05-12
1 楼:  发表于: 2009-02-18 14:02    发自: Web Page
楼主
为什么在 (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 方法中 实现发邮件的功能

而不是在- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person方法中实现

请教楼主
这两个方法有什么不同的
级别: 骑士

UID: 1285
精华: 0
发帖: 78
可可豆: 4784 CB
威望: 4784 点
在线时间: 1003(时)
注册时间: 2008-11-10
最后登录: 2018-10-05
2 楼:  发表于: 2009-02-18 16:22    发自: Web Page
在模拟器里可以看到mail的界面的吗?怎么我的好像不行啊。
级别: 新手上路
UID: 935
精华: 1
发帖: 15
可可豆: 586 CB
威望: 586 点
在线时间: 71(时)
注册时间: 2008-10-04
最后登录: 2012-12-21
3 楼:  发表于: 2009-02-19 13:47    发自: Web Page
抱歉,昨天没时间上网。

1。在模拟器里看不到mail的界面的, 要真机你才能送email。因为simulator里没有mail这个app

2。必须在头一个方法里实现发email的功能。因为你需要用(ABMultiValueIdentifier)identifier :
CFIndex emailIndex = ABMultiValueGetIndexForIdentifier(emails, identifier);

3。这两个方法有什么不同:他们被叫的次序不一样。短的那个方法先被叫。是在我们选了person后叫的。我们return YES 就是说继续向下一步走。把关于选好的这个人的具体信息显示出来 (你注意到了吗?我把其他info都略掉,就留了email address被显示)长的那个方法我们return NO,就是说不用显示email address的具体信息了,我们要送email了。这是第二个原因为什么一定要在长的那个方法里实现email功能。

老猪,
级别: 骑士

UID: 1285
精华: 0
发帖: 78
可可豆: 4784 CB
威望: 4784 点
在线时间: 1003(时)
注册时间: 2008-11-10
最后登录: 2018-10-05
4 楼:  发表于: 2009-02-19 14:54    发自: Web Page
引用
引用第3楼jonahocean于2009-02-19 13:47发表的  :
抱歉,昨天没时间上网。

1。在模拟器里看不到mail的界面的, 要真机你才能送email。因为simulator里没有mail这个app

2。必须在头一个方法里实现发email的功能。因为你需要用(ABMultiValueIdentifier)identifier :
.......


哦。原来如此。楼主真厉害。
级别: 侠客
状态: 连续签到 - [2天]
UID: 2716
精华: 0
发帖: 39
可可豆: 1161 CB
威望: 1413 点
在线时间: 1296(时)
注册时间: 2009-03-09
最后登录: 2019-03-20
5 楼:  发表于: 2009-03-11 15:31    发自: Web Page
回 3楼(jonahocean) 的帖子
请问楼主有没有办法可以提取出来Addressbook里联系人的电话和Email?
级别: 新手上路
UID: 1423
精华: 0
发帖: 4
可可豆: 95 CB
威望: 95 点
在线时间: 38(时)
注册时间: 2008-11-25
最后登录: 2009-04-10
6 楼:  发表于: 2009-03-11 16:57    发自: Web Page
回上楼  可以提取Addressbook里联系人的电话和Email 有的例子讲的 你找找例子
级别: 精灵王
UID: 16362
精华: 0
发帖: 528
可可豆: 5262 CB
威望: 5262 点
在线时间: 1062(时)
注册时间: 2010-03-29
最后登录: 2016-01-15
7 楼:  发表于: 2010-08-17 11:50    发自: Web Page
标记一下!
级别: 精灵王
UID: 16362
精华: 0
发帖: 528
可可豆: 5262 CB
威望: 5262 点
在线时间: 1062(时)
注册时间: 2010-03-29
最后登录: 2016-01-15
8 楼:  发表于: 2010-08-18 17:29    发自: Web Page
标记一下!!!
级别: 新手上路
UID: 29222
精华: 0
发帖: 44
可可豆: 440 CB
威望: 440 点
在线时间: 158(时)
注册时间: 2010-08-31
最后登录: 2013-06-08
9 楼:  发表于: 2010-10-25 16:55    发自: Web Page
呵呵,有没demo给个?先谢咯!

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部