仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1932|回复: 19
打印 上一主题 下一主题

[学习教程] IOS编程之利用WebSharper和F#开辟挪动使用仓酷云

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:47:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
init指的是所有前面是init的方法比如UIView的初始化方法是-(id)initWithFrame:(CGRect)aRect在Objc里有很多这样关于函数命名的约定固然开辟挪动使用程序是一件辣手的事变,可是只需在入手下手阶段具有准确的偏向和手艺基本,统统城市变得分歧。在许很多多的手艺替换计划眼前,挪动使用开辟职员会不休地意想到,专攻于某个特定的平台将不再是可行之道。传统的原平生台(iOS,Android,WindowsPhone7,WindowsMobile等等)没需要弄得那末庞大,而且没需要流动到某个软件栈(softwarestack),由于后者不但进修曲线峻峭,并且必要办理很多成绩才干摸清它们各自平台的内涵接洽。假如没有充足强的驱动力,在那些原平生台长进行开辟的话,那末随后严密把持的使用程序开辟和发卖渠道会让事变变得更糟。
不外还好,最少有两种办法能够挣脱在原平生台上开辟的窘境。一种办法是接纳加倍熟习的编程言语和开辟情况,并将了局转换为原生代码(这一样平常产生在iOS上的开辟,如相似MonoTouch的办理计划)。在必定水平上,这类办法依附于进修相似的庞大API,和在API之长进行特别处置以完成准确映照,从而取得原生设备的才能。
另外一种办法是选择基于Web的挪动使用程序。固然它们的开辟情况有些糟糕,可是打消了对特定平台相干手艺的需求,并将使用程序放到基于通用的Web尺度(如HTML5,CSS3和JavaScript)基本之上,这年夜年夜简化了跨平台的扩大才能。但是我们从Web中学到的一件事变是:不克不及也不该当希冀它所能做的事变和供应的服务必需能被任何设备利用。你能够预期将来挪动平台版本和操纵体系会进一步含混传统的“原生”和“Web”使用程序之间的界线。
今朝,开辟基于Web的跨平台挪动使用程序已有了像PhoneGap,Rhomobile,和AppMobi的办理计划,它们依附于利用JavaScriptAPI表露原生设备功效,并经由过程在原生的Shell使用程序中运转上述API编写的代码来衬着Web使用程序。这听起来像是一个不错的发起,可是条件是必要利用JavaScript开辟。别的一种选择是基于范畴公用言语(DomainSpecificLanguage,DSL)。别的,InfoQ上有一篇文章会商了挪动Web使用程序开辟近况。
WebSharper

WebSharper旨在办理下面的一些成绩。起首,它可使用F#开辟全部Web和挪动使用程序,全部开辟历程不但能够享用F#简便的语法和壮大的函数式布局,还能够削减很多已往必要常常性编写的代码。其次,它为罕见的Web相干的噜苏事情供应了一系列丰厚的笼统及eDSL语法,比方组合HTML、界说Web表单、办理所需资本、平安地处置URL和其他很多事情。WebSharper之以是出格合适于年夜型企业级使用程序开辟,是由于这些笼统都是强范例的:比方,机关Web表单时发生毛病数据范例,或实验为毛病的输出控件增加表格考证,城市形成编译期毛病,这再次年夜年夜的延长了开辟工夫。
使用sitelet机关站点

WebSharper2.0引进了sitelet,它是范例平安的优等网站元素。sitelet界说在“action”团结范例之上,它包括了所暗示站点中全体网页/内容的汇合,还包括一个路由和一个把持器用作在举措(action)和实在的内容之间往返地映照URL哀求。
(点击图片举行缩小)

<br>
:WebSharperVisualStudio模板中的样例网页
上面是从安装后的WebSharper样例sitelet使用程序模板中抽取的一个复杂的Action范例,它界说了中元素较少的样例网页。
  1. ///Actionsthatcorrespondtothedifferentpagesinthesite.typeAction=|Home|Contact|Protected|Loginofoption<Action>|Logout|Echoofstring
复制代码
依据sitelet的服务目标(如REST服务),能够在个中到场恣意的内容,如前往恣意的包括XML或HTML内容的文件。假如必要对URL空间举行细粒度的把持、必要它们可以主动的从举动范例中推想出、或是利用个中一种战略经由过程把更小的sitelet分离在一同以满意两种需求,那末能够经由过程手工机关路由和把持器,
sitelet还带有一个范例平安的模板言语,该言语基于XML标志并利用特别的占位符。当你将后缀为.template.xml的文件到场到WebSharperVisualStudio办理计划中时,它们会被主动地转换为F#代码并包括在构建列表中。
上面显现了一样是来自于样例sitelet使用程序模板中的Skin.template.xml中的模板标注:
  1. <htmlxmlns="http://www.w3.org/1999/xhtml"><head><titlegt;Yoursitetitle</title><linkhref="~/themes/reset.css"rel="stylesheet"type="text/css"/><linkhref="~/themes/site.css"rel="stylesheet"type="text/css"/></head><body><div><divid="loginInfo">${LoginInfo}</div><divid="header"><divid="banner">${Banner}</div><divid="menu">${Menu}</div><divclass="closer"></div></div><divid="main-container"><divid="main">${Main}</div><divid="sidebar">${Sidebar}</div><divclass="closer"></div></div><divid="footer">${Footer}</div></div></body></html>
复制代码
上述模板会在默许的定名空间下创立一个叫做Templates.Skin的模块,用以组合标志片断到占位符中。思索上面的函数,它承受题目(title)和网页次要内容(main)作为参数,并利用天生的模板函数机关出网页:
  1. ///Atemplatefunctionthatrendersapagewithamenubar,basedontheSkintemplate.letTemplatetitlemain:Content<Action>=letmenu(ctx:Context<Action>)=[A[Action.Home|>ctx.Link|>HRef]-<[Text"Home"]A[Action.Contact|>ctx.Link|>HRef]-<[Text"Contact"]A[Action.Echo"Hello"|>ctx.Link|>HRef]-<[Text"SayHello"]A[Action.Protected|>ctx.Link|>RandomizeUrl|>HRef]-<[Text"Protected"]A["~/LegacyPage.aspx"|>ctx.ResolveUrl|>HRef]-<[Text"ASPXPage"]]|>List.map(funlink->Label[Class"menu-item"]-<[link])Templates.Skin.Skin(Sometitle){LoginInfo=Widgets.LoginInfoBanner=functx->[H2[Texttitle]]Menu=menuMain=mainSidebar=functx->[Text"Putyoursidebarhere"]Footer=functx->[Text"Yourwebsite.Copyright(c)2011YourCompany.com"]}
复制代码
这里的main是一个天生XML/HTML元素列表的函数,它与外部处置菜单的meanu函数相似。别的,还要注重一下context对象是如何使用管道运算符将各类分歧的Action映照到平安的URL上的(注:管道|>操纵符用来像函数发送参数,比方x|>f同等于f(x))。
你还能够界说各类小型的笼统范例,使你的使用程序代码变得加倍简便。上面是一个链接操纵符(=>),用作创立超链接:
  1. ///Ahelperfunctiontocreateahyperlinklet(=>)titlehref=A[HRefhref]-<[Texttitle]
复制代码
如今你能够在sitelet中界说主页了,以下:
  1. ///Thepagesofthiswebsite.modulePages=///Thehomepage.letHomePage:Content<Action>=Template"Home"<|functx->[H1[Text"Welcometooursite!"]"Letusknowhowwecancontactyou"=>ctx.LinkAction.Contact]...
复制代码
一旦界说好一切的页面,就能够创立一个sitelet来显现网站了。上面显现了三个更小的sitelet的组合:
  1. letEntireSite=//Asimplesiteletforthehomepage,availableattherootoftheapplication.lethome=Sitelet.Content"/"Action.HomePages.HomePage//Anautomaticallyinferredsiteletcreatedforthebasicpartsoftheapplication.letbasic=Sitelet.Infer<|funaction->matchactionwith|Action.Contact->Pages.ContactPage|Action.Echoparam->Pages.EchoPageparam|Action.Loginaction->Pages.LoginPageaction|Action.Logout->//LogoutuserandredirecttohomeUserSession.Logout()Content.RedirectAction.Home|Action.Home->Content.RedirectAction.Home|Action.Protected->Content.ServerError//Asiteletfortheprotectedcontentthatrequiresuserstologinfirst.letauthenticated=letfilter:Sitelet.Filter<Action>={VerifyUser=fun_->trueLoginRedirect=Some>>Action.Login}Sitelet.Protectfilter<|Sitelet.Content"/protected"Action.ProtectedPages.ProtectedPage//Composetheabovesiteletsintoalargerone.Sitelet.Sum[homeauthenticatedbasic]
复制代码
借助下面的sitelet,你所必要做的就是标注它为sitelet,然后,你瞧,你的站点能够在基于ASP.NET的Web容器里事情了(WebSharperVisualStudio模板供应了需要的Web.config修改):
  1. ///Exposethemainsiteletsoitcanbeserved.///ThisneedsanIWebsitetypeandanassemblylevelannotation.typeSampleWebsite()=interfaceIWebsite<SampleSite.Action>withmemberthis.Sitelet=EntireSitememberthis.Actions=[][<assembly:WebsiteAttribute(typeof<SampleWebsite>)>]do()
复制代码
Formlet——组合一流的范例平安表单

Formlet是比来一套来自学术界的情势系统,它是WebSharper不成支解的一部分。而WebSharper则是最后完成Formlet的几个框架之一。Formlet代表了一流的、范例平安的、可组合的数据表单,它与你大概一向在用的ASP.NET或其他Web框架中的非严厉范例的办法有着很年夜的分歧。WebSharper完成中包括了附属formlet,个中formlet的一部分附属于另外一部分,比方附属于多选项的下拉框或是输出框中的输出值;flowlets是一种定制的结构,它用来在一个formlet盘算表达式或F#一元布局中以一品种似导游的按次体例一步步衬着每个formlet。
上面是一个复杂的formlet,它前往一个字符串值,个中各类分歧的加强被增量式使用于其上:
  1. letnameF=Controls.Input""|>Validator.IsNotEmpty"Emptynamenotallowed"|>Enhance.WithValidationIcon|>Enhance.WithTextLabel"Name"
复制代码
Formlet能够被映照就任意范例的前往值上,比方一个百分比输出控件大概会前往0到100之间的浮点数值,大概一个组合框大概会天生可辨别团结(discriminatedunion)中的某品种型(大概有也大概没有标志值)。你能够用很多体例将多个较小的formelet组分解更年夜的formlet。最复杂的办法是利用Formlet.Yield函数将恣意范例的值封装成该范例的formlet,并分离<*>操纵符组合两个(或经由过程一连挪用组合多个)formlet:
  1. Formlet.Yield(funv1v2...vn-><composeallv’s>)<*>formlet1<*>formlet2...<*>formletn
复制代码
上面的例子展现了Formlet怎样猎取团体信息(姓名和邮件),并举行基础的客户端考证:
  1. typePerson={Name:stringEmail:string}[<JavaScript>]letPersonFormlet():Formlet<Person>=letnameF=Controls.Input""|>Validator.IsNotEmpty"Emptynamenotallowed"|>Enhance.WithValidationIcon|>Enhance.WithTextLabel"Name"letemailF=Controls.Input""|>Validator.IsEmail"Pleaseentervalidemailaddress"|>Enhance.WithValidationIcon|>Enhance.WithTextLabel"Email"Formlet.Yield(funnameemail->{Name=name;Email=email})<*>nameF<*>emailF|>Enhance.WithSubmitAndResetButtons|>Enhance.WithLegend"AddaNewPerson"|>Enhance.WithFormContainer
复制代码
显现了嵌进在sitelet页面后的了局。注重页面款式是由附属的CSS资本供应的,它会在援用formlet代码时主动加载到页面中(现实上,正确地说是产生在挪用Enhance.WithFormContainer时)。WebSharper中初级的依附性跟踪功效会在页面处于服务形态时为其主动搜集所依附的资本。这个功效十分便当,它为利用各类分歧的WebSharper扩大和利用第三方的JavaScript库节俭了大批的工夫和精神,而且它从基本上打消了手工跟踪页面所需资本的必要。

<br>
:包括考证和各类加强的复杂formlet
下面formlet例子中的[<JavaScript>]标注唆使WebSharper将代码段翻译为JavaScript。每一个控件中加强的考证器均为WebSharperformlet库的一部分,而且它们供应客户端考证,因而Validator.IsEmail将确保在formlet在抵达一种可承受形态前只键进了正当的邮件地点。你还能够挪用自界说的函数大概经由过程进一步增强手头的formlet来供应分外的考证。假如某个函数被标志为[<Rpc>]并从客户端代码中挪用,那末WebSharper将会天生代码实行RPC(远程历程挪用)并主动处置客户端和服务真个值传送。你能够无缝利用恣意庞大的F#对象,如嵌套列表(nestedlist)、映照(map)、汇合(set)或序列(sequence),而不必忧虑它们在外部被怎样映照。这一致了客户端和服务端代码,而且年夜年夜地削减了开辟工夫。现实上,客户端和服务端代码在开辟过程当中一般位于统一个F#文件中,只是它们被构造进统一定名空间下的分歧模块中。
很多WebSharper形式能够用来开辟客户端-服务器使用程序,我们一般倡议利用sitelet和formlet一同事情,并供应各类编码引导来最年夜限制地进步开辟职员的事情效力,可是你也能够借助WebSharper在大批的ASP.NET代码基本上开辟夹杂型的使用程序,大概基于WebSharper的功效改良现有的ASP.NET使用程序。
从笼统中构建来满意所需

偶然,你大概必要跳出尺度WebSharperformlet库的局限来为使用程序完成表单(大概全部UI)。比方,你大概想要利用分歧的输出控件来衬着formlet,由于复杂的CSS重写大概不克不及够满意你所想要的表面和感到。别的时分,你想重用现有的JavaScript控件库,如ExtJS,YUI,或是jQueryUI来失掉更精密的表面和感到。WebSharper为上述的第三方库供应了大批的扩大包,个中一些扩大包还供应了formlet笼统。
上面的冗长例子在jQuery挪动扩大中利用了Formlet,经由过程在Formlet.Do中利用flowlet结构和组合熟习的Formlet.Yield一同完成了两个步骤的登录序列:
  1. <htmlxmlns="http://www.w3.org/1999/xhtml"><head><titlegt;Yoursitetitle</title><linkhref="~/themes/reset.css"rel="stylesheet"type="text/css"/><linkhref="~/themes/site.css"rel="stylesheet"type="text/css"/></head><body><div><divid="loginInfo">${LoginInfo}</div><divid="header"><divid="banner">${Banner}</div><divid="menu">${Menu}</div><divclass="closer"></div></div><divid="main-container"><divid="main">${Main}</div><divid="sidebar">${Sidebar}</div><divclass="closer"></div></div><divid="footer">${Footer}</div></div></body></html>0
复制代码
你可使用需要的jQuery挪动功效将登录序列组合进HTML标志中(可使用多几行的代码将其很好地笼统出来),然后增加到sitelet页面上:
  1. <htmlxmlns="http://www.w3.org/1999/xhtml"><head><titlegt;Yoursitetitle</title><linkhref="~/themes/reset.css"rel="stylesheet"type="text/css"/><linkhref="~/themes/site.css"rel="stylesheet"type="text/css"/></head><body><div><divid="loginInfo">${LoginInfo}</div><divid="header"><divid="banner">${Banner}</div><divid="menu">${Menu}</div><divclass="closer"></div></div><divid="main-container"><divid="main">${Main}</div><divid="sidebar">${Sidebar}</div><divclass="closer"></div></div><divid="footer">${Footer}</div></div></body></html>1
复制代码
一旦你在WebSharper挪动项目中调剂挪动设置文件,发生了Android包(也能够选择WindowsPhone7),那末将其安装至手机,你会看到如所示的界面:

<br>
:运转在Android上的jQuery挪动formlet
利用WebSharper挪动API和第三方舆图控件

Formlet和sitelet年夜年夜简化了Web开辟和挪动开辟,而且供应了强健、范例平安且可组合的笼统来为使用程序的部分模块举行建模。WebSharpe中的另外一个基本笼统是pagelets,它由多个formlet搭建而成。pagelet代表了一流的、可组合的客户端标注及举动。WebSharper的pagelet不但与ASP.NET控件兼容,还能够间接嵌进到ASP.NET标志中。
上面的例子是完成了舆图控件的pagelet,运转了局如所示:
  1. <htmlxmlns="http://www.w3.org/1999/xhtml"><head><titlegt;Yoursitetitle</title><linkhref="~/themes/reset.css"rel="stylesheet"type="text/css"/><linkhref="~/themes/site.css"rel="stylesheet"type="text/css"/></head><body><div><divid="loginInfo">${LoginInfo}</div><divid="header"><divid="banner">${Banner}</div><divid="menu">${Menu}</div><divclass="closer"></div></div><divid="main-container"><divid="main">${Main}</div><divid="sidebar">${Sidebar}</div><divclass="closer"></div></div><divid="footer">${Footer}</div></div></body></html>2
复制代码

<br>
:经由过程Bing舆图控件和地点栏显现以后地位信息
该控件利用WebSharper挪动API猎取以后GPS地位。IntelliFactory.WebSharper.Mobile定名空间下另有很多有用工具用于底层挪动设备间的交互,包含猎取减速计数据,会见摄像头的才能和显现原生的告诫信息。将来版本的WebSharper挪动API也将会包括平台相干的扩大,如蓝牙通讯才能等等。
总结

假如你还没有效过X-to-JavaScript工具来匡助编写Web和挪动使用程序的话,你大概想晓得为何它们的数目会有云云之多,和是甚么缘故原由让人们想要往利用它们。WebSharper是一种针对F#的强健的Web开放框架,它正在被一些企业级使用程序主动利用。WebSharper办理了很多Web和挪动开辟中常常碰到的成绩,而且供应了浩瀚的功效,如平安URL,主动资本跟踪,客户端标注及功效中供应的范例平安且可组合的笼统,带有客户端考证的声明式Web表单和网站代价。
WebSharper2.3.28+更新和后续的2.4公布版本包括了用于挪动Web开辟的VisualStudio模板,利用模板你能够疾速实验和实行本文中的两个例子。你也能够在这里和这里下载到源代码,包含最初天生的Android包。
关于作者


<br>AdamGranicz
是F#的资深业内助士和中心社区成员,他与人合著过三本F#书本,包含与F#的言语计划者DonSyme合著的《ExpertF#2.0》。他的公司IntelliFactory专注于初级F#项目征询,并为利用F#举行Web、挪动和云端使用程序开辟塑造将来,公司还开辟了F#的首个Web开辟框架——WebSharper。你能够经由过程granicz.adam{at}intellifactory.com与他接洽,还能够存眷他的Twitter,大概在函数式编程地狱FPish里找到他。
检察英文原文:F#mobiledevelopmentwithWebSharper

以后一定会坚持多读些相关的书籍,在这里也要感谢一下“清源教育”的老师对我学习中极大的帮助,每次有不懂得问题,都及时得到了他们的回答。
蒙在股里 该用户已被删除
沙发
发表于 2015-1-21 14:12:00 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
分手快乐 该用户已被删除
板凳
发表于 2015-1-27 10:34:31 | 只看该作者
iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
活着的死人 该用户已被删除
地板
发表于 2015-2-3 12:12:51 | 只看该作者
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
兰色精灵 该用户已被删除
5#
发表于 2015-2-4 03:06:53 | 只看该作者
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
admin 该用户已被删除
6#
发表于 2015-2-4 20:30:50 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
乐观 该用户已被删除
7#
发表于 2015-2-5 11:36:00 | 只看该作者
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
海妖 该用户已被删除
8#
发表于 2015-2-7 06:28:55 | 只看该作者
开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦
小妖女 该用户已被删除
9#
发表于 2015-2-20 18:47:02 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
愤怒的大鸟 该用户已被删除
10#
发表于 2015-3-1 09:12:18 | 只看该作者
开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦
灵魂腐蚀 该用户已被删除
11#
发表于 2015-3-10 13:01:27 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
若天明 该用户已被删除
12#
发表于 2015-3-11 14:04:24 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
13#
发表于 2015-3-17 00:07:52 | 只看该作者
首先是基础,在汉昌的课程非常全面。从object—c到最后的毕业项目,基本上方方面面都涉及到了,我是一名非计算机专业的学生,起初学习还有点吃力,因为基础知识薄弱。经常像听天书
飘灵儿 该用户已被删除
14#
发表于 2015-3-23 07:32:35 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
爱飞 该用户已被删除
15#
发表于 2015-3-24 14:22:46 | 只看该作者
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
简单生活 该用户已被删除
16#
 楼主| 发表于 2015-3-27 23:10:48 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
因胸联盟 该用户已被删除
17#
发表于 2015-4-1 01:38:40 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
金色的骷髅 该用户已被删除
18#
发表于 2015-4-3 03:46:50 | 只看该作者
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
山那边是海 该用户已被删除
19#
发表于 2015-4-13 08:25:36 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
再现理想 该用户已被删除
20#
发表于 2015-4-14 07:40:49 | 只看该作者
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 04:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表