17、Cocoa开发:网络邮件与多媒体功能实现

Cocoa开发:网络邮件与多媒体功能实现

1. Cocoa应用中的邮件发送功能

1.1 邮件功能的用途

在Cocoa应用中,邮件功能具有多种实用场景:
- 在关于框中提供联系邮件。
- 让用户能够自动发送错误报告。
- 在现有客户端中格式化邮件消息。
- 当然,不应该用于发送垃圾邮件。

1.2 从常用客户端发送邮件

当在互联网上点击邮件链接时,网页浏览器会指示邮件客户端打开新邮件,通常会自动填写收件人和主题字段。在Cocoa应用中添加此功能很简单,与在浏览器中加载URL的主要区别在于URL的格式。

普通浏览器URL格式:

http://www.wiley.com

邮件URL格式:

mailto:yourFriend@email.com

示例代码:

NSURL *theURL = [NSURL URLWithString:@"mailto:yourFriend@email.com"];
if ( [[NSWorkspace sharedWorkspace] openURL:theURL] )
    NSLog(@"Email Loaded");

如果要添加主题,可以在邮件URL末尾添加 ?subject= ,例如:

mailto:yourFriend@email.com?subject=Important Message

如果要同时给多个朋友发邮件,用逗号分隔地址:

mailto:yourFriend@email.com, anotherFriend@email.com?subject=Important Message

还可以通过简单的邮件URL设置抄送和密送,例如:

mailto:yourFriend@email.com?subject=Important Message?cc=otherFriend@email.com

需要注意的是,邮件客户端使用问号作为分隔符,如果主题中需要包含问号,必须使用十六进制字符编码,例如:

mailto:yourFriend@email.com?subject=Ready%3F

1.3 从自己的应用发送邮件

有时从常用客户端发送邮件可能不满足需求,例如创建邮件应用、无法保证用户安装了邮件客户端或不想使用额外的邮件客户端回复。

在Cocoa中从自己的应用发送邮件,需要先添加Message框架到项目中:
1. 选择 Project➪Add Frameworks 添加Message框架。
2. 在弹出的对话框中,选择位于 /System/Library/Frameworks Message.framework

添加框架后,就可以发送邮件了,步骤如下:
1. 创建代表邮件不同部分的 NSStrings

NSString *theEmailDest = @"youFriend@email.com";
NSString *theSubject = @"Important Message";
NSString *theBody = @"Hello there!";
  1. 调用 NSMailDelivery 类的 deliverMessage 方法:
if ( [NSMailDelivery deliverMessage:theBody subject:theSubject to:theEmailDest] )
    NSLog(@"Email Sent");
else
    NSLog(@"Email Not Sent");

1.4 为项目添加邮件功能

为了看到这些邮件功能的实际效果,回到之前创建的项目,打开 MainMenu.xib 文件,按以下步骤操作:
1. 添加两个新按钮到界面并命名,例如 Send Email with Client Send Email Manually
2. 添加一个 NSTextField 到界面,并添加文本标签提示用户在此输入目标邮件地址。
3. 添加一个控制器到项目:
- 从库窗口拖动一个 NSObject 到XIB项目窗口。
- 按 Ô+6 ,在身份检查器窗口中将类名改为 InternetController
4. 为类添加一个出口和两个动作:
- 在检查器窗口中,添加 emailField 出口,用于获取用户输入的邮件地址。
- 添加 sendEmailManually sendEmailWithClient 两个新动作。
5. 将界面连接到 InternetController 类:
- 从 Send Email with Client 按钮控制拖动到XIB项目窗口中的 InternetController 类,连接按钮到 sendEmailWithClient 动作。
- 从 Send Email Manually 按钮控制拖动到 InternetController 类,连接按钮到 sendEmailManually 动作。
- 从 InternetController 控制拖动到界面主窗口中的 NSTextField ,连接 emailField 出口。
- 在身份检查器窗口中点击 Connect 进行连接。
6. 点击 InternetController 类,选择 File➪Write Class Files 在Xcode中创建并添加类文件。
7. 在Xcode中修改 InternetContoller.h 中的代码:

// 原代码
@interface InternetController : /* Specify a superclass (eg: NSObject or NSView) */ {
// 修改后
@interface InternetController : NSObject {
  1. InternetController.m 中添加以下代码:
#import "InternetController.h"
#import <Message/NSMailDelivery.h>
@implementation InternetController
- (IBAction)sendEmailWithClient:(id)sender
{
    NSString *theURLString = @"mailto:";
    theURLString = [theURLString stringByAppendingString:[emailField stringValue]];
    NSURL *theURL = [NSURL URLWithString:theURLString];
    if ( [[NSWorkspace sharedWorkspace] openURL:theURL] )
        NSLog(@"Email Loaded");
}
- (IBAction)sendEmailManually:(id)sender
{
    NSString *theEmailDest = [emailField stringValue];
    NSString *theSubject = @"Important Message";
    NSString *theBody = @"Hello there!";
    if ( [NSMailDelivery deliverMessage:theBody subject:theSubject to:theEmailDest] )
        NSLog(@"Email Sent");
    else
        NSLog(@"Email Not Sent");
}
@end
  1. 选择 Build➪Build and Go 查看结果,如果项目成功发送邮件,在控制台窗口中会看到 Email Sent 消息。

2. Cocoa中的多媒体功能 - 音频部分

2.1 音频功能概述

Cocoa延续了Macintosh在多媒体方面的传统,为应用提供了丰富的音频处理工具。可以播放应用包中的声音、Mac OS X系统文件夹中的声音以及硬盘上任意位置的声音,并且能处理多种常见音频文件格式,如AIFF、MP3和WAVE。

2.2 播放系统声音

使用 NSSound 类播放声音通常遵循以下三个简单步骤:
1. 创建基于 NSSound 类的对象。
2. 将音频文件加载到 NSSound 对象中。
3. 播放音频。

通常可以将前两个步骤甚至三个步骤合并为一行代码,最简单的加载音频文件的方法是使用文件名。

示例:

NSSound *theSound = [NSSound soundNamed:@"banjo"];
[theSound play];

也可以播放Mac OS X系统文件夹中的声音,例如播放著名的Sosumi警报声:

NSSound *theSound = [NSSound soundNamed:@"Sosumi"];
[theSound play];

还可以将代码简化为一行:

[[NSSound soundNamed:@"Sosumi"] play];

2.3 加载和播放声音文件

如果应用需要播放用户选择的任意声音文件,可以按以下步骤操作:
1. 创建一个数组,使用 soundUnfilteredFileTypes 类方法填充Cocoa识别的所有声音文件类型:

NSArray *audioFileTypes = [NSSound soundUnfilteredFileTypes];

如果想查看Cocoa支持的声音文件类型,可以使用以下代码在控制台显示:

int i;
for (i=0;i<[theFileTypes count];i++)
    NSLog([theFileTypes objectAtIndex:i]);
  1. 显示 NSOpenPanel ,将用户在面板中的选择限制为数组中的文件类型,同时限制用户只能打开一个文件:
NSOpenPanel *theOpenPanel = [NSOpenPanel openPanel];
[theOpenPanel setAllowsMultipleSelection:NO];
result = [theOpenPanel runModalForTypes:theFileTypes];
  1. 使用 NSSound initWithContentsOfFile 方法加载用户在 NSOpenPanel 中选择的声音:
theFiles = [theOpenPanel filenames];
theFileName = [theFiles objectAtIndex:0];
NSSound *theSound = [[NSSound alloc] initWithContentsOfFile:theFileName byReference:YES];
  1. 像往常一样播放声音:
[theSound play];

如果需要允许用户选择多个音频文件,需要先允许 NSOpenPanel 进行多选:

[theOpenPanel setAllowsMultipleSelection:YES];

用户点击 OK 按钮后,遍历选择的音频文件:

theFiles = [theOpenPanel filenames];
int i;
for (i=0;i<[theFiles count];i++) {
    theFileName = [theFiles objectAtIndex:0]; 
    // 对该路径下的文件进行操作
}

2.4 构建简单的音频播放器

为了了解音频播放功能在项目中的实现,按以下步骤操作:
1. 在Xcode中创建一个新的Cocoa项目,打开项目后,双击 MainMenu.xib 文件在Interface Builder中编辑界面。
2. 在Interface Builder中,向界面主窗口添加三个 NSButton 控件,调整窗口大小并将三个按钮的标题属性分别改为 Play Application Sound Play System Sound Play Sound File
3. 在检查器窗口的属性部分,取消选择窗口的 Close Resize 复选框,避免用户误操作关闭窗口或调整窗口大小带来的问题。
4. 创建 MyAudioController 类:
- 打开库,搜索 Object ,将 NSObject 子类实例拖动到项目窗口。
- 按 Ô+6 ,将类名改为 MyAudioController
5. 选择 MyAudioController 类,打开身份检查器,在类动作部分点击 + 按钮添加三个动作,分别命名为 playAppSound: playSoundFile: playSystemSound:
6. 在Xcode中创建头文件和实现文件,选择 MyAudioController 类,选择 File➪Write Class Files
7. 回到Xcode,将一个AIFF文件(如 banjo.aiff )从Finder拖动到项目中。
8. 打开 MyAudioController.m 文件,添加以下代码:

#import "MyAudioController.h"
@implementation MyAudioController
- (IBAction)playAppSound:(id)sender
{
    // 播放项目中的声音文件
    NSSound *theSound = [NSSound soundNamed:@"banjo"];
    [theSound play];
}
- (IBAction)playSoundFile:(id)sender
{
    int result;
    NSArray *theFiles;
    NSString *theFileName;
    // 填充Cocoa可以使用的所有文件类型的数组
    NSArray *theFileTypes = [NSSound soundUnfilteredFileTypes];
    // 在控制台显示声音文件类型
    int i;
    for (i=0;i<[theFileTypes count];i++)
        NSLog([theFileTypes objectAtIndex:i]);
    // 创建并显示打开面板
    NSOpenPanel *theOpenPanel = [NSOpenPanel openPanel];
    // 允许用户一次只打开一个文件
    [theOpenPanel setAllowsMultipleSelection:NO];
    result = [theOpenPanel runModalForTypes:theFileTypes];
    if (result == NSOKButton) {
        // 用户选择的文件 - 这里只有一个
        theFiles = [theOpenPanel filenames];
        // 获取所选文件的路径
        theFileName = [theFiles objectAtIndex:0];
        // 创建、加载并播放音频文件
        NSSound *theSoundFile = [[NSSound alloc] initWithContentsOfFile:theFileName byReference:YES];
        [theSoundFile play];
    } 
}
- (IBAction)playSystemSound:(id)sender
{
    // 播放操作系统附带的声音文件
    NSSound *theSound = [NSSound soundNamed:@"Sosumi"];
    [theSound play];
}
@end

2.5 添加停止功能

如果要添加停止音频播放的功能,需要对代码进行一些修改:
1. 修改 MyAudioController.h 文件:

/* MyAudioController */
#import <Cocoa/Cocoa.h>
@interface MyAudioController : NSObject
{
    NSSound *theSoundFile;
}
- (IBAction)playAppSound:(id)sender;
- (IBAction)playSoundFile:(id)sender;
- (IBAction)playSystemSound:(id)sender;
- (IBAction)stopSoundFile:(id)sender;
@end
  1. 修改 MyAudioController.m 文件中 playSoundFile 方法的倒数第二行代码:
theSoundFile = [[NSSound alloc] initWithContentsOfFile:theFileName byReference:YES];
  1. 播放音频后,记得释放 theSoundFile
[theSoundFile play];
[theSoundFile release];
  1. 实现 stopSoundFile 动作:
- (IBAction)stopSoundFile:(id)sender
{
    if ([theSoundFile isPlaying])
        [theSoundFile stop];
}

2.6 连接动作到界面

虽然可以在Xcode中声明动作,但仍需要在Interface Builder中将动作连接到所需的界面元素,步骤如下:
1. 在Xcode的项目资源组中双击 MainMenu.xib 文件,返回Interface Builder。
2. 在Interface Builder的XIB项目窗口中选择 MyAudioController
3. 选择 File➪Read Class Files ,在提示中选择 MyAudioController.h ,Interface Builder会检查头文件的更改并更新NIB文件。
4. 从库窗口拖动一个按钮到界面主窗口,命名为 Stop Sound File

通过以上步骤,就可以在Cocoa应用中实现邮件发送和音频播放等多媒体功能。

3. 多媒体功能 - 视频及其他媒体格式

3.1 多媒体功能的魅力

在应用开发中,文本处理和文件创建固然实用,但多媒体功能更能为应用增添活力。Cocoa延续了Macintosh在多媒体方面的优良传统,为开发者提供了丰富的多媒体特性,让开发者可以轻松为项目添加复杂的多媒体功能。

3.2 播放视频

Cocoa可以方便地实现视频播放功能,通过构建一个简单的视频播放器应用,就能看到为Cocoa项目添加动态QuickTime内容是多么容易。而且,只需更改一行代码,就能实现对除QuickTime电影之外的多种媒体格式的(不)显示。

3.3 支持的媒体格式

Cocoa不仅能播放多种位置的音频文件,还能支持多种不同的音频文件格式,如AIFF、MP3和WAVE等。在过去,使用这些文件格式需要了解其具体信息,而Cocoa消除了这种需求,开发者无需了解文件格式的细节就能进行播放。

4. 总结与操作流程回顾

4.1 邮件发送功能总结

功能 操作步骤
从常用客户端发送邮件 1. 确定邮件URL格式,如 mailto:yourFriend@email.com
2. 创建 NSURL 对象,使用 NSWorkspace openURL 方法打开邮件。
从自己的应用发送邮件 1. 添加 Message.framework 到项目:选择 Project➪Add Frameworks ,在 /System/Library/Frameworks 中选择 Message.framework
2. 创建代表邮件不同部分的 NSStrings
3. 调用 NSMailDelivery 类的 deliverMessage 方法发送邮件。
为项目添加邮件功能 1. 打开 MainMenu.xib 文件。
2. 添加按钮和 NSTextField
3. 添加 InternetController 类。
4. 添加出口和动作。
5. 连接界面到 InternetController 类。
6. 创建并添加类文件。
7. 修改 InternetContoller.h InternetController.m 文件。
8. 选择 Build➪Build and Go 查看结果。

4.2 音频功能总结

功能 操作步骤
播放系统声音 1. 创建 NSSound 对象。
2. 加载音频文件。
3. 播放音频,可合并步骤为一行代码,如 [[NSSound soundNamed:@"Sosumi"] play];
加载和播放声音文件 1. 创建数组,使用 soundUnfilteredFileTypes 方法填充支持的文件类型。
2. 显示 NSOpenPanel ,限制选择文件类型和数量。
3. 使用 initWithContentsOfFile 方法加载声音。
4. 播放声音。
构建简单的音频播放器 1. 在Xcode中创建新的Cocoa项目,打开 MainMenu.xib 文件。
2. 添加按钮并设置标题。
3. 取消窗口的 Close Resize 属性。
4. 创建 MyAudioController 类。
5. 添加动作。
6. 创建头文件和实现文件。
7. 拖动AIFF文件到项目。
8. 在 MyAudioController.m 文件中添加代码。
添加停止功能 1. 修改 MyAudioController.h 文件,添加 stopSoundFile 动作。
2. 修改 MyAudioController.m 文件中 playSoundFile 方法的代码。
3. 播放音频后释放 theSoundFile
4. 实现 stopSoundFile 动作。
连接动作到界面 1. 返回Interface Builder,选择 MyAudioController
2. 选择 File➪Read Class Files ,选择 MyAudioController.h
3. 添加 Stop Sound File 按钮。

4.3 操作流程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
    A --> C(音频播放功能):::process
    B --> B1(从常用客户端发送邮件):::process
    B --> B2(从自己的应用发送邮件):::process
    B --> B3(为项目添加邮件功能):::process
    C --> C1(播放系统声音):::process
    C --> C2(加载和播放声音文件):::process
    C --> C3(构建简单的音频播放器):::process
    C --> C4(添加停止功能):::process
    C --> C5(连接动作到界面):::process
    B1 --> B11(确定邮件URL格式):::process
    B1 --> B12(创建NSURL对象并打开邮件):::process
    B2 --> B21(添加Message.framework):::process
    B2 --> B22(创建代表邮件部分的NSStrings):::process
    B2 --> B23(调用deliverMessage方法):::process
    B3 --> B31(打开MainMenu.xib文件):::process
    B3 --> B32(添加按钮和NSTextField):::process
    B3 --> B33(添加InternetController类):::process
    B3 --> B34(添加出口和动作):::process
    B3 --> B35(连接界面到InternetController类):::process
    B3 --> B36(创建并添加类文件):::process
    B3 --> B37(修改文件代码):::process
    B3 --> B38(查看结果):::process
    C1 --> C11(创建NSSound对象):::process
    C1 --> C12(加载音频文件):::process
    C1 --> C13(播放音频):::process
    C2 --> C21(创建数组填充文件类型):::process
    C2 --> C22(显示NSOpenPanel):::process
    C2 --> C23(加载声音):::process
    C2 --> C24(播放声音):::process
    C3 --> C31(创建新的Cocoa项目):::process
    C3 --> C32(打开MainMenu.xib文件):::process
    C3 --> C33(添加按钮并设置标题):::process
    C3 --> C34(取消窗口属性):::process
    C3 --> C35(创建MyAudioController类):::process
    C3 --> C36(添加动作):::process
    C3 --> C37(创建头文件和实现文件):::process
    C3 --> C38(拖动AIFF文件到项目):::process
    C3 --> C39(添加代码到MyAudioController.m):::process
    C4 --> C41(修改MyAudioController.h文件):::process
    C4 --> C42(修改MyAudioController.m文件):::process
    C4 --> C43(释放theSoundFile):::process
    C4 --> C44(实现stopSoundFile动作):::process
    C5 --> C51(返回Interface Builder):::process
    C5 --> C52(选择MyAudioController):::process
    C5 --> C53(选择File➪Read Class Files):::process
    C5 --> C54(添加Stop Sound File按钮):::process
    B11 --> B12
    B21 --> B22
    B22 --> B23
    B31 --> B32
    B32 --> B33
    B33 --> B34
    B34 --> B35
    B35 --> B36
    B36 --> B37
    B37 --> B38
    C11 --> C12
    C12 --> C13
    C21 --> C22
    C22 --> C23
    C23 --> C24
    C31 --> C32
    C32 --> C33
    C33 --> C34
    C34 --> C35
    C35 --> C36
    C36 --> C37
    C37 --> C38
    C38 --> C39
    C41 --> C42
    C42 --> C43
    C43 --> C44
    C51 --> C52
    C52 --> C53
    C53 --> C54
    B12 --> D([结束]):::startend
    B23 --> D
    B38 --> D
    C13 --> D
    C24 --> D
    C39 --> D
    C44 --> D
    C54 --> D

通过以上详细的介绍和总结,开发者可以清晰地了解在Cocoa应用中实现邮件发送和多媒体功能的方法和步骤,希望这些内容能帮助开发者更好地进行Cocoa应用开发。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值