随着将应用提交到App Store日期的日益临近,请不要让应用的美好前景或巨大的利润搞乱了你的节奏,导致越过了应用最后准备阶段的各个重要步骤。Apple对应用有很多要求,如果不满足这些要求会导致应用提交被拒。请花点时间做好准备,列个清单,然后仔细检查。参见Apple的App Distribution Guide与Human Interface Guidelines的“Icon and Image Design”一章了解详情。
9.13.1 应用图标
为应用提供图标的最简单的方式是使用资源目录。如果之前没有对图标使用资源目录,而现在又想使用,那么请编辑目标,在通用窗格App Icons and Launch Images下,App Icons Source旁边单击Use Asset Catalog按钮。之后,Use Asset Catalog按钮会变成一个弹出菜单,列出资源目录名与目录中用作图标的图片集的名字。
所需的图片大小会列在资源目录中。选中一个图片,然后在属性查看器中查看。令人困惑的是,“2x”与“3x”表示图片大小应该是列出的图标大小的2倍与3倍;比如,iPhone应用图标显示为“60pt”或“60×60”,不过“3x”表示你应该提供一个180×180大小的图片。要想确定该显示哪一个,在选中图标集或加载图片集时请勾选上属性查看器中的复选框(如图9-17所示)。要想添加图片,请将其从Finder拖曳到恰当的位置处。
图9-17:资源目录中的图标位置
图标文件必须是个PNG文件,不能有alpha透明度。它应该是个正方形,系统会为其添加圆角。目前,Apple似乎更喜欢简单、卡通的图片,拥有明亮的颜色以及渐变的背景色。
在构建应用并处理资源目录时,图标会被写到应用包的顶层并被赋予恰当的名字(如图6-15所示);同时,一个恰当的条目会被写到应用的Info.plist中,这样系统就可以找到图标并在设备上显示了。具体细节很复杂,不过你不必关心这些,这也正是使用资源目录的原因所在!
应用图标大小随着时间的变化也在发生着变化。如果应用要向后兼容于早期系统,那么你还需要拥有不同尺寸的额外的图标,以满足这些老系统的需要。这正是资源目录的价值所在。
此外,还可以加入更小的图标,用于在用户进行搜索时显示,如果使用了设置包,那么还会显示在Settings应用中。不过,我从来都没有使用过这些图标。
9.13.2 其他图标
在向App Store提交应用时,你需要提供一个1024×1024大小的PNG,或高质量的JPEG图标以显示在App Store中。Apple指南说它不应该只是应用图标的放大版,同时也不能与应用图标差别太大,否则应用将会被拒绝(这一点是从我的经验得来的)。
App Store图标不需要构建到应用中;事实上,它也不应该构建到应用中,因为这么做只会毫无必要地增加应用的大小。另外,可能想在项目中保留该图标(在项目目录中),这样就能轻松找到并维护它了。我建议将其导入项目中,并复制到项目目录中,但不要将其添加到任何目标中。
如果为Ad Hoc发布创建了iTunesArtwork图标,那么你现在可能需要将其从Copy Bundle Resources构建阶段中删除。
9.13.3 启动图片
在用户轻拍应用图标来启动应用与应用开始运行并显示初始窗口之间会有一个延迟。为了掩盖这种延迟,使用户觉得应用正在运行,你应该在这个时间间隔内显示一张启动图片。
启动图片无须追求细节,它可以是应用完成启动后界面主要元素或内容的一个简单描绘。通过这种方式,当应用启动完毕后,从启动图片到实际应用的过渡就是填充这些元素与内容的事情了。
在iOS 7与之前版本中,启动图片就是个图片(一个PNG文件)。它需要添加到应用包中,也需要遵循某些命名约定。随着iOS设备的屏幕尺寸与分辨率不断变化,启动图片的数量也随之发生了变化。iOS 7引入的资源目录就派上了用场。不过随着iPhone 6与iPhone 6 Plus的出现,整个情况变得难以管理了。
出于这个原因,iOS 8引入了更好的解决方案。相对于使用一组启动图片,你需要提供一个启动nib文件,即一个.xib或.storyboard文件,其中包含了作为启动图片显示的视图。可以通过子视图和自动布局来构建这个视图。这样,视图就会自动进行重新配置,匹配应用所运行的设备的屏幕尺寸与方向。
在默认情况下,新的应用项目都会带有一个LaunchScreen.storyboard文件,这是用于设计启动图片的文件。Info.plist通过键“Launch screen interface file base name”(UILaunchStoryboardName)来指向该文件。如果必要,可以通过编辑目标并设置Launch Screen File域(位于App Icons and Launch Images下)来配置Info.plist。
你应该充分利用该特性,而不仅仅是因为这么做很方便。Info.plist中的“Launch screen interface file base name”键告诉系统应用运行在更新的设备类型上,比如,iPhone 6与iPhone 6 Plus。如果没有这个键,那么应用就会缩放显示,就好像iPhone 6只是个巨大的iPhone 5S一样。实际上,你无法利用本可以使用的像素(显示会有些模糊)。
使用启动nib文件的另一个原因在于它是可以本地化的!与任何.xib和.storyboard文件一样,显示在基础本地化启动界面.xib或.storyboard文件中的字符串可以通过.strings文件进行本地化。
据我所知,应用包中的自定义字体是无法显示在启动nib文件中的。这是因为在启动界面显示时,它们尚未加载进来。
坏消息是如果应用要向后兼容于早期系统,那除了启动nib文件,你还需要提供老式的启动图片。iOS 7及之前的系统对于启动图片的要求是非常复杂的,而且随着时间的流逝规则还发生了一些变化,这又加剧了复杂性,结果就是要兼容的系统越多,需要满足的条件就越多。我已经在本书的前一版中介绍过这些条件,这里就不再赘述了。
Apple提供了一个名为Application Icons and Launch Images for iOS的非常有价值的示例代码项目。该项目提供了各种尺寸的图标与启动图片,同时还介绍了恰当的命名约定。
9.13.4 屏幕截图与视频预览
在向App Store提交应用时,你需要提供应用的一个或多个截图以显示在App Store上。你应该事先就准备好屏幕截图并在应用提交过程中提供它们。你至少需要根据应用所运行的设备的屏幕尺寸提供一张屏幕截图,并且使用相应的分辨率。
可以通过模拟器或与电脑连接的设备来创建屏幕截图:
模拟器
在模拟器中运行应用,首先设置目标以获得所需的设备类型。选择File→Save Screen Shot。
设备
在Xcode的设备窗口中,在Devices下找到连接的设备,然后单击Take Screenshot。此外,还可以选择Debug→View Debugging→Take Screenshot of[Device]。
在这两种情况下,屏幕截图文件都会保存到电脑上通常用来保存屏幕截图的位置处(一般在桌面上)。
还可以同时按下锁屏按钮与Home按钮在设备上进行屏幕截图。这样,屏幕截图就会保存到照片应用的相机胶卷中,你可以通过任何方便的方式将其发送到电脑上(比如,给自己发邮件)。
你还可以向App Store提交用于介绍应用的视频预览。视频最多可以是30秒的时长,格式为H.264或Apple ProRes。如果电脑使用的是OS X 10.10(“Yosemite”)或更新的版本,那么它可以捕获到设备的视频。设备要新一些,拥有雷电连接器才行:
1.将设备连接到电脑上并打开QuickTime Player。选择Choose File→New Movie Recording。
2.如果必要,当鼠标悬浮在QuickTime Player窗口上时,使用Record按钮旁边向下的v形按钮打开弹出菜单,将相机与麦克风设为设备。
3.开始录制,在设备上使用应用。录制完毕后,停止然后保存。
可以通过iMovie或Final Cut Pro编辑生成的影片文件,然后提交到App Store。比如,在iMovie中:
1.在导入影片文件后,选择File→New App Preview。
2.编辑!完成后,选择File→Share→App Preview,确保得到的是正确的分辨率与格式。
要想了解更多信息,请参阅Apple iTunes Connect Developer Guide“First Steps”一章中的“App Preview”一节。
9.13.5 属性列表设置
Info.plist中的很多设置对于应用的行为都是至关重要的。你应该仔细阅读Apple的Information Property List Key Reference以了解全面的信息。大多数所需的键都是作为模板的一部分而创建的,并且赋予了合理的默认值,但你还是应该检查一下。下面这些键尤其值得你注意:
Bundle display name(CFBundleDisplayName)
位于设备屏幕上应用图标下方的名字;这个名字要短一些,以免被截断。本章之前曾介绍过如何本地化显示名。
Supported interface orientations(UISupportedInterfaceOrientations)
这个键指定了应用可以显示的方向。你可以通过目标编辑器General页签的复选框进行设置。不过可能还需要手工编辑Info.plist以重新排列可能的方向顺序,因为在iPhone上,列出的第一个方向是应用实际启动的方向。
Required device capabilities(UIRequiredDeviceCapabilities)
如果应用所需的能力并不是所有设备都具备,那么你就应该设置该键。对于应用来说,如果运行在缺乏特定能力的设备上是无意义的,那就不要使用该键。
Bundle version(CFBundleVersion)
应用需要一个版本号。最好在目标编辑器General页签中设置它。这里可能会让你有些迷惑,因为它有两个域:
Version
对应于Info.plist中的“Bundle versions string,short”(CFBundleShortVers-ionString)。
Build
对应于Info.plist中的“Bundle version”(CFBundleVersion)。
据我所知,如果设置了前者,那么Apple就会使用它,否则会使用后者。一般来说,在提交到App Store时,安全起见,请将这两个域设为相同的值。这个值是个版本字符串,如/"1.0/"。版本字符串会显示在App Store中,用于区分各个版本的发布。提交更新时如果没有增加版本字符串会导致更新被拒。不过,增加Build号但没有增加Version号是可以的,如果提交了相同发布的几个连续构建,那就需要这么做了(在TestFlight测试过程中,或发现了Bug,导致不得不在App Store上架前撤回提交的二进制文件)。