Apple 上海 workshop 参会记录

前几天去参加了苹果在上海举行的主题为“构建面向全球的 App”的 workshop,简单记录下。

整个 workshop 包括分享和交流两部分,苹果的人先分享了一系列 App 国际化的最佳实践;接着跟苹果负责开发者关系的技术人员就国际化和本地化相关的问题做了一对一的交流。

分享篇

分享部分基本上是把 WWDC 中国际化和本地化的 Session 翻译成汉语再讲一遍,由于之前看过大部分了,因此这部分并没有什么新意,简单摘要一下。

商业互吹

App Store 自推出以来,到目前已经为全球开发者创收超过 1000 亿美金,支持了 155 个国家和地区、28 种语言、44 种货币。

App Store 相关

App Store 中的编辑推荐编辑精选是每天有专人人工发掘一些好的 App,结合当下热点,做的推荐。不过通过后续跟苹果的人交流,这块是“可公关”的,前提是 App 要做的足够好,必须要契合官方的设计 Guidelines,最好有用到一些苹果的新特性,无论是设备级的还是 SDK 级的,比如当年的 3D Touch,ARKit 等。如果使用了什么新技术,即使通过 BD 让苹果方面获知,比如,哪天 AliExpress 支持了 Size Class,支持了在 iPad 上横竖屏的良好布局,可能被 feature 的几率就大大增加。App Store 的排行榜是纯靠机器来算出来的。

在 App 的详情页,也有一些门道。

App 的 Icon 最好不要有字,一个好的例子是 Evernote,用一个大象的形象,简洁直观。

主标题和副标题,最多 30 个字符;在 iTunes Connect 提交 App 时,关键词的填写使用半角逗号做分隔,不要使用空格,而且无需再使用 App 名字和所属类别作为关键词;此外,关键词应该使用单数不要使用复数,禁止使用未被批准的商标词语,比如在 YouTube 的 App 关键词中使用 “Netflix” 就是被禁止的。关键词应尽量突出 App 独一无二的特性,有点像给论文提炼关键词一样。

关键词和副标题最好要契合当地用户的习惯和性格,比如 Evernote 在日本的 App Store,突出的是“收纳,收集”,在美国的 App Store,突出的是“检索,整理”。

技术相关

技术相关的分享都很基础,内容的重点是,能用系统的 API 就尽量用,能抱苹果大腿就尽量抱,所有的内容在 WWDC 全有涉猎,跟 WWDC 一样,样例代码使用的全是 Swift。

字符串

这部分基本上是这个 Session 的翻译:Localizing with Xcode 9

多语言文案,使用 NSLocalizedStringlocalizedStringWithFormat:方法,配合 Xcode Static Analyzer 中的 Missing localizabilityMissing Localization Context Comment 的选项,可以在 Xcode 代码分析时,及时发现多语言不完整的地方。

另外,跟数字相关的多语言文案,例如单复数、不同数字使用不同的缩写等,苹果有统一的解决方案:stringsdict 文件,下面是一些参考资料。

格式化

这部分是从这个 Session 里面摘出来的:Internationalization Best Practices

涉及到需要做本地化 Format 的东西,都有系统 API 来给你优雅的实现了。比如时刻、时长、时间间隔,甚至连姓名都有系统的 API 来做双向的 Format,所谓的双向 Format,是指设置姓、名,可以得到 Localized 的 Format 结果,反过来,给定一个 Localized 的姓名,也可以通过 API 来解析得到姓是什么、名是什么。

系统 Formatter 总结:

ByteCountFormatter
DateFormatter
DateComponentsFormatter
DateIntervalFormatter
NumberFormatter
PersonNameComponentsFormatter
MeasurementFormatter

布局

布局方面,有两点推荐,一是使用 Auto Layout,二是使用系统容器,例如 Stack View,Collection View 等。可以参考 Choosing the Right Cocoa Container View 这个 Session。

工具和工作流相关

老有人抱怨苹果的工具不好用,那是因为他们不知道苹果以前的工具有多不好用。

这部分介绍了使用 Xcode 10 来做本地化工作的流程,内容来自这个 Session:New Localization Workflows in Xcode 10

介绍了在 Xcode 10 中新推出的方便本地化工作流的文件组织格式,命名为 “Localization Catalog”,扩展名为 .xcloc,里面包含了上下文信息、待本地化的资源等等,此外这种文件组织格式支持图片、音视频等的本地化,不局限于字符串了。

另外,在 Xcode 可以方便地测试在多语言场景下可能出现的问题,比如指定启动时使用什么系统语言,也可以模拟两倍字符串长度来看下 App 布局上的表现。

Edit Scheme

交流篇

跟苹果

苹果有一个专门负责全球开发者关系的部门,叫 WWDR,我们这次是跟这个部门偏技术的同学做了交流。

首先我问了苹果对动态化和跨平台的技术的态度,得到的答案是为了保护平台的良性发展,热修复这种技术苹果是严禁的;但是像 RN 这种技术没有明确表态。

他们说 Airbnb 去年发了一系列文章来讲述 RN 从入门到放弃的整个过程,建议我们参考一下。

  1. React Native at Airbnb
  2. React Native at Airbnb: The Technology
  3. Building a Cross-Platform Mobile Team
  4. Sunsetting React Native
  5. What’s Next for Mobile at Airbnb

此外,这些框架可能对苹果的一些新特性支持不及时。比如异形屏 iPhone 上市后,可能借助 UIKit 的 API,如果一直抱苹果的大腿,花费很小的代价就能进行界面的适配,但是使用 RN 或 Flutter 可能就会很痛苦。在他们看来这就是短期利益和长期利益的抉择。短期看来这些技术可能的确会让开发者写起来很爽,表面看起来是省了人力,但是这样可能会跟苹果生态的分歧越来越大,到后面会投入更多的资源去矫正,而且 App 也很难被 Feature。

第二个问题他们有提到,如果我们将来用到了任何新技术或借助了苹果的新特性,可以让他们知道,主动争取一些被 Feature 的机会。

通过跟苹果的交流,我发现如果可以,一定要知道苹果想要什么,毕竟我们是在人家的盘子里面玩。不能固步自封。同时,我们还需要多看一些海外的公司在做什么、想什么,不要发明一些自 High 型的东西。

发明家耿哥

跟同行

认识了同去参会的滴滴国际化团队的友军。他们在做国际版的滴滴打车。

业务上,他们遇到了很多有意思的挑战。比如差异化运营。在国内,滴滴打车可能很强调让司机重视服务,但在日本,礼仪和服务是不用刻意跟司机强调的;很多国家的线上支付没有国内这么发达,那么线下支付引起的纠纷怎么去应对等等。

技术上,开始的时候,国际版的滴滴打车开始是基于国内版本做了组件化后拆分出来的,但是随着业务的发展,他们逐渐发现国际版和国内版的分化程度越来越大,目前正在尝试独立。Uber 的技术 Blog 给了他们很大启发。

番外篇

苹果在上海有一整栋办公楼,里面给人的感觉是非常平静,不会有国内互联网公司这种撕逼和喊叫,觉得大家都在专注做事情,像滴滴的小伙伴说的,在这种环境下,心情应该也会很不一样把。

上海是真繁华,我住的酒店附近,大型商场的密集程度,可能比整个滨江的综合体还多。

外滩附近一家超好吃的上海菜馆

总结

这种类型的交流活动,不是银弹,也没有期待可以快刀斩乱麻解决实际问题,更重要的是知道了苹果对开发者的期待,跟他们建立了联系。同时加强了跟国内同行的交流,这对以后是很有帮助的。