Tag: xcode

关于用于Apple应用程序开发的Xcode IDE

在本章中,我们将介绍Xcode IDE应用程序开发工具。 Xcode是用于macOS的集成开发环境(IDE),其中包含由Apple开发的一套软件开发工具,用于开发用于macOS,iOS,watchOS和tvOS的软件。 Xcode IDE是Apple开发经验的核心。 Xcode与Cocoa和Cocoa Touch框架紧密集成,为构建Mac,iPhone,iPad,Apple Watch和Apple TV的应用程序提供了令人难以置信的高效环境。 Xcode可以使您从概念到代码再到客户。 最新的稳定版本于2003年首次发布,可通过Mac App Store免费为macOS用户使用。 助理编辑 助手按钮将Xcode编辑器一分为二,主要工作文档在左侧,智能助手编辑器窗格在右侧。 助理编辑器会根据您在主编辑器中执行的工作自动显示Xcode确定对您最有帮助的文件。 跳杆 单击每个编辑器窗格顶部的跳转栏,您可以快速选择要在助手编辑器中查看的信息。 例如,在主编辑器中编辑源代码时,助手可以显示对应的标头,子类或超类或相关测试。 界面生成器 Interface Builder设计画布完全集成在Xcode IDE中,可以轻松构建完整的用户界面原型,而无需编写任何代码。 在数分钟内完成原型制作,然后以图形方式将您的界面连接到Xcode编辑器中的源,布置窗口,按钮和滑块以创建可正常运行的Mac,iPhone或iPad用户界面。 自动版面 iOS和macOS都包含一个称为自动布局的强大布局系统,Interface Builder内置了出色的支持。 自动布局基于这样的思想,即界面中的每个对象都可以定义约束来控制其对父视图和其他界面控件的反应。 例如,当显示其他语言时,您可以优先确定按钮是保持特定大小还是展开以容纳较大的文本。 Interface Builder可以自动为您创建所有约束,从而确保了一组兼容的规则。 您还可以直接控制约束条件,以定义每个约束的确切优先级,定义应用程序在不同屏幕尺寸,旋转或在新的语言环境下运行时的工作方式。 故事板 完整的iOS应用程序由用户浏览的多个视图组成。 这些视图之间的关系由情节提要板定义,这些情节提要显示了应用程序流程的完整视图。 Interface Builder的情节提要设计器使创建和设计新视图变得容易,并将它们链接在一起以创建一个完整的用户界面,可用于自定义代码。 Xcode包括故事板控制器,用于: 表格视图控制器 集合视图控制器 导航控制器 标签栏控制器 页面视图控制器 GLKit View控制器 或建立自己的 预习 使用预览模式可以在各种情况下快速查看界面,而无需运行您的应用程序,从而大大加快了迭代设计过程。 您可以在iOS的早期版本,不同屏幕尺寸等上以纵向或横向格式查看您的应用。 主要特点 Xcode支持C,C ++,Objective-C,Objective-C ++,Java,AppleScript,Python,Ruby,ResEdit(Rez)和Swift等编程语言的源代码,并提供多种编程模型,包括但不限于Cocoa, Carbon和Java。 第三方增加了对GNU […]

状态栏在iOS 9+中发脾气

如果您的应用支持iOS 9+ ,则您已使用修改了状态栏样式。 UIApplication.shared.setStatusBarStyle( .lightContent, 动画:真实 ) ..那么您一定已经看到上面的警告说它已经过时了! 与往常一样,它也建议我们使用替代的新方法。 覆盖var preferredStatusBarStyle:UIStatusBarStyle { 返回.lightContent } 如果您还没有使用过它,那么就让我们来谈谈吧,您可以跳到下一部分,我在这里讨论了在某些情况下它如何发脾气😒 preferredStatusBarStyle是UIViewController上的新UIViewController 。 必须在自定义视图控制器中覆盖它,这意味着在这里您可以控制其状态栏(黑色或白色👍)的样式。 每当加载控制器时,都会调用此属性。 在某些情况下,您的控制器可能希望根据某些条件(例如您滚动了多少)来再次更新其状态栏样式。 在这种情况下,您可以致电.. setNeedsStatusBarAppearanceUpdate() 此方法强制iOS更新其状态栏,并且在此过程中它将调用preferredStatusBarStyle 再次👍。 因此,您也可以根据需要强制iOS更新其状态栏😊 一切看起来不错吧? 😈 在一种情况下,这是行不通的,即您的控制器已嵌入导航堆栈中。 原因是iOS需要父控制器 (而不是子控制器) 决定需要显示哪种状态栏! 让我们看看在这种情况下会发生什么。 子控制器的preferredStatusBarStyle 不会被调用 其父导航控制器的 preferredStatusBarStyle 将被调用 现在不用担心,您不必UINavigationController子类来处理状态栏更新。 相反,我们可以利用扩展来进行救援。 您只需在代码库中添加以下逻辑即可。 扩展UINavigationController { 打开覆盖var preferredStatusBarStyle:UIStatusBarStyle { 返回topViewController?.preferredStatusBarStyle? 。默认 } } ..此逻辑仅表示您正在要求导航堆栈的topViewController决定需要显示哪种状态栏,以显示topViewController除了屏幕上当前的控制器topViewController什么都没有! 这样,您仍然可以在当前控制器中处理更新🚀 不确定为什么苹果决定这样做,但我们必须应对它

带有存根示例的自定义Xcode构建配置

您可能已经看到Xcode创建新项目时,有两种构建配置:Debug和Release。 在本文中,我们将学习如何使用网络存根示例创建自定义构建配置,以演示如何进行设置以及其工作方式。 最近,我们正在一个项目上进行工作,其中我们有一个网络层来向我们的服务器发出请求,并在它上面的一个服务层来接收响应,并且在大多数情况下都会发生业务逻辑。 在这种情况下,为了同时测试网络层和服务层的业务,我们使用模拟数据对测试请求进行存根。 我们可以通过多种方法来执行此操作,包括将参数传递给网络对象的运行时检查,然后在运行时进行条件检查,以确定是否应该对响应进行存根。 我们将从Debug配置中创建一个新的。 现在我们有了定制的构建配置,下一步是设置编译器标志,以便我们可以进行标志检查。 我们仅搜索活动编译条件并添加了TEST标志。 对dd来说,在Project和Target上使用此标志非常重要。 现在我们有了一个新的构建配置,我们可以将其设置为将用于该项目上每个目标的每个动作的配置。 添加标记后,我们现在需要在“测试”操作上编辑架构,并更改它将使用的构建配置。 只需为“测试”操作选择“测试”构建配置,即可完成。 现在,我们的测试目标将使用“测试”配置来构建。 现在,让我们看看它如何在我们的示例中运行: 这就是全部,希望您喜欢🙂 如果我有问题或您有任何意见或疑问,请告诉我。 我很高兴收到您的反馈feedback 您可以在Twitter上@ LucianoPassos11找到我。 感谢您阅读🙂

迁移到mojave和xcode 10的问题(到两个xcode的旅程)

我遇到以下问题,我对xcode 4.9的sierra具有与swifth 4兼容的cocoapods的高警告。 但是我没有耐心,所以我安装了莫哈韦沙漠。 “因为为什么不”。 它具有黑暗模式! 而且非常漂亮。 因此,作为一名优秀的程序员,它不想记住过去,因为一切都可以,因为我安装了它的所有内容都安装了新更新,并且在1周内一切都非常完美。 但是最终,我需要在上一个项目中工作才能为客户进行一些更改。 一切看起来都很好,因为如果您选择编译到仿真器,那么一切都会正常进行。 问题是当您想交付给质量保证团队进行物理设备测试时。 为此,您需要“存档”该应用程序,但是要进行存档,您需要在“通用设备模式”下构建。在这种模式下,它尝试编译为设备的特定体系结构,在这种情况下是armv7,但失败了。 我遇到的第一个错误是语法错误,swift 3到swift 4在协议内部没有代码的情况下遇到了一些问题,知道swift的一些专家会说,不,这不是问题,这就是为什么您需要这样做,请修复您的代码,但是您需要知道此代码根本不是我的问题,我只是遗传问题,需要修复。 所以我花了很多时间试图使这项工作。 (如果您不想要答案,则需要等待,因为这很困难,我想让您知道它有多困难。Naa开玩笑地说,最终的解决方案是再次安装xcode 4.9.1 ,令我惊讶的是,它兼容Mojave的版本,但在同一台计算机上使用两个xcode时需要了解一些事项。 所以我去了https://swift.org/download/#releases并下载了与原始代码版本最接近的swift 4.1.2文件。 请注意,我下载了两个文件,即工具链和调试符号,这一点很重要。 在我安装并重新尝试编译之后,令我惊讶的是它可以在“通用模式”下编译,万岁!!! 因此,我创建了文件“ .ipa”,并通过daiwi.com分发。 所以我开始下载,但卡住了。 再次恐怖。 IPA文件已损坏。 所以我有点失望。 之后,我尝试了我的最后一个资源。 再次下载xcode 9.4.1(非常具体)。 (您可以通过下载在developer.apple.com网页内进行下载。https://developer.apple.com/download/more/ 接下来,我安装了它,它可以编译,Hurray,它可以创建IPA,Hurray,当我尝试安装时它可以工作。 很棒!!!! 但是,并非所有事情都能轻松解决,因此您需要两个xcode。 一个用于使用适当的工具链(Swifth 4.1.3 xxx.xxx.xxx)(Xcode 10)在仿真器中开发代码并进行测试,另一个仅用于编译代码,因为出于某种原因仿真无法正常工作,因此您进行测试xcode 10中的应用程序。(要使两个xcode正常工作,您需要删除每次使用xcode时创建的临时文件 ),因此,如果首先从Xcode 10更改为Xcode 9,则需要删除(https:/ /stackoverflow.com/questions/18933321/can-i-safe-delete-contents-of-xcode-derived-data-folder) 如果不这样做,则xcode可能会表现为extrange。 而且您可以花很多时间尝试了解为什么不起作用。 最后,对于我写这篇文章的错误,我深表歉意,我只是想摆脱我的这种挫败感,因为我知道有人也有类似的问题。 我稍后将修复修订。

如何使用Swift 4将YouTube视频嵌入iOS应用中

这篇文章将教你如何使用Swift 4和Xcode 10将YouTube视频嵌入到任何iOS App中。 似乎辅助程序库youtube-ios-player-helper在Swift 4或iOS 12上无法正常播放。 幸运的是,hmhv进行了一些更改,使其在Swift 4 / iOS 12中稳定。更新的帮助程序库在此处提供。 尽管这篇文章很长,但我会详细介绍每个步骤,以便初学者可以继续学习。 随意跳过您喜欢的部分! 为了开始,请打开您的Xcode项目或创建一个新项目。 然后按照以下步骤操作。 步骤1: 首先,我们将通过Cocoapods安装帮助程序库。 如果您不了解Cocoapods,可以在这里了解更多信息或遵循本指南。 打开终端并进入创建Xcode项目的目录。 (执行此操作的一种简单方法是键入“ cd”,然后将文件夹从Finder拖放到“终端”窗口中),然后键入: 荚初始化 接下来,使用Project-Name .wcworkspace文件而不是通常使用的Project-Name .xcodeproj文件打开您的项目。 现在,您将看到“ Pods”部分,如果打开该部分,则将看到“ podfile”文件。 在#Pod for Your-Project-Name的下面,粘贴以下内容: pod“ YoutubePlayer-in-WKWebView”,“〜> 0.2.0” 现在看起来应该像这样: 通过转到文件->保存或⌘+ S 保存文件 。 接下来,返回到Terminal,然后输入: 吊舱安装 现在应该将帮助程序库安装到您的Xcode项目中。 您的终端屏幕应如下所示。 您可能需要使用Project-Name .xcodeproj文件重新打开Xcode。 第2步: 现在我们已经安装了帮助程序库,我们可以将库导入到我们的ViewController中。 打开要嵌入YouTube视频的ViewController。 在顶部,通过输入以下内容导入库: 导入 YoutubePlayer_in_WKWebView 第三步: 接下来,让我们打开情节提要,然后将UIView拖到ViewController上。 我仅出于此操作方法的目的在下面将我的颜色涂成绿色。 […]

从iOS开发人员到产品经理(第1部分)

产品经理(PM),听起来不错的职位,对吗? 但是我是如何从开发人员成长为PM的呢? 我期待什么,我得到了什么? 你怎么能成为一个好的下午? 我的故事始于一名iOS开发人员,我自己学习了一切,没有人教过我,仅仅是因为没有人能做到(目前,突尼斯大学没有教过)。 在2010年,我是一名刚开始对3D游戏充满热情的计算机工程师。 我当时正在这个领域寻找工作,但是那个时候在突尼斯,只有少数几家公司指定3D领域,没有人愿意雇用没有经验的人,我们都知道……而我需要一些钱(例如,您知道要吃饭),我在一家法国电信公司的呼叫中心成为了代理商agent。 “ 可是等等! 你为什么要谈论这个? 这与PM工作无关。 “ 是的,它确实 ;)。 实际上,这对我的运营商非常有用。 它使我学会了如何控制自己的压力(如果有客户打来电话,很少会向我们表示祝贺。)以及“引导”讨论和他对我所工作的公司的“愿景”。 这是一门艺术,我对此很擅长。 但是您知道工程师永远无法或至少不会这样做。

Bitrise上的Xcode 9代码签名

最近,出现了一些新的代码签名问题,但问题已经解决,因此请 在Bitrise上 更新适用于iOS的Xcode存档和导出步骤 ,看看是否可行 。 如果不是这样,请参阅下面的说明和本文末尾的说明。 您可以在几周前的“ Xcode 9中的新导出选项Plist”中阅读有关IPA导出选项的更改。由于IPA导出过程已解锁了一些新选项,因此Xcode会自动检测并处理其中的大多数选项,但是从Xcode 9开始,我们需要手动定义它们。 第一个变化是,从此Xcode版本开始,我们需要为您的应用程序中的每个可执行目标列出,Provisioning Profile应该对其进行签名。 exportOptions中此属性的名称为provisioningProfiles ,在某些情况下,如果不定义此属性,您将收到以下错误: “Error Domain=IDEProvisioningErrorDomain Code=9 \”\”ios-simple-objc.app\” requires a provisioning profile.\” UserInfo={NSLocalizedDescription=\”ios-simple-objc.app\” requires a provisioning profile., NSLocalizedRecoverySuggestion=Add a profile to the \”provisioningProfiles\” dictionary in your Export Options property list.}” 用例:您正在尝试使用手动签名从存档中导出IPA文件。 如果是自动签名(在导出过程中),则无需定义此属性。 在用于建筑物的Bitrise虚拟机上,您无法使用凭据登录Xcode,这就是为什么您无法执行IPA自动导出的原因。 但是,如果您使用“本地自动导出”并且Xcode为您生成了代码签名文件,则可以在Bitrise上使用这些代码签名文件来导出IPA。 因此, Xcode Archive & Export for iOS为Xcode 9 Xcode Archive & […]

在Swift 4中优化构建时间

随着Swift的成熟,其编译器也已成熟。 自从Swift 2众所周知的缓慢构建时间以来,我们已经走了很长一段路,再加上当时Xcode的普遍错误,我不确定那时我们是如何完成工作的! 尽管Swift 4和Xcode 9的编译时间似乎变得更好了,我们是否可以进行任何调整以进一步提高性能? 那我们的Swift代码呢? 如果您在过去两年中完全遵循此问题,则可能会遇到有关如何优化Swift代码以加快编译时间的建议。 这些调整是否仍然必要? 在这篇文章中,我将尽力回答这些问题,并从我自己在Swift 4中的构建时间的经验中提供一些学习经验。 快速构建时间-过去,现在和未来 尽管自Swift成立以来就一直观察到构建速度很慢,但直到Matt Matteded发表他关于一个看似简单的代码片段的观察结果,并花了12多个小时才能编译之后,我才觉得它并没有真正成为主流问题。 当然,该错误已在Swift 3中修复,并改进了将Swift和Objective-C代码混合在一起的项目的编译时间。 Swift 4继续改善了编译时间,毫无疑问,当Swift 5明年发布时,我们将看到更多的改进。 缩短Swift构建时间 何时开始做某事 有时很明显,您的编译时间有些不正确。 您可能会注意到,您的项目似乎需要花费很多时间进行编译-尤其是当您经常切换分支时。 在其他情况下,您可能需要花费一些时间来优化构建时间: 项目进行中-在项目中期“健康检查”中尽早发现潜在问题 在项目即将结束时-确保高质量的初始发行版,并为以后的发行版成功做好准备 继承代码库-从长远来看,现在修复速度下降应该会带来收益 缩短Swift构建时间 你能做什么? 您可以采取两项主要措施来缩短构建时间–调整项目设置或调整Swift代码。 调整项目设置很容易,可以带来重大的改进,绝对值得花时间投资。 调整您的Swift代码会花费更多时间,但也会产生积极的结果。 调整项目设置 仅构建活动架构 确保调试构建的仅Build Active Architecture(仅构建活动体系结构 )设置为Yes 。 这是创建新的Xcode项目时的默认设置,但是最好再次检查以确保它不会意外地设置为其他设置。 调试信息格式 确保将“ 调试 选项 ”的“ 构建选项” →“ 调试信息格式”设置为DWARF 。 这是Xcode的默认设置,但可以仔细检查。 注意:如果您使用的是Fabric / Crashlytics,则可能需要使用dSYM File将此设置保持为DWARF 。 […]

ARKit 2.0重新整合对象

即时消息,2.0版的合作伙伴,侦查对象的合作伙伴,大批人。 类似的形式,个人身份,形象研究。 普通居民的市长差事入门 。 苹果,ARKit扫描仪,原型和多用途笔记本,ARKit扫描仪以及其他产品。 Lopodéisver en el siguiente视频。 与普通的希西莫斯骗局相似。 Tenemos queañadirlo siguiente a laconfiguración。 configuration.detectionObjects = ARReferenceObject.referenceObjects(inGroupNamed:“ AR资源”,包:无)! 是的,是由单身执行者,是从地下工程公司到新的建筑商。 是的,没有罪名的罪犯,是因犯罪而实施的罪名,因犯罪嫌疑人被解雇。 func renderer(_ renderer:SCNSceneRenderer,didAdd节点:SCNNode,锚点:ARAnchor){如果让objectAnchor =锚点为? ARObjectAnchor {debugPrint(“ DETECTADO-> \(objectAnchor.name ??”“)”)}} Y listo,发现和处理Podemosañadiren el node lo que queramos y necesitemos。 Tenemos todos los datos de ese objeto,desde su punto Central,med idas e incluso los“ feature points” […]

Swift中的ES8风格异步编程指南

背景 来自JavaScript / TypeScript / Node.JS背景,Swift中内置的异步编程范例使我有点不知所措。 我习惯于处理回调,promise和异步代码。 Swift有一个很酷的小工具,叫做Grand Central Dispatch,用于运行异步代码。 例如,如果我正在制作Todo应用程序,并且想为特定用户抓取一堆Todos,我会编写一些如下代码: 在我的Swift冒险期间,我发现了几个非常酷的库,这些库使我能够将所有JavaScript范例带入Swift的世界:PromiseKit和AwaitKit。 这两个库的结合将一开始的示例Swift代码变成了JavaScript示例中漂亮,干净,同步的代码。 PromiseKit还提供了URLSession的一些不错的扩展, URLSession扩展使处理HTTP请求变得更加容易。 等待承诺 这些库以与JavaScript的Promise构造非常相似的范例进行操作:您可以使用任何异步操作创建Promise,并且可以等待任何Promise。 对于上面的Swift示例,我们可以通过执行以下操作来重构它(较长的代码,因为它是一个完整的有效示例): 我们在这里做一些事情,所以让我们分解一下: 为我们的Todo创建一个对象。 该对象与我们的API提供给我们的JSON完全匹配(即https://jsonplaceholder.typicode.com/todos/1),因此我们将使用令人敬畏的Decodable协议将JSON直接解码为Swift对象。 创建一个函数loadTodos() ,该函数返回Todos数组的Promise。 我们使用return async { … }语法来做到这一点。 在内部,我们使用URLSession提供的方便的URLSession扩展,通过compactMap为所有HTTP请求创建Promises。 一旦有了Promises数组,我们就可以使用when语法等待它(类似于JavaScript中的Promise.all() )。 在Promises解决之后,我们可以通过它们进行映射,并将原始JSON响应很好地解码为Todo对象。 在主线程中创建一个printTodos()函数,该函数使您可以使用Promise语法调用loadTodos()函数。 这遵循现代JavaScript范例,其中大多数逻辑发生在async函数中,而入口函数调用Promise.then()来执行它。 如果您有返回Promises的函数(如URLSession的URLSession ),则此方法效果很好。 但是,创建您自己的Promise并抽象出异步逻辑非常简单。 PromiseKit提供了有关如何执行此操作的出色文档。 结论 我很高兴找到这些库,并使我的Swift编程感觉与我熟悉的JavaScript模式相似。 请随时提出反馈意见!