Tag: xcode

成为更好的Swift开发人员的提示

Swift提供的功能有助于开发人员对Objective-C进行更安全,更快,更易读和更可靠的编码。 以下是一些概述的Swift技巧,这些技巧是我们通过使用这种新语言(Swift)的经验收集而来的。 他们帮助我们更加安全,整洁地编写了代码。 我将讨论分为两部分。 在第一篇中,我们为那些迅速入门的人进行讨论,在第二篇中,为已经使用过的人进行讨论。 给初学者的提示 1.使用Playground验证: 每当您打算实施任何逻辑实验并在操场上对其进行验证时,也可以用于学习目的。 Playground是一种非常便捷的互动工具,可让您迅速行动。 游乐场不需要创建新项目😃。 要创建游乐场,只需从Xcode启动中选择一个选项即可: 也可以在Xcode中创建游乐场: 一旦在操场上,可以在左侧写代码,结果将在右侧和底部: 2.安全使用可选: 可选属性是可以具有有效值或不具有任何值的属性( nil )。 每当我们要打印可选内容时。 它将输出带有一些其他文本的值作为Optional( value ) 。 我们可以通过在可选属性名称的末尾使用exclamation (!)来隐式解开可选选项, 但应避免使用它。 这称为强制展开,导致应用程序崩溃。 因此,使用exclamation (!)是danger 🚫。 在某些特殊情况下,使用感叹号(!)。 例如: IBOutlet当您从接口构建器创建插座时,它将是一个隐式展开的可选对象,因为UIKit假定您已将插座钩挂/连接到接口构建器😐。 因此,使用隐式展开可选值是有风险的。 我们可以使用if let模式来处理此问题: var名称:字符串? =“欢乐” var lastName:字符串? print(name) //结果:可选(“ Joy”) print(name!) //结果:喜悦 如果让值=名称{ 打印(值) }其他{ 打印(“未设置名称”) } //结果:喜悦,因为名称具有值 如果让lastNameNew = lastName { 打印(lastNameNew) […]

使用多个版本的Xcode

使用Mac App Store版本的Xcode是保持最新状态的最简单方法。 根据系统偏好设置中的App Store设置,应用程序将自动更新,或者在更新可用时操作系统会提示您。 如果使用最新版本始终是最好的选择,那么生活将会很简单。 生活不是那么简单! 用于构建应用程序的Xcode版本具有许多重要的后果。 它设置您要针对的基本SDK版本。 这可以隐式地使您选择使用某些OS功能。 例如,使用Xcode 8.x中的iOS 10 SDK构建时,您的应用将采用新的Today Widget外观。 使用Xcode 7.x(针对iOS 9 SDK)进行构建,即使在iOS 10上运行,您的应用也将使用iOS 9样式的小部件。 对于Swift代码,语言本身的版本可以更改。 在Swift 2.x到3.0的时间范围内,该语言经历了许多重大且不兼容的更改时,这一点尤其重要。 还在使用Swift 2.3吗? 您不能使用Xcode 8.3或更高版本。 支持较早的操作系统版本。 Xcode在放弃对较旧的iOS版本的模拟器支持方面非常积极。 如果您希望模拟器对当前和以前的主要iOS版本提供更多支持,则通常无法使用最新的Xcode版本。 Xcode Beta。 在撰写本文时,WWDC 2017即将开始。 如果要开始针对Beta OS版本进行测试或利用新的API,则需要使用Beta版的Xcode。 您无法发布使用Beta版Xcode构建的应用程序更新。 拥有多个版本的Xcode可提供更大的灵活性。 尝试保持最新状态是一种很好的做法,但是有时您需要能够发布使用旧版本构建的应用程序。 如果您的应用尚未准备好加入所有新功能,但您需要发布更新,则在9月左右公开发布主要iOS版本之后,这一点尤其重要。 安装多个版本的Xcode 为了获得最大的灵活性,最好的方法是手动下载特定版本的Xcode,而不是使用Mac App Store版本。 Apple在其网站https://developer.apple.com/download/more/上提供了Xcode发行版本的下载链接。 在WWDC和公开发行版之间,可以从https://developer.apple.com/download/下载最新版本的Xcode。 该页面上当前版本的链接仅会打开Mac App Store。 最好使用手动下载。 有时需要一些时间才能使最新的公共发行版可供手动下载。 安装特定版本很容易。 Xcode 8和更高版本(.xip): […]

使用Xcode配置在同一设备上运行您的App的多个版本

S0,您有一个要分发给内部测试人员的应用程序,但希望他们同时运行内部版本和App Store版本。 好吧,这篇文章是给你的。 如果您还对如何为实时/临时/开发环境进行构建感兴趣,那么这也很适合您,但是在本文的第二部分中,我将对此进行详细介绍。 配置所有东西 为了使一切正常,我们需要熟悉Xcode配置。 你们中的大多数人会熟悉他们,但您可能不知道。 通常,Xcode从两个开始。 调试和发布 。 您将在项目的信息页面中找到它们。 应用程序的捆绑标识符唯一地标识设备上的应用程序。 为了使我们能够在一台设备上运行不同版本的App,我们将需要一个用于测试App的新捆绑包标识符。 让我们继续创建一个新的配置“ Beta”,该配置将识别发送给我们的Beta测试人员的内部版本。 我们可以将其创建为Release方案的副本(我们将其重命名为App Store,因为这就是现在的名称)。 这将导致Debug,Beta和App Store作为可用配置。 现在,我们需要前往控制使用的包标识符的Apps Info.plist 。 您将在其中看到捆绑标识符,其中包含捆绑标识符,该标识符可能被硬编码为您应用的反向域名。 将其更改为$(PRODUCT_BUNDLE_IDENTIFIER) 。 这可能已经是默认值,如果是,那么, 现在,您可以转到App Target的构建设置,搜索“ Product Bundle Identifier”,然后应该在“包装”下看到它。 将鼠标悬停在“产品捆绑包标识符”上时,应该会在左侧看到一个箭头,可以点击以扩展每个配置所设置的值。 现在是更新Debug和Beta版本以使用其他包ID的最佳时机 此时,您将具有多个捆绑包标识符,还需要在开发人员中心中对其进行配置,以便Xcode可以为您生成配置文件。 幸运的是,所有这些都可以使用Fastlane的生产工具完成: 产生-a galasko.dan.XcodeSchemesFun.beta –skip_itc 自然,您将用自己的捆绑包标识符替换galasko.dan.XcodeSchemesFun.beta :) 根据配置更改应用的显示名称 为了区分我们的Beta App与App Store版本,我们希望它使用不同的名称。 这可能与“ MyApp”和“ Beta-MyApp”一样微不足道。 我为该名称加上前缀,因为如果应用程序名称很长,我们确实不希望Beta部分被截断。 因此,回到您的Info.plist并添加一个名为Bundle display name的新字段,并将其值设置为$(APP_DISPLAY_NAME) 同样,我们需要回到应用程序目标的“构建设置”部分(来回往复,我知道很多)。 在构建设置导航栏的顶部,您应该看到一个加号。 点击加号会显示一个下拉列表,选择“添加用户定义的设置”。 现在向下滚动到构建设置的底部,您应该在“ […]

iOS App图标和启动图像大小

在发布到App Store之前,我已经完成了一个新的iOS应用程序的发布,并且遇到了两个问题,这些问题使我的进度延迟得比他们应有的时间更长。 我想与您分享这些经验,以便您自己避免。 我的问题如下: 1.用户 当他们将我的更新版本应用程序安装到旧版本应用程序时,始终看到我的启动屏幕的旧版本。 可能这是Mobile Application Developer的常见问题。 2.与应用程序图标相同,用户 他们将我的更新版本应用程序安装到旧版本应用程序时,始终看到我的应用程序图标的旧版本。 如果您在自己的应用程序开发过程中遇到这些问题,请让我用文字和图片解释答案,并提供一种工具来帮助您完全避免此问题。 iOS启动图像大小 启动图像,有时也称为启动屏幕。启动屏幕会在您的应用启动时立即出现。 启动屏幕迅速替换为应用程序的第一个屏幕,给人的印象是您的应用程序快速且响应迅速。 启动屏幕不是表达艺术的机会。 当然,我学到的教训是确保启动映像文件位于XCode项目引用的正确文件夹中。 XCode中的路径应为以下路径: …Images.xcassets-> LaunchImage.launchimage 如果要更改已发布应用程序的LaunchImage ,则必须注意一个主要问题。 让我解释一下,如果您的应用程序具有名称如下所述的LaunchImage : Default.png,Default @ 2x.png,Default @ 3x.png等… 现在,您将使用其他名称的新设计来更新LaunchImage 。 喜欢, LaunchImage.png,LaunchImage @ 2x.png,LaunchImage @ 3x.png等… 因此,这意味着您要在Images.xcassets-> LaunchImage.launchimage中再次添加新的LaunchImages ,而不是用新的设计替换它们。 替换更新版本中的启动映像文件可能会影响此问题。 即使用户具有该应用程序的最新版本,也可能会看到旧的启动图像。 因此,我想说的是为启动映像提供特定的名称,如果您需要使用新设计更新启动映像,请检查旧映像是否被新设计和名称替换。 因此,结论是防止这种情况,为应用程序提供相同的LaunchImage名称。 我在下面列出了完整的清单,其中包含所有尺寸 供您参考: – Default.png (320 x 480) – Default@2x.png (640 x […]

Xcode快速提示–测试布局以进行本地化

Zendesk支持应用程序支持多种语言,这意味着我们在应用程序中显示的字符串会根据设备语言集而改变。 最近,当设备语言从默认语言(英语)更改时,我们遇到了UI组件定位错误的问题。 这在荷兰文中显示如下。 由于一些不确定的自动布局约束,包含字符串的UILabel随着字符串长度的增加而增大,从而导致下一个UI元素UISwitch被推到包含视图的边界之外。 在调查并解决此错误时,我们需要重复再现该问题。 我们没有改变繁琐的设备语言,而是偶然发现了一种称为伪本地化的测试方法。 伪本地化是一种用于测试国际化的测试方法,其中涉及用更改后的版本替换默认语言字符串。 例如,我们可以将“登录”替换为“登录登录,登录登录”。 然后,我们在Xcode方案编辑器中发现了一个非常有用的选项,该选项使我们能够使用伪本地化来测试布局,如下所示。 使用此设置,应用中的所有字符串都将被伪翻译所取代,该伪翻译由重复两次的原始字符串组成。 下面显示的是在启用此设置的情况下运行的应用程序,这导致默认字符串被伪翻译替换。 使用伪本地化Xcode方案设置,我们能够快速重现报告的问题并实施修复! 🎉我们的更新后的用户界面如下所示。 综上所述 伪本地化是一种用于测试国际化的测试方法,其中涉及用更改后的版本替换默认语言字符串。 Xcode包含一个方案设置,该设置使我们可以使用伪本地化来测试UI布局。 伪本地化应该是正常功能开发的一部分。 而已! 📱🚀👍🏽 也可以在petethedeveloper.com上获得

iOS管道中DevOps友好XCTest的重要提示

最初在 这里 发布在XCBlog上 苹果已经引入了XCTest框架,可以为各种苹果平台创建单元,集成,性能和UI测试。 XCUITest是XCTest之上的一个性感扩展,它使开发人员可以为iOS和macOS应用编写UI测试。 自从在WWDC 2015中启动以来,XCUITest受到了很多关注和增强。 它使用Swift语言创建测试,这使iOS开发人员可以轻松地使用相同的编程语言为iOS应用程序添加UI测试。 另一方面,DevOps和Continuous Delivery实践诱使企业在开发新功能后立即发布它们。 根据权衡,单元和集成测试是轻量级的,并且速度更快。 但是,UI测试非常缓慢,难以维护。 许多移动测试金字塔表明,我们应该进行最少的UI测试,并涵盖业务逻辑较低级别的轻量级测试。 但是,UI测试是不可替代的,并且如果执行得当,则可以在更高的级别上提供更多的价值。 就发布应用程序的信心而言,单个UI测试可以击败数千个单元测试。 为了混合使用DevOps和XCTests的实践,我们必须在不干扰CI / CD管道的情况下,就如何编写XCTest做出一些明智的决定。 在本文中,我们将介绍一些对DevOps友好的XCTests的技术。 为了允许频繁发布iOS应用,设置和维护CI / CD管道非常重要。 iOS开发中最痛苦的事情之一就是发布了该应用程序。 它涉及许多活动,这些活动可能容易出错,重复且耗时。 CI / CD管道的作用是使所有无聊的任务自动化。 典型的iOS发布管道包括以下内容 查看源代码 Swift代码的静态分析(例如SwiftLint) 编译和构建iOS应用 运行各种测试,例如单元,集成,API,UI,性能,安全性 代码签名和存档iOS应用 将iOS应用分发到iTunes Connect或第三方测试服务 创建标签或在Source Control上发布,例如Github Releases 最后但并非最不重要的一点是,通过发行说明通知人们有关新版本的信息 可能有更多的东西正在筹备中,但上面列出了一些非常常见的东西。 很明显,如果没有自动化测试,CI / CD管道将无法完成。 自动化测试提供了释放iOS应用程序的价值和信心,而无需担心。 现在,我们将看到如何精巧地编写XCTest,以在不影响iOS应用程序质量的情况下加速管道。 用单元测试覆盖所有生产代码始终是一个好主意,这样Continuous Integration可以在生命周期的早期检测到错误。 单元测试通常写得很快,而且琐碎。 使用XCTest,我们可以通过编写单元测试来覆盖大多数代码。 在某些情况下,我们必须编写集成测试,而单元测试不足以覆盖业务逻辑。 进行轻量级和更快的测试的好处是生成速度更快,可以提供早期反馈。 苹果在这里用XCTest框架编写单元测试的文档非常丰富 iOS应用程序使用后端或服务器端API是一种非常常见的做法。 确保iOS应用使用的API遵循消费者驱动的合同,这一点非常重要。 否则,他们可能会完全破坏iOS应用程序。 […]

便利初始化器(Swift Day1)

在里面: 指定的初始化器是类的主要初始化器。 指定的初始化程序将完全初始化该类引入的所有属性,并调用适当的超类初始化程序以继续超类链中的初始化过程。 convenience init : 便捷初始化器是辅助的,支持类的初始化器。 您可以定义一个便捷初始化程序,以从与便捷初始化程序相同的类中调用一个指定初始化程序,并将某些指定初始值设定项的参数设置为默认值。 在上面的示例中,基本上,指定的初始化程序是init(type: String) ,它确保所有存储的属性都已初始化。 Music类没有超类,因此init(type:String)初始化程序不需要调用super.init()即可完成其初始化。 便捷初始化程序,不带任何参数,通过使用指定的初始化程序,将type存储属性的值自动设置为“ Jazz” 。 便利的初始化程序需要self.init来调用它。 现在我们有了创建UIColor的便利初始化,并且如示例2所述,事情非常简单。 我们只需要在创建UIColor的UIColor Extensiom中添加便便性初始化即可。 让BlueColor = UIColor(红色:30/255,绿色:55/255,蓝色:255/255,alpha:1) 扩展UIColor { 便利初始化(r:CGFloat,g:CGFloat,b:CGFloat){ self.init(红色:r / 255,绿色:g / 255,蓝色:b / 255,alpha:1) } } 让myFavblueColor = UIColor(r:30,g:55,b:255) 我编写了上面的代码,以提供更方便的方式来声明自定义uicolor。 结论

简单的Xcode hack可以帮助优化开发人员的生产力。

上述代码摘自我的一个iOS项目,名为“ OptimusPrime”; 这是一个质数计算器,我用作演示项目,用于演讲,研讨会和疯狂测试。 借助我的颜色编码,我一眼就能分辨出以下几点: 系统保留关键字(粉红色) :系统保留关键字不能以任何方式被覆盖,并且如果我们尝试这样做,编译将会失败。 我可能不知道Xcode中的每个系统保留关键字,因此最欢迎使用一种轻松区分它们的方法! Apple拥有的属性,类和函数(青色) 与用户定义的属性,类和函数(柠檬绿) :Apple拥有的和用户定义的对象,属性或函数以完全相同的方式工作,但是由其代码引起的错误是以完全不同的方式解决问题-尤其是因为我们可以修改实现而不是Apple的实现。 因此,有助于在两者之间进行一些定义。 硬编码的数字(紫色)和字符串(红色) :包括我在内的大多数开发人员都同意不惜一切代价避免使用硬编码。 通过为它们提供专用的颜色集,我们也许能够更轻松地发现它们,从而更快地用常量替换它们。 注释(灰色) :注释是代码的说明(或IDE屏幕文档的一部分),但不是编译或处理的实际代码的一部分。 因此,应将它们相应地着色为文件的不必要部分。 属性和框架声明,函数中的属性访问器(白色):当更多关注时,我还可以看到函数调用比属性调用更明亮。 在我的特定情况下,我什至不需要花时间自定义调色板,因为IDE中的默认调色板之一可以满足我的需求和个人喜好。 但是,在以前的Xcode和macOS版本中,我确实必须使用“ Midnight”调板作为基础对其进行自定义: 在自定义方面,由于我的视力无法应付由默认对比度和大屏幕上的小字体引起的疲劳,因此我将柔化各种颜色的对比度并增加字体大小。 对我来说幸运的是,最新的Xcode版本中提供的新的Default(深色)调色板非常合适! 其他视觉元素 在最初的屏幕截图中,您可能已经注意到了其他一些视觉元素。 这些元素虽然与颜色自定义无关,但为我提供了一些我认为在编码时有用的附加信息。 让我们回顾一下! “当前正在编辑”行标记。 源代码编辑器中的当前行被突出显示,从而提供了一种轻松的方式来知道键入时我正在编辑的行。 这也很好地表明了您是否已滚动到编辑范围之外。 行号。 左边距中当前文件行号的存在有多种用途。 首先,在We Are Mobile First上,我们不喜欢大型源文件。 它们很难调试和维护。 正如我们有关健康编码实践的文章中所讨论的那样,我们使用单一责任原则。 如果文件太大,通常意味着我们可以将代码拆分为较小的任务。 通常,我尝试将文件保存在少于150行的代码内(不包括注释)。 其次,调试时查看行号很有用,因为编译器或调试器可能会引用触发错误的代码行。 最后,当使用版本控制工具时,在合并或同行审阅代码时查看行号会很有帮助。 关于版本控制工具的更新。 有些人可能已经注意到某些行中行号旁边的蓝色标记。 这些标记突出显示了相对于我们的版本控制工具中的最后一次提交已更改的代码行。 右垂直边距。 我们在几个项目上使用短绒棉。 我们使用的最常见规则之一是“一行中最多XXX个字符”。 在这种情况下,“ XXX”通常为120。我厌倦了触发编译器警告或错误,因此我将Xcode设置为在一行中的第120个字符处自动添加此垂直边距,因此可以直观地看到该限制。 折叠标记。 行号旁边的代码文件夹使我可以轻松折叠/展开代码段。 结论 在大多数当前的IDE中,具有视觉吸引力的设置很容易实现,但是我还没有看到很多开发人员可以自定义自己的设置。 这似乎很轻浮,但只需要花费五分钟的时间,从而可以帮助您提高视力并改善性能。 […]

如何为中心选项卡栏项目创建自定义操作?

大多数应用程序都有一个主要动作,即Twitter上的Tweet,Instagram上的Post,PayPal上的汇款,Swarm上的签到(Foursquare)。 您可能正在构建一个具有此类主要操作的应用程序,所以我想写一篇文章,介绍如何使用Swift为您的应用程序创建该中心操作。 主要动作是应始终可见且易于访问的内容。 因此,您可能希望将此操作放置在选项卡栏的中心或导航栏的顶部。 在这种情况下,我将向您展示最受欢迎的按钮,这是自定义标签栏上的中央操作按钮。 您可以将操作分配给中心按钮,例如弹出视图,摄像机视图控制器或基本上任何您想要的东西。 如果您想获得完整的代码,只需向下滚动至底部即可查看我的要旨。 这是逐步完成的方式。 您将需要一个自定义的标签栏控制器来操作标签按钮和操作。 类CustomTabBarController:UITabBarController,UITabBarControllerDelegate { 假设您在应用程序上有四个标签,并且希望使用动作视图控制器(即自定义相机视图)进行中央动作。 如果您想知道如何构建自定义视图控制器,这是我的文章。 var homeViewController:HomeViewController! var secondViewController:SecondViewController! var actionViewController:actionViewController! var thirdViewController:ThirdViewController! var fourViewController:FourthViewController!override func viewDidLoad(){ super.viewDidLoad() homeViewController = HomeViewController() secondViewController = SecondViewController() actionViewController = ActionViewController() thirdViewController = ThirdViewController() fourViewController = FourthViewController() } 让我们为标签栏设置一些图标,使其首先看起来不错。 始终还要设置selectedImage,因为您的用户希望知道他们所看到的选项卡(就像网站菜单一样)。 我们将在您的viewDidLoad中进行此操作。 另外,不要忘记设置您的代表(您将知道为什么在第6步中这样做了)。 覆盖func viewDidLoad(){ super.viewDidLoad() self.delegate =自我 在viewDidLoad函数内部,设置标签栏图标。 在执行此操作之前,请确保将这些图像作为资产包含在项目中。 homeViewController.tabBarItem.image = […]

Fabric Crashlytics设置痛苦

今天浪费了一些时间尝试将Fabric / Crashlytics与应用程序集成。 问题: Fabric报告缺少DSYM,这意味着它无法表示崩溃。 解决方案: 我忘记调整调试构建的构建设置,以输出“带有DSYM文件的DWARF”。 根据StackOverflow: 转到项目的构建设置,然后在构建设置中搜索调试信息格式,然后搜索“调试信息格式”,然后将“调试信息格式”设置为“带有dSYM文件的DWARF” 参考: http://stackoverflow.com/questions/29209582/make-sure-your-project-build-settings-are-generating-a-dsym-file-debug-informat