admin管理员组

文章数量:1531996

2024年3月11日发(作者:)

唐 山 学 院 毕 业 设 计

1引言

1.1选题背景

随着智能手机的大众化,越来越多的人应用手机。相对的对手机软件的需求也就越来越多。

当今时代手机不再只是用来打电话、发短信的工具,反而对手机的娱乐功能要求越来越高。手

机的一个重要的功能就是听音乐,一款好的手机音乐播放器可以更好的体现智能手机的强大。目

前中国音乐播放器行业已经具备了相当的规模,并在国际市场上已有一定的竞争力。苹果手机作

为当今中国智能手机市场上不可或缺的一个品牌,基于iOS的手机软件需求量也就相应的越来越

强。市场上的音乐播放器品牌繁多,定位不一,基本满足了各层次消费者的需求,例如:酷我音

乐、酷狗音乐、百度音乐、QQ音乐等等这些大家所熟知的音乐播放器已经在苹果软件中占据了

一定的地位。智能手机的应用使现代人的生活更加方便。

伴随着苹果手机进入中国市场,相应的iOS技术逐渐流行起来。而对于开发苹果应用的语言

—Object-C,也成为当今社会最流行的开发语言,并且保持着强劲的上升趋势,隐隐有超过C

语言的现象。对于其他的开发语言,例如java、javascripe,Object-C以其强大的优势遥遥领

先于这些其他的编程语言。本人根据当前的形式,决定引用这种这种技术来开发手机应用。

[1]

1.2设计目的及意义

听音乐已经成为当今社会,人们必不可少的一项娱乐活动。根据调查所得信

息,本人发现最近智能手机用户对较大的音乐播放器应用的喜爱度明显下滑,而

相对的那些小巧的音乐播放器反而被越来越多的用户下载使用。苹果系统的软件

具有的特点就是美观、简洁、易操作。根据这些信息,设计一款小巧的基于iOS

的音乐播放器会很容易得到用户的青睐。同时本人从去年开始接触iOS,在学习

了几个月后,对iOS开发有了一些理解,所以对于这次毕业设计,我就选择了基

于iOS系统开发一款产品。希望通过这次毕业设计来进一步巩固自己的iOS开发

水平。使自己在以后的社会竞争中更加具有优势。

1.3设计思想和目标

设计思想:自己的这款音乐播放器设计的过程是按照一般的应用开发流程进行的。自己首先

调查了当今社会,人们对音乐播放器的需求,从中得出现阶段手机用户需要的是小巧、方便的音

乐播放器。从而决定自己开发一款小巧的音乐播放器。在有了用户的需求后,本人开始开发属于

自己的音乐播放器。在真正设计音乐播放器的过程中,本人先决定了音乐播放器的整体框架结构,

应用的图片出处等等这些开发必需的部分。于是自己借鉴酷狗音乐的框架,开发一款精简的酷狗

音乐播放器。在决定了整体框架后,就是真正的开发了。自己将酷狗音乐中与播放无关的部分删

除,只保留他的播放功能,歌词显示功能音乐下载功能等等。下载功能的实现本人决定针对这款

音乐播放器设计出一个可供下载的网站以及服务器。

1

唐 山 学 院 毕 业 设 计

设计目标:虽说这款应用自己不打算上线,但自己依旧打算使其完美。拥有播放器的一般功

能,可以根据不同的歌曲显示不同的歌词,进度条根据时间显示播放进度,根据不同的音乐信息

进行选择,根据搜索到的歌曲信息,下载自己喜爱的歌曲。在完成这些功能的过程中来巩固自己

学到的知识

2

唐 山 学 院 毕 业 设 计

2 应用分析

2.1可行性分析

可行性分析也可称为可行性研究,是在网上调查的基础上并辅助其他的信息渠道,针对基

于iOS的音乐播放器的开发是否具备必要性和可能性。对新的音乐播放器的开发从技术、操作、

经济等不同方面进行分析研究,来保证投资的失误,保证音乐播放器的开发成功。就我们学的的

知识知道可行性分析可以在最短的时间内分析出这款基于iOS的音乐播放器是否可以达到预定

的效果。

(1)经济可行性分析:这款基于iOS的音乐播放器的开发是通过苹果系统的Xcode来进行

的。虽然本人不可能购买苹果笔记本来开发这款项目,但现阶段人们可以在不同的电脑上运行苹

果系统。那就是人们所说的黑苹果,通过一定的技术使非苹果笔记本也可运行苹果系统。开发音

乐播放器所需的图片,自己可以不通过专业人士来绘制。自己通过破解现有App store上的在线

应用,来获取自己想要的资源。并且这个过程很是简单,不存在浪费人力物力的现象。所以得出

开发一款基于iOS的音乐播放器在经济方面是可行的。

(2)技术可行性分析:开发基于iOS的音乐播放器运用到的技术是Object-C,以及一些iOS

开发的UI设计,某些类库的应用等等。就技术方面而言,自己学习iOS技术已经有四五个月的

基础了,相对于开发一款音乐播放器而言自己的技术是完全可以胜任的。而自己在黑苹果上装的

Xcode完全可以胜任这次开发的需求。从而分析得出开发这款音乐播放器在技术方面是可行的。

(3)社会可行性分析:开发这款音乐播放器,本人不是为了盈利的目的不会损害到任何人

的利益。这款音乐播放器虽有一部分按照酷狗音乐来完成,但自己不会发布出去,所以不会影响

到酷狗公司的利益。本人开发这款音乐播放器符合国家的方针政策,不影响任何组织的利益,没

有宗教方面的宣传同时不会影响社会稳定。所以可以得出本人开发基于iOS的音乐播放器在社

会方面是可行的。

所以,综上所述本人的基于iOS的音乐播放器的开发是可行的。

2.2需求分析

需求分析指的是在建立一个新的应用的时,就这个新的应用的目的、范围、定义及功能这

些方面所要做的工作。需求分析是完成一个应用必不可少的部分。在进行一款项目开发的过程中,

开发者必须确定客户的需求,在确定了客户需求后才能进行应用的开发。

根据当前社会形势,苹果系统在中国逐渐流行,单单是iOS方面的音乐播放器行业也已经

具备了相当的规模

[3]

。市场上的音乐播放器品牌繁多,定位不一,基本满足了各层次消费者的需

求。最新的调查显示比较大的音乐播放器市场,并不是很乐观。而外形新颖、小巧轻便灵活的迷

你音乐播放器却很受年轻人的青睐和欢迎。虽然国内的较大的音乐播放器销售状况不是很好,但

是迷你音乐播放器却是个例外,市场发展前景不容小觑。基于此,设计音乐播放器重点还是在于

美观的外形和其吸引人的性能,小体积却可以实现相对更大的功率,新型的迷你音乐播放器要有

3

唐 山 学 院 毕 业 设 计

其他的附加功能,可以更好的吸引用户。

2.3系统开发工具介绍

2.3.1

Objective-C

技术

Object-C是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用

OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。Objective-C可以在gcc

运作的系统写和编译,因为gcc含Objective-C的编译器。1980年代初布莱德·确斯在其公司

Stepstone发明Objective-C。他对软件设计和编程里的真实可用度问题十分关心,目前主要是编

写iOS操作系统应用程序的利器。近几年Objective-C排名大幅提升,它的流行当归功于iphone

的成功,因为Objective-C一直被用于编写iPhone应用程序

[4]

。Objective-C是非常实际的语言。

它是一个用C写成、很小的运行库,只会令应用程序的大小增加很小,和大部分OO系统使用

极大的VM执行时间会取代了整个系统的运作相反。ObjC写成的程序通常不会比其原始码大很

多。而其函式库亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反。

2.3.2

Xcode

开发工具

Xcode是开发人员建立基于iOS的应用最快捷的方式。Xcode是苹果公司向

开发人员提供的集成开发环境。其运行于苹果公司的Mac操作系统下。

不管你用C、C++、Objective-C或Java编写程序,在AppleScript里编写脚

本,还是试图从另一个奇妙的工具中转移编码,你会发现 Xcode 编译速度极快,

每次操作都很快速和轻松

[5]

苹果公司为用户提供了全套免费的Cocoa程序开发工具。Mac OS X一起发

行,在苹果公司官方的网站下载

[6]

2.3.3

SQLite

简介

SQLite是一款轻型的数据库

[7]

。是遵守ACID的关联式数据库管理系统,它

的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资

源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持

Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比

如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这

两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite

包含在一个相对小的C库中。它是dHipp建立的公有领域项目

[8]

。不像

常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连

接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接

API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库

都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事

4

唐 山 学 院 毕 业 设 计

务的时候锁定整个数据文件而完成的。

2.3.4

Visual Studio

简介

Visual Studio是微软公司推出的开发环境。是目前最流行的Windows平台应

用程序开发环境。Visual Studio 2010同时带来了 NET Framework 4.0、Microsoft

Visual Studio 2010 CTP,并且支持开发面向Windows 7的应用程序。除了Microsoft

SQL Server,它还支持 IBM DB2和Oracle数据库。Visual Studio中的编程语言

运行于.NET Framework中。Framework有助于基于Web和Windows的应用程序

开发,允许来自不同语言的对象共同运行,并标准化了语言引用数据和对象的方

式。Visual Studio .NET是微软公司推出的程序开发工作。和以前的Visual Studio

相比,Visual Studio .NET 是一个质的飞跃。C # 是Visual Studio .NET的重要组

成部分。在Visual Studio .NET 平台上使用C #语言可以开发出各种各样的应用

程序

[9]

。在.NET平台中,C#语言是一种脚本语言,即简化的C#语言。C#语言已

经通过国际标准组织的认证,成为一种国际标准的计算机语言。

.NET Framework 是用于生成、部署和运行应用程序的多语言环境。.NET Framework通过公

共语言运行库、.NET框架类库、Microsoft 中间语言、JIT即时编译等机制生成应用程序。

5

唐 山 学 院 毕 业 设 计

3应用总体设计

在经过可行性分析后本章将主要介绍应用的总体设计。应用所实现的功能的

强弱是衡量一款应用的标准。通过对音乐播放器的全面分析并结合调研的情况,

得出了这款音乐播放器的结构图与功能模块图。

3.1音乐播放器的功能模块概况

根据需求分析的结果得到音乐播放器的基本模块包括以下几个模块

(1)我的音乐模块:其中主要有本地音乐、我喜欢的音乐、最近播放的音

乐的几个部分组成。

(2)网络音乐模块: 该模块主要包括最新、歌单、排行榜、歌手等几部分

构成。

(3)更多更能模块:该模块主要包括换肤、意见反馈、设置及部分构成。

根据音乐播放器的功能分析可以画出音乐播放器的功能模块图,如图1所示

图 1 音乐播放器功能模块图

3.2音乐播放器各功能模块介绍

各功能模块介绍如下:

(1) 我的音乐模块

用户可以通过此模块来播放本地的音乐。具体播放功能包括音乐的演唱、歌

词的显示、播放进度的显示、歌曲的暂停、播放下一首等功能。用户可以通过本

6

唐 山 学 院 毕 业 设 计

地音乐列表将歌曲存储成我喜欢的音乐,同时在播放的过程中会将播放过的歌曲

名存储起来,对用户进行提示。

(2)网络歌曲模块

用户可以通过本模块进行选择网络上的音乐信息,同时用户可以将网络上的

歌曲下载到本地音乐中进行播放,用户根据不同的歌曲信息进行歌曲搜索,方便

了用户的使用。

(3)更多功能模块

用户可以通过此模块对本款音乐播放器进行换肤操作,更改本款音乐的皮

肤。用户可以通过意见反馈页面来提出自己的意见。相应的设置模块,用户可以

进行一些对本应用的操作,使本应用更加适合用户需求。

7

唐 山 学 院 毕 业 设 计

4音乐播放器详细设计

4.1音乐播放器界面设计

(1)我的音乐界面如图4-1所示

图4-1 我的音乐

用户可以通过此界面选择不同的信息。点击本地音乐可以进入音乐播放界

面,点击我喜欢可以进入我喜欢界面,其中的歌曲是自己从本地音乐界面中选取

出来的,而最近播放界面显示用户最近播放的歌曲。此界面部分相关代码如下:

- (void)viewDidLoad

{

mainTableViewArray=[[NSMutableArray alloc]initWithObjects:@"本地音乐

",@"iPod音乐",@"我喜欢",@"本地收藏",@"网络收藏",@"最近播放", nil];

UIView *vi=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 280, 480)];

[ addSubview:vi];

[vi setBackgroundColor:[UIColor colorWithRed:58/255.0 green:58/255.0

blue:58/255.0 alpha:1]];

lableOne=[[UILabel alloc]initWithFrame:CGRectMake(11, 72, 25, 120)];

=@"我的音乐";

teractionEnabled=YES;

ghted=YES;

[vi addSubview:lableOne];

lableTwo=[[UILabel alloc]initWithFrame:CGRectMake(11, 140+57, 25, 120)];

=@"网络音乐";

8

唐 山 学 院 毕 业 设 计

lor=[UIColor colorWithRed:200/255.0 green:200/255.0

blue:200/255.0 alpha:1];

teractionEnabled=YES;

[vi addSubview:lableTwo];

lableThree=[[UILabel alloc]initWithFrame:CGRectMake(11, 280+52, 25, 120)];

=@"更多功能";

lor=[UIColor colorWithRed:200/255.0 green:200/255.0

blue:200/255.0 alpha:1];

[vi addSubview:lableThree];

UITapGestureRecognizer *tapGestureOne=[[UITapGestureRecognizer

alloc]initWithTarget:self action:@selector(choseIt:)];

[lableOne addGestureRecognizer:tapGestureOne];

[tapGestureOne release];

}

此段代码得到具体含义是,加载初始界面并添加相关的手势来控制

mainTableViewArray显示的内容。随后在加载tableVIew的过程中运行

UITableview的方法即:

cellForRowAtIndexPath: 和didSelectRowAtIndexPath:

其中

cellForRowAtIndexPath是控制每一个cell所显示的内容,而

didSelectRowAtIndexPath则是在这些cell被点中时判断哪个被点中了,要运行

什么方法。

(2) 网络音乐界面如图4-2所示

图4-2 网络音乐界面

用户可以从此界面中选择网络相关的音乐。点击歌单会弹出歌单界面,其中

是各种流行的单曲。点击排行榜则会弹出当前的流行歌曲排行榜,同样点击歌手

则会弹出歌手界面。

9

唐 山 学 院 毕 业 设 计

此界面的代码是只要将最初的mainTableViewArray的显示内容改变了,并

通过相应的手势来达到内容的改变。手势方法相关的代码如下:

-(void)choseIt:(UITapGestureRecognizer *)tap

{

[mainTableViewArray removeAllObjects];

CGPoint point=[tap locationInView:];

if(CGRectContainsPoint(, point))

{

flag=0;

[array removeAllObjects];

mainTableViewArray=[[NSMutableArray alloc]initWithObjects:@"本地音乐

",@"iPod音乐",@"我喜欢",@"本地收藏",@"网络收藏",@"最近播放", nil];

ghted=NO;

ghted=NO;

ghted=YES;

ghtedTextColor=[UIColor whiteColor];

=CGRectMake(43, 68, 4, 120);

}

else if(CGRectContainsPoint(, point))

{

flag=1;

[array removeAllObjects];

mainTableViewArray=[[NSMutableArray alloc]initWithObjects:@"搜索",@"最

新",@"歌单",@"排行榜",@"歌手",@"分类",@"电台",@"MV", nil];

=CGRectMake(43, 197, 4, 120);

ghted=NO;

ghted=NO;

ghted=YES;

ghtedTextColor=[UIColor whiteColor];

}

else

{

flag=2;

[array removeAllObjects];

mainTableViewArray=[[NSMutableArray alloc]initWithObjects:@"仅在wifi下

联网",@"换肤",@"睡眠定时",@"wifi电脑传歌",@"91助手/iTools传歌",@"意见反馈

",@"设置",@"应用",nil];

=CGRectMake(43, 332, 4, 120);

ghted=NO;

ghted=NO;

ghted=YES;

ghtedTextColor=[UIColor whiteColor];

}

[tableVIew reloadData];

10

唐 山 学 院 毕 业 设 计

}

在此方法中不只改变了mainTableViewArray的内容,同时改变了选中字体的颜

色以及未选中字体的颜色。同时signImage的位置也发生相应的改变。

(3)更多功能界面如图4-3所示

图4-3 更多功能界面

用户可以在此界面进行播放器的设置,例如点击换肤则会弹出换肤界面,在

换肤界面会有三种皮肤供用户选择。点击意见反馈会弹出意见反馈界面,用户可

以通过此界面对本应用提出意见,并保存到相应的数据库中。点击设置会进入设

置界面用户可以进行相应的操作。

此界面的代码也与网络音乐界面的代码相同。

这三个界面内容显示在同一个UItableView上,其中我的音乐、网络音乐、

更多功能是三个UILable,即使用来显示文字的。将UILable的属性设置为可以

与用户交互后点击这三个UILable就可达到按钮的效果。将三个点击手势加到这

三个UILable上,设置运行方法。更改右侧的UItableView上显示的内容。同时

更改标志图片的位置,是应用显得更加美观。

(3)本地歌曲界面如图4-4所示

11

唐 山 学 院 毕 业 设 计

图4-4 本地歌曲界面

用户点击初始界面中的本地歌曲,就会弹出此界面。在这个界面中显示的是

存储在本地的歌曲名称。点击任何一个歌曲名字就可进行该歌曲的播放。在下面

的播放条中可以显示歌曲的总时间,歌曲名称以及播放歌曲的时间按。同时触动

向左滑动的手势,将会显示出歌曲的歌词。点击暂停/开始按钮可是歌曲暂停会

继续。点击下一首按钮将播放在本地列表中的下一首歌曲。

此界面的相关代码如下:

- (void)viewDidLoad

{

musicPlayBar=[[UIView alloc]initWithFrame:CGRectMake(0, 410, 320, 50)];

[faView addSubview:musicPlayBar];

imageOfMusic=[[UIImageView alloc]initWithFrame:CGRectMake(2, 2, 46, 46)];

=[UIImage

imageNamed:mageOfMusic];

teractionEnabled=YES;

[musicPlayBar addSubview:imageOfMusic];

smallProgressView=[[MyProgerss alloc]init];

=CGRectMake(51, 42, 250, 2);

[musicPlayBar addSubview:smallProgressView];

totalTime=[[UILabel alloc]initWithFrame:CGRectMake(51, 23, 80, 20)];

=@"00:00";

[musicPlayBar addSubview:totalTime];

UIView *sepView=[[UIView alloc]initWithFrame:CGRectMake(90, 28, 1, 10)];

[musicPlayBar addSubview:sepView];

=CGRectMake(100, 23, 80, 20);

=@"00:00";

12

唐 山 学 院 毕 业 设 计

[musicPlayBar addSubview:e];

startButton=[UIButton buttonWithType:UIButtonTypeCustom];

=CGRectMake(235, 10, 20, 20);

[startButton setBackgroundImage:[UIImage

imageNamed:@"playarticle_"] forState:UIControlStateNormal];

[startButton addTarget:self action:@selector(startMusic)

forControlEvents:UIControlEventTouchUpInside];

[musicPlayBar addSubview:startButton];

UIButton *nextButton=[UIButton buttonWithType:UIButtonTypeCustom];

=CGRectMake(275, 10, 20, 20);

[nextButton setBackgroundImage:[UIImage imageNamed:@"play_bar_"]

forState:UIControlStateNormal];

[nextButton addTarget:self action:@selector(nextMusic)

forControlEvents:UIControlEventTouchUpInside];

[musicPlayBar addSubview:nextButton];

musicArray=[[NSMutableArray alloc]initWithObjects:@"一眼万年",@"夜曲",@"最

炫民族风",nil];

musicNameArray=[[NSArray alloc]initWithObjects:@"一眼万年",@"夜曲",@"最炫

民族风",nil];

curMusicNumber=0;

faHeadView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];

=[UIImage imageNamed:@"navbar_bg@"];

teractionEnabled=YES;

[faView addSubview:faHeadView];

[faHeadView release];

faRightButton=[UIButton buttonWithType:UIButtonTypeCustom];

[faRightButton setBackgroundImage:[UIImage

imageNamed:@"nav-menu-icon@"] forState:UIControlStateNormal];

=CGRectMake(5, 5, 40, 30);

[faRightButton addTarget:self action:@selector(changeView:)

forControlEvents:UIControlEventTouchUpInside];

[faHeadView addSubview:faRightButton];

}

在本段代码中,对界面上添加了音乐播放条,并添加了用来显示总时间以及播放

时间的Lable,在播放条中添加开始(暂停)、下一首按钮。而显示歌曲名的

UITableView在最初的UITableView的didSelectRowAtIndexPath方法中生成。

相应的代码如下:

if(==0)

{

UITableView *localMusicTableView=[[UITableView

alloc]initWithFrame:CGRectMake(0, 0, 320, 386)];

te=self;

urce=self;

13

唐 山 学 院 毕 业 设 计

[totalBackView addSubview:localMusicTableView];

whichTableview=4;

[otherTableViewArray removeAllObjects];

[otherTableViewArray addObjectsFromArray:musicArray];

}

其中是判断点击了UITableView的哪一行,来进行下一步的操作

(4)我喜欢界面如图4-5所示

图4-5 我喜欢界面

用户在本地歌曲界面将某首歌曲设置为我喜欢,则这首歌曲的名字会存储到

我喜欢的界面中。

(5)最近播放界面如图4-6所示

图4-6 最近播放界面

14

唐 山 学 院 毕 业 设 计

用户点开此界面会显示出用户播放歌曲的历史记录,在不同时间播放了同一

首歌曲目录会自动删除较早的记录保留最新的播放记录。

此界面的相应代码如下:

else if(==5)

{

int j=[lastArray count];

=[NSString stringWithFormat:@"最近播放(%d)",j];

if(j==0)

{

UIImageView *im=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0,

320, 386)];

=[UIImage imageNamed:@"nillist_"];

[totalBackView addSubview:im];

[im release];

}

else

{

UIScrollView *sc=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0,

320, 386)];

tSize=CGSizeMake(320, 386*3);

for(int i=0;i

{

UILabel *la=[[UILabel alloc]initWithFrame:CGRectMake(0, i*30, 320,

30)];

=[lastArray objectAtIndex:i];

=[UIFont systemFontOfSize:14];

[sc addSubview:la];

[la release];

}

[totalBackView addSubview:sc];

}

}

}

在此段代码中包含了,在没有播放过音乐时显示那个界面,在播放了歌曲后

显示那个界面。

(6)歌单界面如图4-7 排行榜界面如图4-8 歌手界面如图4-9

15

唐 山 学 院 毕 业 设 计

图4-7 歌单界面 图4-8 排行榜界面

图4-9 歌手界面

用户在网络歌曲界面点击不同的内容会弹出不同的网络歌曲内容。这些内容

都是从真正的网上的得到的。本人封装了一个下载类,可以将网上的信息下载下

来显示到界面上。点击网络歌曲的不同内容弹出的信息都会出现在同一个界面

上。也就是在点击网络歌曲的某一内容时,显示界面的UItableView内容必须为

空,要实现点击不同内容显示不同信息就需要自己对每一个UItableView设置标

志变量,来区分到底该显示哪个UItableView。

这三个界面都用到了下载类,从自己抓取的网络上提取数据,并显示在相应

16

唐 山 学 院 毕 业 设 计

的界面中。重要代码如下:

-(void)downLoadFromUrl:(NSURL *)url

{

myData=[[NSMutableData alloc]init];

NSURLRequest *request=[NSURLRequest requestWithURL:url];

myConnection=[[NSURLConnection alloc]initWithRequest:request delegate:self];

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

[myData appendData:data];

}

-(void)connection:(NSURLConnection *)connection

didReceiveResponse :( NSURLResponse *)response

{

[myData setLength:0];

}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

{

if([delegate respondsToSelector:@selector(downLoadComplited:)])

{

[delegate downLoadComplited:self];

}

}

这段代码是下载类中的主要代码,以前下载使用的是名为ASI的第三方库,后来

自己改写成了用苹果自带的下载链接库来下载数据。将网上的数据下载成为

NSData性的数据,并保存起来,在主视图控制器的代码中应用。调用下载数据的

代码如下:

-(void)downLoadComplited:(HttpDownLoad *)hd

{

[saveArray removeAllObjects];

NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:

options:NSJSONReadingMutableContainers error:nil];

NSArray *musicListArray=[[NSArray alloc]init];

if(whichTableview==3||whichTableview==5)

{

musicListArray=[dict objectForKey:@"song_list"];

for(NSDictionary *sunDict in musicListArray)

{

NSString *str=[NSString stringWithFormat:@"%@",[sunDict

objectForKey:@"country"]];

MusicListItem *item=[[MusicListItem alloc]init];

mage=[sunDict objectForKey:@"pic_small"];

Title=[sunDict objectForKey:@"title"];

17

唐 山 学 院 毕 业 设 计

Lable=[NSString stringWithFormat:@"%@ %@",[sunDict

objectForKey:@"author"],str];

[saveArray addObject:item];

}

}

(7)皮肤界面如图4-10所示

图4-10 更改皮肤界面

用户可以通过此界面更改播放器的皮肤。有三种皮肤可供用户选择。由于该

音乐播放重点在精简、小巧,也就没有必要设置更多地颜色供用户自己选择。整

个应用运行在同一个viewcontroller上,所以对皮肤的改变只需设置下变量即

可,不必如那些拥有许多viewcontroller的应用运用通知来改变皮肤。

改变皮肤的代码如下:

-(void)NSNotification:(UIButton *)button

{

if(!=remberNumOfColor)

{

switch () {

case 500:

colorOfSkin=1;

=[UIImage

imageNamed:@"navbar_bg@"];

[faRightButton setBackgroundImage:[UIImage

imageNamed:@"nav-menu-icon@"] forState:UIControlStateNormal];

oundColor=[UIColor blackColor];

break;

case 501:

colorOfSkin=2;

18

唐 山 学 院 毕 业 设 计

=[UIImage

imageNamed:@"skin_pink_kg_nav_"];

oundColor=[UIColor blackColor];

[faRightButton setBackgroundImage:[UIImage

imageNamed:@"skin_pink_nav-menu-icon@"]

forState:UIControlStateNormal];

oundColor=[UIColor colorWithRed:218/255.0

green:102/255.0 blue:145/255.0 alpha:1];

break;

case 502:

colorOfSkin=3;

=[UIImage

imageNamed:@"voiceSlider_"];

[faRightButton setBackgroundImage:[UIImage

imageNamed:@"skin_black_nav-menu-icon_pressed@"]

forState:UIControlStateNormal];

break;

}

}

}

本段代码通过switch来判断点击了那个图片,进而决定作出相应的改变。

(8)意见反馈界面如图4-11所示

图4-11 意见反馈界面

用户可以通过此界面来对本款软件发表意见。在联网的状态下,用户可以将

反馈的意见发表到相关的数据库中。本人就可对此程序按照用户提出的意见来做

19

唐 山 学 院 毕 业 设 计

出相应的更改。

反馈界面的代码是将控件显示到界面上。并链接自己的数据库将要传输的信

息保存到自己的数据库。

(9)设置界面如图4-12所示

图4-12 设置界面

用户在此界面可以对本款音乐播放器进行相关的设置,用户可以查看此款音

乐播放器的信息,清空缓存的操作。

(10)音乐播放界面如图4-13所示

20

唐 山 学 院 毕 业 设 计

图4-13 音乐播放界面

用户在此界面可以通过点击歌曲名字来播放相应的歌曲,也可点击下面的开

始按钮或下一首按钮来播放歌曲。在黑色条中会显示出歌曲名称、歌曲总长度以

及播放时间的长度等等。

播放功能的具体代码如下:

-(void)startMusic

{

openOrClose++;

if(openOrClose%2==1)

{

[startButton setBackgroundImage:[UIImage

imageNamed:@"play_bar_"] forState:UIControlStateNormal];

[smallProgressView progressViewBegin];

=[musicArray objectAtIndex:curMusicNumber];

NSURL *audioFileUrl=[NSURL fileURLWithPath:[[NSBundle mainBundle]

pathForResource:[musicArray objectAtIndex:curMusicNumber] ofType:@"mp3"]];

audioPlay=[[AVAudioPlayer alloc]initWithContentsOfURL:audioFileUrl

error:nil];

te=self;

[audioPlay play];

[smallProgressView theTotalTimeOfMusic:on];

int i=(int)on/60;

int j=(int)on%60;

=[NSString stringWithFormat:@"%02d:%02d",i,j];

[lastArray addObject:[musicArray objectAtIndex:curMusicNumber]];

}

else

{

[startButton setBackgroundImage:[UIImage

imageNamed:@"playarticle_"] forState:UIControlStateNormal];

[smallProgressView progressViewStop];

}

}

播放功能的实现是通过AVAudioPlayer类库来实现的,其中audioFileUrl

是要播放音乐的本地路径。在播放的过程中通过自己封装的进度条类来判断歌曲

播放的时间。进度条的代码如下:

-(id)init

{

if(self==[super init])

{

21

唐 山 学 院 毕 业 设 计

e=[[UILabel alloc]init];

oundColor=[UIColor clearColor];

=[UIFont systemFontOfSize:12];

lor=[UIColor whiteColor];

}

return self;

}

-(double)theTotalTimeOfMusic:(double)totalTime

{

allTime=totalTime;

return allTime;

}

-(double)theTimeOfMusicRun

{

return theTimeHaveRun;

}

-(void)progressViewBegin

{

theTimeHaveRun=0.0;

if(theTimeHaveRun<=allTime)

{

time=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self

selector:@selector(changeProgressView) userInfo:nil repeats:YES];

}

}

-(void)progressViewStop

{

[time invalidate];

}

-(void)progressViewGoOnRunning

-(void)changeProgressView

{

theTimeHaveRun+=1.0;

if(theTimeHaveRun>allTime)

{

[time invalidate];

}

else

{

[self setProgress:theTimeHaveRun/allTime];

}

int i=(int)theTimeHaveRun/60;

int j=(int)theTimeHaveRun%60;

=[NSString stringWithFormat:@"%02d:%02d",i,j];

22

唐 山 学 院 毕 业 设 计

}

其中init方法是自动生成本身的元素,在此类中包含了进度条开始的方法,

进度条暂停的方法,进度条改变的方法,以及向其他的类传输数据的方法,例如

传输播放了多长的时间等等。

(11)歌词显示界面如图4-14所示

图4-14 歌词显示界面

用户可以在播放界面运用手势向左滑动来显示出此页信息,在本页可以显示

的歌词可以随着时间的进度来向上翻滚,最上面一行显示的是当前歌曲所唱的语

句。

歌词界面的代码如下:

-(id)init

{

if(self==[super init])

{

musicLicArray=[[NSMutableArray alloc]initWithCapacity:0];

totalLicArray=[[NSMutableArray alloc]initWithCapacity:0];

getAllOfMusicLrc=[[NSMutableArray alloc]initWithCapacity:0];

lineOfMusicLrc=0;

}

return self;

}

-(void)getTheMusicLicStr:(NSString *)str

{

23

唐 山 学 院 毕 业 设 计

musicLicArray=[NSMutableArray arrayWithArray:[str

componentsSeparatedByCharactersInSet:[NSCharacterSet

characterSetWithCharactersInString:@"[n"]]];

[musicLicArray removeObject:@""];

for(NSString *string in musicLicArray)

{

NSMutableArray *son=[[NSMutableArray alloc]initWithCapacity:0];

NSArray *arr=[string componentsSeparatedByString:@"]"];

NSArray *num=[[arr objectAtIndex:0]

componentsSeparatedByCharactersInSet:[NSCharacterSet

characterSetWithCharactersInString:@":."]];

CGFloat nu=[[num objectAtIndex:0]integerValue]*6000+[[num

objectAtIndex:1]integerValue]*60+[[num objectAtIndex:2]integerValue];

NSString *number=[NSString stringWithFormat:@"%.0f",nu];

//[son setObject:[arr objectAtIndex:1] forKey:number];

[son addObject:number];

[son addObject:[arr objectAtIndex:1]];

[totalLicArray addObject:son];

}

for(int i=0;i<[totalLicArray count];i++)

{

[getAllOfMusicLrc addObject:[[totalLicArray

objectAtIndex:i]objectAtIndex:1]];

}

}

-(NSString *)getTheTimeOfMusic:(double)time

{

double doi=time*100;

for(int i=0;i<[totalLicArray count];i++)

{

if(doi>=[[[totalLicArray

objectAtIndex:i]objectAtIndex:0]doubleValue]&&doi<[[[totalLicArray

objectAtIndex:i+1]objectAtIndex:0]doubleValue])

{

lineOfMusicLrc=i;

return [[totalLicArray objectAtIndex:i]objectAtIndex:1];

}

}

return nil;

}

-(NSMutableArray *)getTheTotilOfMusicLrc

{

return getAllOfMusicLrc;

}

24

唐 山 学 院 毕 业 设 计

-(NSInteger)getTheNmuberOfMusicLrc

{

return lineOfMusicLrc;

}

本段代码的运行过程是,在歌曲开始进行播放后,将播放的歌曲名传给此类,

此类从自己相应的地方得到全部的歌词。歌词是以lrc格式存储起来的,歌词类

得到全部歌词后,根据自己的相应方法,将全部的歌词分成一句句的显示在相应

的UITableView上。其中将全部歌词变成一句句的方法是getTheMusicLicStr。

此方法根据得到的歌词格式进行分割字符串,并将每一句以字符串的形式存储到

totalLicArray数组中。

4.2音乐播放器重要代码分析

在这款音乐播放器中主要的功能就是播放音乐,本人引用了苹果自带的库

AVAudioPlayer来播放歌曲。使用AVAudioPlayer时需要先生成一个对象,并伴

随着读取到要播放的歌曲路径。在设置完代理后就可播放歌曲了。AVAudioPlayer

提供了类方法duration来提取当前播放歌曲的总时长为多少。

在这个试图控制器中有个下载完成的方法,并且该视图控制器出卖了此方

法。而相对于类HttpDownLoad他没有下载完成的方法,但他遵守相应的协议,

就使他在下载完成后调用下载完成的方法。

歌词的显示是通过另外一个类来实现的既是MusicLic,在试图控制器中调用

该类,将要显示的歌词传给此类并将播放歌曲的时间传给此类。MusicLic就可

以根据时间的不同来显示不同的歌词。

上面说到传递时间给歌词类,其中时间的多少是有进度条类来决定的。

MyProgerss中有个计时器NSTimer,通过他来计算时间的多少,在计时器运行的

同时会调用计时器所启动的方法改变进度条的显示。进度条类从主视图控制器中

获取歌曲的总时间,来决定进度条总共代表了多长的时间。进度条中有进度条开

始,进度条继续的方法保证了在点击开始按钮或暂停按钮的时候进度条正常显

示。

25

唐 山 学 院 毕 业 设 计

5数据库设计

5.1 数据库需求分析

进行需求分析是设计数据库的起点,分析结果能否准确反映用户的实际需

求,将直接影响到后面各个阶段的设计价值以及影响到设计结果的合理性和实用

性的高低。在设计数据库结构时,应尽可能地满足用户所提出的各项要求,同时

又要避免冗余数据产生

[11]

。由于此次本人设计的是一款音乐播放器,其中有与网

络相的部分。本人通过对现有的音乐播放器抓取数据,只能得到其中一些表面的

数据无法得到其中歌曲具体的内容,以致不能实现。所以本人就设计一个可供自

己下载歌曲的服务器,并且保存用户的反馈意见。在定义的数据库中,

建立如下记录表:

1)

2)

3)

4)

5)

歌曲信息表,包含歌曲的名称、存储地址、歌曲格式;

歌词信息表,包含歌词名称和存储地址;

用户信息表,包含用户ID、用户名、用户密码以及反馈意见的具体内容;

历史信息表,包含歌曲名称、播放时间;

反馈意见表,包含用户ID、用户名、反馈意见;

5.2 数据库概念结构设计

(1)各个实体的E-R图

实体联系模型主要是由实体、属性以及实体之间的联系组成

[12]

。通过对现实世界的概念模型

的抽象,确立实体为歌曲、歌词、用户。根据音乐播放器的功能需求的分析结果,得出数据库的

E-R图如下所示:

图5-1 歌曲E-R图

26

唐 山 学 院 毕 业 设 计

图5-2 歌词E-R图

图5-3 用户E-R图

图5-4 播放歌曲E-R图

图5-5 反馈意见E-R图

5.3 数据库逻辑结构设计

根据数据字典中的数据存储、数据流、处理逻辑、实体的属性及以上数据库

设计中的概念结构设计模型,建立相关表进而得到数据库的逻辑结构设计,即数

据库表。

歌曲信息表(歌曲名称、存储位置、歌曲格式)

27

唐 山 学 院 毕 业 设 计

歌词信息表(歌曲名称、存储位置)

用户信息表(用户编号、用户名称、用户密码、反馈意见)

播放歌曲信息表(播放歌曲时间、播放歌曲名称)

反馈意见信息表(用户ID、用户名称、反馈意见)

进行数据库的详细设计,其基本表的设计如下:

(1) 歌曲信息表

歌曲信息表用来存储歌曲的信息,结构如下

表5-6 歌曲信息表

名称

songName

storePlace

storeStyle

数据类型

varchar

varchar

varchar

字段大小

50

MAX

20

备注

主键

是否为空

NOT NULL

NOT NULL

NOT NULL

说明

歌曲名称

存储地址

歌曲格式

(2) 歌词信息表

歌词信息表用来存放歌词信息,结构如下

表5-7

歌词信息表

名称

lyricName

storePlace

数据类型

varchar

varchar

字段大小

50

MAX

备注

主键

是否为空

NOT NULL

NOT NULL

说明

歌曲名称

存储位置

(3) 用户信息表

用户信息表用来存放用户信息,结构如下

表5-8

用户信息表

名称

userID

userName

userSeceret

userMessage

数据类型

varchar

varchar

varchar

varchar

字段大小

50

50

50

MAX

备注

主键

是否为空

NOT NULL

NOT NULL

NOT NULL

NOT NULL

说明

用户编号

用户名称

用户密码

反馈意见

(4) 播放歌曲信息表

播放歌曲信息表用来存放以播放的歌曲名称列表其结构如下

表5-9播放歌曲信息表

名称

songDate

songNamee

数据类型

varchar

varchar

字段大小

50

50

备注

主键

是否为空

NOT NULL

NOT NULL

说明

歌曲播放时间

歌曲名称

(5) 反馈意见信息表

反馈意见信息表用来存放反馈意见的表其结构如下

表5-10反馈意见信息表

名称

userID

userName

feedBackMessage

数据类型

varchar

varchar

varchar

字段大小

50

50

20

28

备注

主键

是否为空

NOT NULL

NOT NULL

NOT NULL

说明

用户编号

用户名称

反馈意见

唐 山 学 院 毕 业 设 计

6应用实施

基于iOS的音乐播放器的实施主要包括硬件结构的规划和系统测试两个部分。本阶段即使

成功完成播放器的功能,又得到系统稳定性的可靠的保证。

6.1 硬件结构规划与设计

本音乐播放器在性能上要求计算机能够支持苹果系统下的Xcode运行,同时支持SQL Server

2008和Visual Studio 2010的安装和运行具体要求可以参照如下设置:

1、硬件运行环境

环境 最小配置

物理内存 最小512MB,建议2GB

虚拟内存 RAM大小的两倍

临时磁盘空间 100MB

硬盘空间 40GB

视频适配器 256种颜色

处理器 最小200MHz,建议1GHz以上

2、软件运行环境

安装环境的体系架构、操作系统、网络协议等是Xcode以及SQL Server 2008的软件环境,

其具体要求如下:

软件项目 需求说明

系统体系构架 Intel(x86) 、AMD64 and Intel EM64T

操作系统 Windows 7版本,

Mac OS 系统

Windows Sever 2003的所有版本

网络协议 TCP/IP

6.2 系统测试

6.2.1测试目的

在项目完成后进行系统测试,可以保证所开发应用的流畅性、无错性、满足需求性。系统测

试是针对整个产品系统进行的测试,系统测试的过程中在发现问题之后,需要开发人员找出错误

原因和位置并改正

[13]

。系统测试的目的是找出与需求规格不符或与之矛盾的地方,从而提出更

加完善的方案。系统测试不仅仅是为了发现系统缺陷和错误,也是为了对系统整体质量水平进行

度量和评估。在开发软件系统的过程中,可能需要面对许多复杂繁琐的问题,在软件开发生存周

期的每个阶段都会不可避免地会产生错误。开发人员要在每个阶段完成之前进行严格的技术审

29

唐 山 学 院 毕 业 设 计

查,尽可能早的发现并纠正错误,以期达到比较完善的效果。

6.2.2测试方法

测试程序运用最多的就是所谓的白盒测试和黑盒测试了

[14]

。白盒测试就是对软件系统的相

关代码进行详细的测试,查看代码的正确性和书写规则是否正确等。黑盒测试是根据软件的规格

对软件进行的测试,黑盒测试与白盒测试正好相反,不需要考虑软件内部的组成结构,只需要对

软件整体进行测试。黑盒测试需要软件测试人员从用户的角度来进行各项功能测试,来检测系统

的可行性和可操作性,同时观察软件中存在的各种错误和缺陷

[15]

。黑盒测试的方法使测试人员

只关心系统是否能够满足用户的需求以及各种需求是如何实现的,并不关系系统的设计过程。

对音乐播放器的测试主要从以下几个方面进行:

1.代码测试:这款音乐播放器的代码测试采用的是正常数据、异常数据和错误数据轮换进行

测试的方法。例如:在意见反馈见面输入正确的文字、输入很大量的文字、或将图片当成内容添

到输入框中,查看程序的运行情况。

2.程序功能测试:对在音乐播放器进行大量的相同内容的操作,进行基本功能的体验,查看

是否完成了基本功能。例如在播放音乐的过程中点击其他的控件查看是否会影响到音乐的播放,

不断的点击开始/暂停按钮查看是否会是程序崩溃等等。

3.分调和总调结合测试:该测试是贯穿于整个系统测试思想中的,从开始涉及每一个功能模

块开始,到最终完成系统的整体功能模块设计,整个过程中,针对每个功能模块进行适当的测试

与修改,最后再将所有功能模块集成在整个系统中进行综合测试。

30

唐 山 学 院 毕 业 设 计

7 总结

在经过为期两个月的毕业设计后,基于iOS的音乐播放器的功能得以实现。在设计期间,进

一步了解到开发一款项目是一类非常复杂的工程。在开发之初就应该想好总体框架结构以及如何

进行每一步的操作。开发者需要有清晰地逻辑思路并以科学的方法来开发应用。

本设计的题目为“基于iOS的音乐播放器的设计与实现”。音乐播放器设计的主要内容是进

行音乐的播放、下载等功能模块的实现上。因此本人在这几方面花费的时间精力在总体设计的整

个系统中也就占有很大比重,耗费较长时间。为能够很好的实现系统设计目标,突出音乐播放器

所需实现功能,在开发过程中,由于自己开始没有思考全面导致后来开发程序的过程中出现了一

些偏差,以至于使自己引入了许多的变量来标志这些数组、UItableView。本人开发的这款音乐

播放器的特点是几乎所有的操作都在一个视图控制器中进行,而UItableView的显示、选择也只

能都在这一个视图中进行。使每一个产生的UItableView都只能运行这个控制器中的唯一的显

示、选择方法。在开发到最后发现自己在这控制器中添加标志变量的方法,很是繁琐,后悔开始

时为何不将UItalbeView单独写成一个类,在类中添加他自己的标志变量。这程序中所有的

UItableView,他们具有不同的关系,有的并列有的是父子关系甚至爷孙关系。自己需要记住他

们之间的关系,在运行程序的过程中与哪个引导出了哪个,以便程序可以按照原路返回。在开发

音乐播放器的过程中,本人封装了下载类、进度条类和歌词类,通过这些封装好的类方便了自己

的开发。而在开发的过程中面临的第二个问题就是自己不能得到现有播放器他们自己服务器的信

息。以至于本人只好写了一个小型的服务器供自己的音乐播放器的下载歌曲。

由于自己开发经验不足知识有限,在开发过程中出现了许多的代码的冗余现象。在设计中同

样遇到很多之前调试系统所没有遇到过的异常、错误信息。通过这次设计本人得到的启示是在开

发过程中要有清晰地设计思路,尽量简化设计,减少代码量,提高编程效率。同时通过这次的设

计使自己更好地了解到在知识方面的不足,明确今后需要努力的方向。

在这次开发的过程中,虽然自己遇到了很多的困难,但在老师的帮助下最终解决了这些问题,

在此感谢指导老师的精心指导,真诚的向老师表达真挚的谢意。

谢辞

在经过两个月的不懈努力自己终于完成了毕业设计,自己明显感觉到无论在知识方面、软件

应用方面还是遇到问题独立解决问题方面都有了很大的进步。在这里,我衷心的感谢帮助过我的

人们,感谢他们对我提供了宝贵的经验。在这款音乐播放器的开发设计过程中,我要感谢那些在

开发过程中对我寄予帮助的同学。由于自己忽视了同学们的意见以至后来开发过程中有了许多的

31

唐 山 学 院 毕 业 设 计

冗余代码。现在想来自己很是感到自己的狭隘,在这里感谢那位同学对自己提出的意见,即使自

己没有采纳他的方法。在经过这点错误后又有很多同学对我的毕业设计提出了他们独有的想法,

给了自己很大的灵感。对此我深表谢意,感谢同学们无私的同窗情谊、朋友情谊。

本次毕业设计是在刘印平老师指导下完成的。在设计过程中,刘老师仔细耐心地对我的毕业

设计任务及内容进行及时指导,并在最后对成果系统的设计说明书做出了全面、合理、仔细得修

改批注,竭尽全力帮助我完成本次的毕业设计任务。在这里,忠心表示对刘老师的悉心关怀和耐

心指导的无限感谢与感恩。更重要的是,在设计的过程,刘老师所具备的严谨求真为学的务实精

神,也是我之后无论是在学习还是在工作中的学习榜样。

最后,在这里,也要感谢在大学四年期间的所有任课老师,感谢他们教授于我的知识。正是

老师们的无私付出和认真负责使我摆正学习态度,树立人生目标不再虚度光阴浪费青春。最后再

一次在这里也对所有教过我的老师们表示衷心的感谢。

参考文献

[1] 叶佳俊 基于“云”技术的音乐播放器设计.中国量学院.2012

[2] [美] Dave Mark,Jack Nutting,Jeff LaMarche iOS 5基础教程.人民邮电出版

社.2012

[3] 冯冲 界面中的注意力设计 北京交通大学.2012

[4] [美] Stephen . Objective-C 程序设计[M].电子工业出版社.2012

[5] [美] Jonatban Zdziarski AppStore掘金. 人民邮电出版社.2010

[6] [美] Dave Mark,Jack Nutting,Jeff LaMarche. iOS基础教程[M].人民邮电出版

社.2012

[7] 王珊,萨师煊.数据库系统概论[M].北京:高等教育出版社,2006

32

唐 山 学 院 毕 业 设 计

[8] 金福生,李朴之. iOS应用程序开发方法与实践[M].北京: 人民邮电出版社,2012

[9] 陈禹.信息系统分析与设计[M].北京:高等教育出版社,2005

[10] Vandad Nahavandipoor iOS 6 Programming Cookbook

[11] Klehr.Objective-C 2 Mac and iOS development of practice guidelines[M].Wiley

Publishing,2012

[12] ce Hall.Management Information System[M].2008

[13] Brian X. Chen.Apple mania:iPhone open the always-on age Wiley Publishing

2012

[14] Carlo Chung.Objective-C programming way [M].Wiley Publishing,2011

[15] Jiva DeVoe.Good knowledge of Objective-C[M].Wiley Publishing,2012

33

本文标签: 音乐播放器开发用户界面