iPhone的非Objective-C编程的状态是什么?

时间:2009-11-09 19:11:02

标签: iphone objective-c

在为我的工作学习Objective-C和Cocoa编程三周后,我的任务是研究iPhone开发的替代方案。

我知道两种现有的替代方案,以及未来的可能性。

C#

  • Xamarin(之前是MonoTouch)是一个C#.NET实现,具有针对iPhone特定功能的绑定,如触摸屏和加速度计。它与Xcode和Interface Builder集成,还允许自定义Objective-C绑定。

爪哇

  • alcheMo-for-iPhone生成从J2ME源代码为iPhone编译的C ++代码。它还提供触摸屏和加速度计绑定。

Flash / ActionScript 3

  • Adob​​e已宣布Flash Professional CS5将允许为iPhone部署Flash应用程序。目前尚无详细信息。

我想知道是否有人有这些经验。如果可能,我们公司正在考虑使用这些解决方案重用代码,而不是在Objective-C中重写相同的功能。

编辑:我知道不使用Objective-C和提供的框架的缺点。我想输入有经验的人可能的解决方案,而不是Objective-C更好的原因。

18 个答案:

答案 0 :(得分:22)

我对iPhone上的非ObjC语言持怀疑态度。不一定是因为有一些巨大的技术障碍需要克服(你可以将你想要的任何东西编译到iPhone上,甚至可以通过一些调整来运行),但还有其他两个重要原因:

  • 框架。虽然您列出的内容具有触摸屏和加速度计绑定,但您很可能会遗漏诸如蓝牙连接和游戏工具包,音频框架,应用程序内购买等内容。用另一种语言重现Apple提供的所有内容是非常困难的,如果你选择不同的方式然后最终需要其中一个框架,你可能会陷入困境。
  • 应用提交。如果你想在App Store上获得应用程序,你应该坚持使用ObjC。众所周知,Apple对于他们允许的内容非常挑剔,使用不同的语言可能以错误的方式打击某些审稿人。

你在代码签名/证书等问题上也会遇到很多问题,更不用说调试了(MonoTouch将调试广告作为一项功能,这让我感到很奇怪,而不是那种在理论上被认为是理所当然的东西。式语言)。

总而言之,如果可以,我会坚持使用ObjC。对于所有相关人员而言,这通常更容易。

更新:2010年9月New iOS terms of use embraces third party development, advertising platforms

答案 1 :(得分:6)

MonoTouch看起来不错,但速度极慢。我一直在上一代MacBook上玩XCode一段时间(2007年),它快速响应。我上周下载了MonoTouch,因为我希望将现有的大型Mono代码库转换为在iPhone上运行,并且在安装和运行良好的情况下使用它是非常痛苦的,因为IDE中的所有内容都是邋and且无响应。

YMMV如果你有更新更强大的套件,但它并不是好兆头。

答案 2 :(得分:5)

其他内置语言Javascript怎么样?

您可以在UIWebView中运行Web应用程序,也可以使用隐藏的UIWebView运行Javascript代码片段并检查其返回值以驱动您的本机应用程序。

优于第三方语言和框架的优势在于,Apple开发许可证明确允许您下载和运行javascript程序(当您使用其官方API执行此操作时)。

刚刚找到了这个Xcode插件,它提供了HTML和Javascript开发的原生应用程序:Nimble Kit。可能值得一看......

答案 3 :(得分:3)

Unity for iPhone是非ObjectiveC开发的良好平台。

http://unity3d.com/unity/features/iphone-publishing

它不仅仅是游戏,如果您需要.NET或其他脚本语言支持,这可能是一个很好的方法。

恕我直言:MonoTouch比一个好的IB + ObjectiveC堆栈更有效,即使有一些ObjectiveC的学习开销。

答案 4 :(得分:2)

如果没有选择Objective-C,您将在几个方面失败,看看它是唯一的Apple支持环境。

所有Apple的文档,示例代码,工具链等都假设您使用的是Objective-C。您将无法真正使用代码级支持事件。必须为您的环境包装任何新框架,这也会引入新的bug源。

对我而言,使用除Objective-C以外的其他东西可能会给iPhone带来很大的伤害。

答案 5 :(得分:2)

关于flash编译器,可能存在一些问题:

  • 已编译的二进制文件将其所有资源捆绑到已编译的应用程序中,而使用XCode,已编译的二进制文件将所有内容捆绑为单个文件。这可能会花费你太多的时间,因为Apple在某些资源(PNG等)上使用压缩技术来从另一端获取较小的二进制文件。更重要的是,操作系统使用的任何资源处理优化都不可用于Flash二进制文件中的资源。
  • 关于flash编译的iPhone二进制文件的可接受性已有一些讨论。 Adobe认为它们是合法的二进制文件,并且不违反iPhone应用程序二进制规则,服务条款等。当涉及到使应用程序感到紧张的应用程序时,Apple并不是因为在App Store中扮演仁慈的独裁者而闻名。直到它被Apple证明是公认的方法,告诫建设者

答案 6 :(得分:2)

App Store中目前有四个应用程序完全使用Squeak Smalltalk(及其上面的Seaside平台)编写,使用the VM created by John McIntosh(名称完全是巧合)。

答案 7 :(得分:2)

以下是我购买MonoTouch并将其作为所有iPhone应用程序基础的人的答案。

没有捷径。在考虑其他事情之前,您需要了解Objective-C和CocoaTouch。你不能抓住MonoTouch并开始为手机编码,而不知道原生的东西,它就不会发生。

如果您已经足够了解CocoaTouch和ObjC,MonoTouch很容易根据需要进行扩展/更改。因此,本机框架可能会发生变化,让您陷入困境的想法并不那么重要。

根据我的经验,我发现MonoTouch应用程序比本机应用程序慢,但不够重要。如果它确实重要,你总是可以使用本机代码编写应用程序的那一部分,并且可能ObjC无论如何都不够快,你甚至想要在本机应用程序中使用纯C语言。

MonoTouch让我获得了一些显着的生产力提升,从能够使用简洁易懂的语言到能够使用像Rhino Mocks和NUnit这样的库开箱即用。

MonoDevelop理论上是一个很棒的IDE。从理论上讲,它也远远优于xcode。它轻巧,简单,易于使用,出色的智能感知和宏,使管理iPhone项目比xcode更容易。但是......这真的很麻烦。这就是现在的真正垮台。

答案 8 :(得分:1)

如果您想为自己的网站制作应用,网络应用也是一个非常好的选择。许多硬件通过一些即将推出的HTML5-API和PhoneGap exposes some more for you

公开

如果您只想在网络上托管Apple,可以避免Apple批准过程,或者您可以使用UIWebView加载您的Web应用程序将其添加到App Store。 PhoneGap can help you with this also

另一个问题是专门询问iPhone的Web应用程序框架,它列出了许多优秀的替代框架:Available iPhone Web Application JavaScript UI Library/Frameworks

由于WebKit本身在iPhone上解释JavaScript,Apple也批准这些应用程序(取决于质量)。 iPhone上的浏览器是目前移动手机上最好的浏览器之一,但它们并不是唯一的浏览器。通过一些额外的工作,您可以使您的Web应用程序也可以在多个平台上工作。 Peter-Paul Koch对浏览器的状态进行了大量研究,并定期发布有关移动设备Web开发的博客。在移动浏览器上查看他的科学成果或阅读他的一些咆哮(有趣且内容丰富):http://www.quirksmode.org/mobile/

我也喜欢Jonathan Stark的书Building iPhone Apps with HTML, CSS, and JavaScript Building iPhone Apps with HTML, CSS, and JavaScript

您甚至可以借助清单文件使应用程序脱机:Safari reference - HTML 5 Offline Application Cache。这也在Jonathan Stark的书中进一步描述,因此您可以在资源更改时自动修改清单。由于浏览器会下载清单文件中指定的所有资源,因此可以将其与App Store中的应用程序更新进行比较。除了它是即时的,没有批准过程;)

答案 9 :(得分:1)

我最近写了一篇博客文章,其中包含用于创建其他语言的iPhone应用程序的框架汇编,您可能会发现这些框架非常有用:

http://akosma.com/2009/10/29/iphone-apps-without-objective-c/

答案 10 :(得分:1)

还有Rhodes framework这是一个ruby解释器,允许您使用HTML视图编写Rails样式应用程序。

答案 11 :(得分:1)

尝试在iPhone上获得功能语言Haskell(编译或解释),但它似乎没有快速移动......

http://www.haskell.org/haskellwiki/IPhone

答案 12 :(得分:1)

Objective-C和Cocoa因为一个原因更好:因为这就是Apple希望您在平台上使用的东西。 iPhone批准过程太过黑暗,无法开始使用非认可的框架和工具。谁能说苹果公司不会想方设法看看谁在用Mono构建应用程序而只是拒绝它们呢?

答案 13 :(得分:1)

作为早期访问Flash CS5中本机iPhone应用程序导出的人,我希望我能提供一些有关它的信息。为了记录,我使用这项技术创建的一款游戏在Adobe MAX 2009大会上亮相,因此众所周知我已经使用过它,并且我不会通过谈论我的经验来打破NDA,只要我坚持Adobe已经披露的内容。

首先,让我提出一个重点。在许多情况下,Flash可能不是您想要构建的正确技术。例如,如果使用Objective-C或其他可以访问设备的完整本机功能和其他语言的语言开发,那么应该使用原生UIKit控件的3D游戏和应用程序会更好。对于正确的体验类型和熟练的开发人员,Flash可能是一个不错的选择。

正如人们所预料的那样,桌面和移动设备之间的CPU功能存在很大差异。值得庆幸的是,在转换过程中,ActionScript 3通过LLVM驱动的编译器提前进行优化,作为iPhone的本机ARM程序集。因此,代码性能不会受到太大影响(如果有的话)。我移植到移动设备的现有项目的大部分代码保持不变。主要是,我必须重新设计可视内容以适应设备,并专注于Flash软件渲染器中的瓶颈。即使在桌面上,渲染器也可能是推动Flash Player功能的主要开发人员。

值得庆幸的是,Adobe工程师最终探索的一件事是硬件加速(实际上,视频在桌面插件中加速,但仅限于某些特定情况)。例如,只要显示对象保持静态,就可以将其标记为高速缓存为曲面并快速绘制到屏幕上,因为它保存在图形内存中。还可以进行其他有趣的优化以加速可视内容,例如使用位图替换具有过滤器的显示对象(阴影,发光和其他类似的东西)。这种事情也可以提高桌面性能,但懒惰的开发人员并不总是在他们自己的机器上看起来“足够好”时做到最好。我的一些同事认为这种工作流程的变化是不可接受的,但我认为这既是对我们有些人变得多么懒惰以及转向更有限的平台的明显要求的警醒。

答案 14 :(得分:1)

如果您只是在寻找直接端口,请退后一步,问问自己是否真的想让您的产品变得平庸。对于您有应用程序的任何平台,您应该为该平台提供最强大的应用程序 - 移动应用程序足够小,以至于您为几个平台提供单独的代码库并不是那么困难。

答案 15 :(得分:1)

虽然在Iphone上使用C#和Java会让那些具有这些语言背景的人感觉更加舒适,但我仍然坚持使用ObjectiveC。
在开始时,使用C#或Java似乎更容易,但稍后可能会更难。 例如,如果Apple决定将来修改cocoatouch框架怎么办? 你必须依靠monotouch来实现所有这些变化,事实上将会落后于使用ObjectiveC的人。
即使Apple确实保留了原样,你仍然可能会遇到Mono堆栈的怪癖,并且必须通过箍来完成任务。

答案 16 :(得分:1)

我建议使用混合解决方案。

由于Objective-c的灵活性,您可以在Objective-c中实现您的界面,并在几乎任何其他方面实现您的数据模型。您几乎可以使用Interface Builder绘制界面,因此您在Objective-c中的实际编码是最小的。大多数严肃应用程序的真正具有挑战性的部分是在数据模型中,这是您最有可能拥有其他项目的遗留代码或代码的地方。

正如其他人所说,有许多库允许您将几乎任何主要语言/ API粘贴到Objective-c中。

答案 17 :(得分:1)

我也寻找Objective-C的替代品,因为为我编写它根本就没有效率。我目前正在研究XMLVM(http://xmlvm.org/overview/)作为编写Java的方法,然后成为Objective-C源代码。这个解决方案有很多好处,但我认为最大的是它生成了Objective-C源代码,因此不会阻止您将核心应用程序附加到尚未使用XMLVM映射的API。我的目的是用Java编写应用程序的核心,然后将其移植到IPhone和Android,然后在Objective-C或Android-Java中添加特定于平台的功能。