Sebastian Vieira 和 Vikram Kriplaney 在 App Builders CH 上介绍了2016 年的 Android 和 iOS 开发现状。加入这个讨论吧,因为他们给 Android 开发者介绍了 iOS 开发,又给 iOS 开发者介绍了 Android。它们之间有哪些相似之处?哪些不同?如何通过掌握上下文切换来成为一名移动开发忍者呢?
Xcode 是我们开发 iOS 程序的 IDE。这个工具非常棒,除了重构,但是我们不常用这个功能。除这之外,它不单单是一个源文件编辑器。你能做的事情可不止编写 Swift 和 Objective-C 语句。它甚至都有内嵌的 particle 系统编辑器,3D 场景编辑器,而且你能用 storyboards 来开发你的应用,这是一个视图和代码的可视化连接器。这是我们在 Android 上没有的。
Android Studio 是一个非常强大的 Java IDE。它刚刚诞生两三年,是由 Google 和 IntelliJ 共同开发的。它对 Google Play Services 支持的很好,比如 App Engine 或者 App Indexing。它对测试的支持也很棒,但是 UT 从去年开始一直都处在 beta 状态。它的布局编辑器不是很强大,翻译资源也不多。
Android Emulator 在本地支持上进步了许多。和 iOS 模拟器相比,还是有些事情是 Android 模拟器能做而 iOS 模拟器做不到的。比如,打电话或者使用照相机。Android 也有 Instant Run,这是个新功能,它能让你只编译少量代码,然后瞬时部署,这样就不需要进行完整的编译流程了。
iOS Simultator 比安卓要快许多,因为它不是一个模拟器。它本质上是一个 i386 Mac OS 的应用。模拟器不能访问照相机,但是其他的东西都能模拟,包括图像渲染的工作过程,定位,多语言和 iCloud 的集成。不幸的是,它还不能模拟触摸的力道。
Android Studio 有一个非常棒的翻译编辑器。它能在你需要翻译的时候提醒你,而且你可以在你的 IDE 里面直接发起一个翻译的订单,然后获得专业的服务。
iOS 应用的翻译就非常糟糕了。有一些难用的工具包括命令行工具和 Apple 建议使用的交互格式。我开始使用 Google Sheets 来完成简单的翻译,而且我发现 Google 翻译已经是内嵌的了。
我可以使用公式来帮助翻译有键值的字串。如果有东西过时了,我会更新公式。你可以分享你的 spreadsheet 而且可以有合作者来帮助你翻译。
Gradle 是一个非常成熟的编译系统,而且 Android Studio 还支持本地编译。首先,你总会有依赖过时的问题。如果你想试试新版本的 Android 的时髦功能的话,你可以使能 Grande 的 data binding。建议你增加你的堆栈大小,然后它就会更快一些。你可以使能 Jack,这是一个 Google 开发的新的编译器而且将来会代替以前的编译系统。
关于依赖管理,现在你有两个选择,未来可能只有一个。我们选择使用的是 CocoaPods,但是也有选择 Carthage 的。
一些 Swift 社区新的开发。Swift 包管理,现在还不能支持 iOS,但是未来会越来越好。
iOS 有一个新的测试框架。之前,你必须使用 instruments,然后用 JavaScript 编写脚本。但是现在,在这个 Xcode UI 框架的帮助下,你可以用真实的可编译的代码来写测试程序。使用 Swift,你可以对接口上是否出现你的按钮做断言。
我想给 ProGuard 快速做个结论。对于所有的 Android 开发者来说,我想给大伙提个醒。它不仅仅是减小了你的二进制大小,而且混淆了代码,所以它阻止了其他人反编译你的代码。
代码签名在 Android 里面是很容易的。你只需要一个有着私钥的 Keystore :
release { storeFire file("_market/android_market.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" }
Google Play 的开发者平台很棒。我个人觉得它在很多方面都打败了 iTunes Connect。这里没有真正的应用审核的过程。他们试着引入真人来做整个审核,但是现在还在赶超 Apple 的过程中。
Apple 花时间来审核 iOS 上的应用,是因为他们想避免简单的 “Hello, World” 应用上架。Apple 使得你能获得这样的保证或者品质的保证。有时候,这会令人有些绝望,特别当你想上线一些紧急的缺陷修改的时候,你不得不等到审核结束。你可以向 Apple 要求加急审核,但是你得小心地尽量少使用。大部分时候他们都会加急处理。
你可以在 iTunes Connect 里面设置些内部测试人员,他们可以获取你的应用。你可以配置多达 2,000 个外部测试人员,只需要提供 email 地址就可以了。你可以使他们成为外部 beta 测试人员。这些运行的都还挺不错的,但是我们的确是忽视了 Android 的渐进发布功能。
Google 刚刚发布了一个很大的数据中心和许多手机,你可以部署你的 APK,然后运行 instrumentation 测试,也可以运行 Robo 测试。一个 Robo 测试是在你没有真实测试的情况下,你的应用自动运行。然后你获得 crash 的日志,如果有的话。你可以定义设备指标,然后在多个设备上测试,你可以在 Android Studio 里面实现所有这些事情。
iOS 的生态系统碎片化如何?本质上没有。大部分开发者都能在 3~4 个设备上完成测试。
iOS 9 渗透率是 84%,而且 iOS 8 是 11%。这意味着如果你能遵循支持大部分和最新主要版本的最佳实践的话,你就可以兼容 95% 的用户了。
而且,我不认为 Google 真的有这么多的 crash,无论你是在 Android 或者 Android N 上。他们只关心你是不是运行在最新的 Google Play Services 上。这样,渗透率就差不多是 100% 了。
Intent 基本上是个通信层。它使你能够启动 activities,发送 broadcasts 或者和 services 交互。某种程度上,它是 Android 里面最强大的功能。它使你能实现应用间的通信,对 events 做出反应。比如,Tasker 是一个非常常用的 Android 应用。当我给我的 Android 设备插入耳机的时候,使用它,我就可以立马启动 Spotify。
在 iOS 中,应用间交互会更容易些。在 iOS 中,有一个叫做 URL schemes 的方法,或者如果你知道另外一个应用支持的 scheme 的话,你就可以启动它,而且还可以传些参数。比如你可以触发一个查询。
在 iOS8 之后,还有些其他的应用间通信的方式,都需要 extensions。有各种各样的 extensions,包括定制键盘,但是我们最常见的是 Today widgets。你可以向下滑动通知中心,然后看到你的下次航班,或者 ad-blockers,我们对它做了些实验。这是些为了和操作系统集成,从你的应用中能暴露的一些东西。
在 Android 里,我们有 widgets。一个 widget 基本上是一个 remote view,你可以在它上面做些热门的事情。它们的功能非常有限,而且只有少量的 UI 元素。从某种意义上说,它本质上是一个 BroadcastReceiver。
Android 支持 Java,这是我喜爱的语言,但是有些人觉得它很无趣。我听说他被称为编程语言中的德国。你不一定需要 Java 来做 Android 编程。你可以使用 Scala,或者更流行的,比如 Kotlin
这是一个现代编程语言,由 IntelliJ 公司开发,叫做 Kotlin,而且你可以在你的 Android Studio IDE 运行一个插件。在它的帮助下,你可以导入 XMLs,然后绑定数据,所有的事情都会神奇地发生。它和 Swift 有些类似。
import kotlinx.android.synthetic.main.activity_main.* public class MyActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) textView.setText("Hello, world!") // No need for findView(R.id.textView) } }
如果你能爱上一门编程语言的话,肯定是 Swift。它有许多的现代特性,包括 optionals,higher level functions,它是基于协议的,而且最棒的是,它现在开源了。
Android 将会引入 Vulkan,一个底层的 3D 编程语言 API,由 Khronos Group 开发,他们就是 OpenGL 的那帮人。因为它的引入,Android 在不久的将来会有些很棒的游戏的。
Apple 对于 Vulkan 的回应是 Metal。据 Apple 说,它会快 10 倍,而且你肯定会吃惊于它的性能的。这是因为它更加底层,所以它会是直接和 A7 芯片交互。
App 索引,基本上是 Google 爬虫爬你的应用的方式,而且它会把你的应用和它的搜索结果联系起来。
在 iOS 上,与其类似,他们有深度链接。在你的应用中,你声明了和你的应用对应的域,把它放在权利声明中。在域中,在网络服务器上,你拥有这个文件相关联的 Apple 应用站点,它把 URL 和你的应用关联起来。连续性还有另外一个方面,就是分发。这用代码解释起来更容易些。
// Updates the given user activity or creates one for this entry func updateUserActivity(activity: NSUserActivity? , ... { // Handoff support (since iOS 8.0) activity.title = title activity.userInfo = [kDetailActivityEntryIdKey: entryId] activity.webpageURL = myWebpageURL // Enable Handoff, Spotlight and public indexing activity.eligibleForHanoff = true activity.eligibleForSearch = true activity.eligibleForPublicIndexing = true })
你能给这个 activity 做的其他事情就是使得它能够分发。这意味着你在寻找本地应用的一个详细视图,然后跳转到你的 Safari 浏览器。它当然会给你同样的网站,和你的内容是相同的。你还想让它能够被 Spotlight 搜索到。如果你使能第三个标志,公开索引就被使能,Apple 承诺会有一个公共索引。如果你的详细视图,或者整个视图,或者其他任何事情,如果它是非常流行的话,它就会启动浏览器,即使你的应用还没有被安装上。这会导致下载,它会使人们去访问你的网站。
Android 的权限是很痛苦的,因为许多事情都是手工完成的,而且只有 activity 能被回调。你有许多条件代码而且没有一个真正的办法来知道是不是需要某个权限。
我希望 Google 能做的更好一点,但是另外一面,这又是非常强大的。他们会使 Android 能更加注重安全性,和 iOS 一较高下。但是,Anroid 真的是无耻地拷贝 iOS 的权限模式。
在 iOS 上,我们总有这种感觉,它总是在合适的时机询问权限。当用户在询问权限的上下文中,iOS 就会询问权限。现在有许多更细地颗粒度的权限能够被询问。有定位,联系人,通知,健康套件,蓝牙,而且你有机会说明为什么你的应用需要它们。这是个正确的方式,我认为。
Android 将会有数据绑定,这太棒了。是时候和 findViewByID
说再见了。它不仅使得你的视图和 XML 还有代码都能联系起来,而且还能执行操作。
有一个类似的语言,叫做 Expression 语言,和 Java 非常像,它可以让你用 XML 编写代码。Android 带来的一个好处是,视图的 XML 是非常简单的,而且你能够手动编辑它。我都记不清多少次我打算在 iOS 里面合并 storyboard 的时候,碰上冲突了。这总是个痛点。所以还是导入 XML 吧。
Android N 将有的一个功能就是电池寿命的延长。不仅仅是你上床睡觉的时候,把你的电话放到桌上,充电时,它不会做任何其他的事情。还有可维护的视窗,当你的手机在你的口袋里面的时候,你的手机会被唤醒,而且让那个可维护的视窗专门进行网络操作,或者其他的事情。
你可能在一个平板或者一个手机里同时运行两个程序。它们都给 Intens 增加了新的标志,比如标志 Activity 启动 Adjacent。在我们有那个 fragments 之前,我们现在可以同时在另外一个 activity 运行的时候启动同一个 activity了。
你会看到通知风格变了。谢谢通知的兼容库,它们在之前的 Android N 版本上也能支持了,当你有多个邮件或者聊天记录的时候,你就能使用群通知。你甚至可以直接回复这些通知。
有些快速的,有意思的功能,比如直接启动。例如你的手机加密了,而且它正在启动中。如果你有一个闹钟应用,可你的手机正在重启而且你在睡觉,闹钟应用该怎么通知呢?在 Android N 上,这做不到,因为你的设备是加密的,应用不可以启动起来。
在直接启动的帮助下,你可以有能力定义一个能够被实际上启动起来的应用,甚至是在手机被解锁或者解密前。如果你在编写一个闹钟应用,你将能使用这个功能,而且它会在 Android N 上工作的非常好。
它们给 Android N 增加了一个新的权限。过去如果你想访问你的图片,你需要获取外部文件系统或者内部文件系统的权限。现在,你可以只需要获取部分文件系统的权限,比如图片目录,然后你就有一个漂亮的通知,要求获取那个目录的权限。
在 iOS 上,这本质上都是沙盒。你不能像 Android 那样访问文件系统。你能获取的权限是访问你的照片,这是唯一的位置。当然,现在你在应用间可以有文件 model 用作共享了。
当你想试着同时做 Android 和 iOS 开发的时候,有一个神奇的概念叫做上下文切换。
当你从 iOS 转向 Android 或者反过来,开始的时候,会有这种上下文切换。但是,你这样做的越多,你会发现上下文的影响就越来越小。这很好。我能说的是,上下文切换能够使你的大脑工作的更好。
作为一个小技巧,我经常这么做,在工作的时候,我如果使用的是 Android 代码,那在家里,我常常花些时间写写 iOS 代码。当我工作中都是 iOS 代码的时候,我会在家做些 Android 的事情。如果你不能在工作中有这么好的机会,在两个平台中切换的话,最少你能同时在两个平台里面都玩玩。每个平台都有许多需要学习的地方。你能把一个平台的概念带到另外一个平台中去,然后成为一个移动忍者。
See the discussion on Hacker News .