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!";
-
调用
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 {
-
在
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
-
选择
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]);
-
显示
NSOpenPanel,将用户在面板中的选择限制为数组中的文件类型,同时限制用户只能打开一个文件:
NSOpenPanel *theOpenPanel = [NSOpenPanel openPanel];
[theOpenPanel setAllowsMultipleSelection:NO];
result = [theOpenPanel runModalForTypes:theFileTypes];
-
使用
NSSound的initWithContentsOfFile方法加载用户在NSOpenPanel中选择的声音:
theFiles = [theOpenPanel filenames];
theFileName = [theFiles objectAtIndex:0];
NSSound *theSound = [[NSSound alloc] initWithContentsOfFile:theFileName byReference:YES];
- 像往常一样播放声音:
[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
-
修改
MyAudioController.m文件中playSoundFile方法的倒数第二行代码:
theSoundFile = [[NSSound alloc] initWithContentsOfFile:theFileName byReference:YES];
-
播放音频后,记得释放
theSoundFile:
[theSoundFile play];
[theSoundFile release];
-
实现
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应用开发。
超级会员免费看
13

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



