Tag: xcode

在Xcode 10中进行性能分析

Xcode 10提供了分析构建性能的新方法。 使用新的“构建时间摘要”收集对构建性能的宝贵见解。 使用“构建时间摘要”构建性能见解 Xcode 10中的新增功能是“使用时序摘要生成”操作。 运行此操作将构建您的项目,该项目一旦显示了构建摘要,就可以使用“ Product > Perform Action > Build with Timing Summary或使用xcodebuild -buildWithTimingSummary在菜单中进行触发。 构建完成后,导航至“报告导航器”,然后选择最后一个构建。 一直向下滚动,直到看到“ Build Timing Summary”。 这是研究应该在哪里改进项目的一个很好的起点。 通常大部分时间都是CompileSwiftSources和PhaseScriptExecution 。 第一个显然归结于您的Swift代码。 后者指向您的自定义构建阶段。 通常可能会禁用某些运行脚本,而这些仅是发行版本所必需的。 改善构建性能 尽管这篇文章专注于分析构建性能,并且有很多方法可以提高构建性能,但是Xcode中有自己的设置可以直接提高性能。 使用 整个模块 进行 调试 构建是改进构建的权宜之计。 整个模块 可防止增量构建。 其中之一是启用Incremental Builds而不是Whole Module编译。 在“我在Xcode 10中启用新添加的选择功能”中阅读有关此内容的更多信息。 这个故事最初发布在: https://www.avanderlee.com/optimization/analysing-build-performance-xcode-10/

Touchองเล่น触摸栏模拟器บนXcode

全新Macbook Pro全新Macbook Pro触摸屏触摸屏้ 8.1,macOS Sierra发行版Siนเวอร์ชั่นใหม่ล่าสุดเพื่อที่จะได้ลองเล่น เริ่มจากเข้าไปอ่านและโหลดโค็ดตัวอย่างจากเว็บของแอปเปิล 新款MacBook Pro的触控栏– Apple Developer 为新的MacBook Pro上的Touch Bar准备好您的应用程序。 developer.apple.com Touchรันโค็ดตัวอย่างจากเว็บหวังว่าเราจะได้เห็น触摸栏โผล่มาบนหน้าจอแต่… งมีSimulatorไม่มีแล้วพวกะถ้ราะถ้าไม่มีแล้วพวกDevทั้งหลายที่ยังไม่มีMacbook Proตัวใหม่ที่มี“ Touchอัจฉริยะ” จะพัฒนาโปรแกรมเพื่อทำงานบน触摸栏ได้ยังไงกัน Xcodeและก็เจอตาตาในใอกสารต่อและพบว่ามันสามารถเปิดขึ้นมาได้จาก แต่…มีนXcode 8.1มีามันไม่มีเมนูตามรูปนี้(แต่อย่างน้อยก็รู้แล้วว่ามันมีSimulatorให้เล่นแน่นอน)เลยไปตามกูเกิลต่อว่าใครเป็นเหมือนกันหรหอเปล่าสุดท้ายได้คำตอบว่า 如何启用TouchBar模拟器| 苹果开发者论坛 嗨,我没有在最新版本的Xcode 8.1(8B62)中看到TouchBar模拟器。 在Xcode> Window中,我看不到Show… forums.developer.apple.com งลงร8.1อมึงต้อมึงต้Xcode 8.1และmacOS Sierra erraอร์ชั่นล่าสุดก่อนนะที่ล่าสุดคือล่าสุดกว่าของที่มึงอัพเดตจากApp Storeะ(ะองApp Store macอmacOS 10.12.1(16B2555)แต่ที่ล่าสุดของมันคือ(12B2657)) —เพราะงั้นก็โหลดเวอร์ชั่นโครตพ่อโครตแม่ล่าสุดที่เสือกมีเลขเวอ์ชั่์ชั่รเหมืนเหมือนกันมามจาก 下载macOS Sierra 10.12.1更新 编辑描述 support.apple.com (ากลงเรียบร้อย(重新启动เครื่องแปบ)ก็เปิดXcode 8.1กดWindowsก็จะมีเมนูShow Touch Barโผล่ขึ้นมา:tada:กดซะ งตัวามพิเศษของตัว触摸栏模拟器คือมัอมัรไม่ได้โชว์barองแอพที่เรากำลังรันอยู่อย่างเดียวนะ Finderมันก็จะเปลี่ยนไปแสดงเมนูสำหรับFinderแทนอน่างรูปข้างล่างคืางคืองคืาที่iTunesก็จะได้หน้าตาเปลี่ยน ไปเป็นแบบนี้ 触摸屏模拟器触摸屏模拟器งเล่นวไปลราก็จะได้Touch bar Simulatorขึ้าลองเล่น กได้รุปคือถ้าอยากได้触摸栏模拟器มาเล่นก่อนต้องทำยังไง code […]

简单的自定义UINavigationController过渡

最近,我开始从事一个新的个人项目,在该项目中,我对整个应用程序具有静态背景,而我所有视图控制器的视图都具有透明背景。 默认的过渡动画与源视图和目标视图有一点重叠,因此,只有一种方法可以使我们的应用程序具有一定的尊严和平滑度-是的-这是自定义动画过渡,并且由于我们通常想保持滑动手势来回手势在视图控制器上,我们还必须创建自定义的交互式过渡。 样例项目 我创建了一个示例项目-您可以在GitHub上找到它。 让我们开始理论 我们要做的第一件事是为UINavigationController实现自定义过渡,并实现其委托方法

使迦太基再次伟大!

您好,我是Max,我是iOS开发人员超过7年。 本文是关于依赖项管理的,因为我认为即使使用所有这些工具,它也是iOS开发过程中的薄弱环节。 感觉就像您只需要处理它,但这不是应该的样子。 在我的职业生涯中,我使用了许多依赖管理工具,从简单的拖放源代码到尖端的Swift依赖管理器。 但是仍然是我最喜欢的工具之一,仍然是Carthage:去中心化,易于管理,构建一次就可以忘记。 例如,与Cocoapods相比,它允许将所有依赖项分别并独立地构建为一堆二进制文件,这些二进制文件可直接链接到您的项目而无需复杂的配置。 我认为这是非常灵活和一致的方法。 (顺便说一句,不要忘了Cocoapods需要框架作者的大量动作。还记得pod repo的设置/更新时间吗?) 我不会在这里深入探讨可可足与迦太基。 您可以阅读很多这类文章。 我只是想表达我对迦太基的态度作为该主题的序幕。 然而,这并不完美。 我告诉你为什么以及如何修复它。 为什么迦太基不完美? 首先,如果您曾经使用过Realm,Alamofire,ReactiveCocoa等笨拙的大型框架之一,那么您可能已经注意到,您的CI / CD工作者花费大量的时间来建立依赖关系。 即使依赖项提供了预编译的二进制文件(但通常不提供),它也可能经常不适合您的Xcode / Swift版本。 因此,您花费大约80%的CI / CD时间来准备依赖项。 此外,邀请新成员加入团队或直接将现有项目克隆到另一台计算机,都会导致“让自己入睡”事件。 仅仅将框架添加到依赖项列表并不快。 当您挖掘过去的长期项目时,我什至没有在谈论过时的依赖关系。 最后但并非最不重要的一点:对静态框架的怪异支持。 为什么奇怪 因为Realm不会使用ld.py脚本构建到静态库中(例如,迦太基的推荐方法)。 您必须手动检查每个损坏的依赖关系,并为团队中的每个人将其替换为二进制文件。 金田挣扎。 顺便说一句,如果您错过了静态框架如此重要的原因,我告诉您:它显着降低了应用程序的大小和启动时间。 苹果也建议最多使用不超过6个动态库。 但是我们都为“只是一个框架”而感到内🙂 如何使它更好? 即使迦太基值得使用它。 但是有一种方法可以使它变得更好。 当我与许多团队一起处理大量应用程序时,我制作了一个工具,可将每个迦太基框架分别缓存到Amazon S3中。 因此,“已解决”文件中还有多少其他内容都没有关系,您可以根据需要下载它们中的每一个。 我的意思是,例如,如果有人至少为Swift 4.0.1构建了Realm 3.0.1,那么您可以立即下载它,而无需等待或编译。 Tbh我已经看到了很多用于Carthage的缓存工具,但是其中大多数要么需要拥有个人S3帐户,要么立即保存所有项,等等。 因此,我制作了一个工具来修复这些缺陷。 我想与您分享它,希望它可以使您的iOS编码体验至少好一点。 它称为迦太基缓存,可以在Github上找到。 如何使用它? 步骤1:下载至您的路径: 该工具将从云下载现有框架到Carthage的构建目录。 或者编译它们(如果以前没有人缓存过您的框架),然后将其上传以供公众使用。 但是静态框架呢? 这很简单: 它将下载或构建依赖项的静态版本。 […]

了解闭包中的内存泄漏

啊,内存泄漏……起初,您甚至都不知道它们可以存在,然后您将其忽略,然后在不知道如何正确处理它们的情况下开始到处看到它们。 好的,所以现在也许是时候清楚地了解它们的时间,何时发生以及可以使用哪些工具摆脱它们了。 苹果公司发表了一篇很棒的文章,介绍了强有力的课堂参考周期。 很容易理解什么是内存泄漏以及在这种情况下如何避免内存泄漏。 但是,这是一种非常罕见的情况,并且很容易发现。 我发现有关闭包的部分更加令人困惑。 因此,让我们一劳永逸地阐明这一点。 带封闭的参考循环 首先,您必须了解闭包是什么以及闭包是做什么的。 我喜欢将其描述为一段代码,该代码在声明时会创建自己的临时类,该类包含对其执行自身所需的所有对象的引用。 让我们以一个简单的示例开始:一个具有CustomView的ViewController。 该CustomView有一个闭包,当点击按钮时会调用该闭包。 如您所见,我们有一个周期。 这意味着,如果退出此视图控制器,则无法将其从内存中删除,因为它仍被闭包引用。 这个例子很清楚,我们的viewController有一个属性subview ,它有一个属性onTap来捕获self 。 但是不幸的是,它可能变得更加复杂。 潜在周期的例子 您始终必须问自己的问题是: 谁拥有封闭件? UITableView 如果您曾经构建过iOS应用程序,则必须在某个时候处理UITableView,而且很有可能,您还必须使用自定义按钮来处理自定义单元。 这是快速完成此操作的一种方法,首先,您有一个CustomCell,它具有一个动作闭合,可让您定义点击按钮时发生的情况。 GCD 您当然已经处理过Grand Central Dispatch,可以发现是否有周期吗? 在TableView示例中,如果您unowned在onButtonTap闭包中放weak或unowned ,您将看到类似以下内容: 右侧的感叹号指示泄漏。 但是Xcode有时很难检测到泄漏。 您很可能有泄漏但没有感叹号。 在这种情况下,您只需要注意内存中的内容,如果看到不应该存在的内容,很可能会泄漏。

如何在iOS上调试后台获取事件

注册您的应用以进行后台抓取,使您可以为用户做各种事情……例如更新图标的徽章计数! 但是您应该如何测试呢? 取回操作取决于操作系统…… 我将向您展示如何调试后台获取解决方案以及遇到的陷阱。 首先,在performFetchWithCompletionHandler设置一个断点,以便我们可以验证测试。 接下来,从Xcode的Debug菜单触发获取: 这应该可以正常工作,但这不是最有用的方案。 如果您想像这样进行调试,则可以直接直接调用performFetchWithCompletionHandler方法。 棘手的部分是重新创建完全不加载您的应用程序的情况,iOS将其唤醒以在后台执行。 这是我们遇到的#xcode问题。 编辑应用程序目标的方案,您将看到一个选项,用于模拟从后台提取事件启动。 在模拟器中尝试。 您将永远等待而不会出错。 显然,这曾经在模拟器中起作用。 但是不再。 精细。 让我们尝试使用该设备。 您可能会认为此错误是有意义的。 也许您需要进入手机上的“设备管理”设置,以验证您是否信任开发者证书。 我一般建议这样做,但是这里无济于事。 据我所知,这是一个通用的“超时”错误。 是什么赋予了? 好吧,这是一个错误。 在iOS 11.0.3之后,此功能就中断了。 如果您使设备保持最新状态(在撰写本文时为11.2.6),则将无法测试设备上的后台抓取。 那么现在怎么办? (编辑:自iOS 11.3和Xcode 9.3起,此功能现在可以使用!感谢Marco Mussini) 希望在Apple解决此问题之前,您可以使用较旧的测试设备。 如果您位于双子城,则可以在Livefront停留并使用运行11.0.3的iPhone 7 Plus(在FinalPass上注册-第一小时免费!)。 以此为警告-始终准备有备用测试设备,以及较旧版本的iOS! Sean在 Livefront 与Xcode有着严格的专业关系 。 ps如果您没有设备,但想验证启动顺序,我已经更新了AppLaunchSequence文档以包括后台获取。

五个针对iOS XCUITest的真实设备云测试服务

XCBlog上的原始博客在这里 苹果在WWDC15中推出了Xcode UI测试解决方案,从那时起,它已成为iOS开发人员使用同一框架编写单元和UI测试的首选。 以前,QA工程师使用诸如Appium和Calabash之类的框架来自动化iOS应用程序测试。 这些框架允许使用疯狂的语言(如Java,Ruby等)编写用户界面测试,而这些语言与iOS应用程序开发无关。 虽然,Appium和Calabash在质量检查世界中很受欢迎。 它从未引起任何iOS开发人员的注意,这在开发人员和测试人员之间造成了巨大的技术鸿沟。 苹果公司提供的XCUITests允许开发人员在Swift或Objective-C中编写测试,这有助于弥合技术差距并比以往更轻松,更快地创建UI测试。 市场上有太多的云测试服务可用于在Web应用程序的云机中执行测试,例如Sauce Labs,BrowserStack等。最初,很少有服务关注XCUITest,因为许多公司仍在使用Appium和Calabash和他们已经支持这些工具在云中运行测试。 但是,随着Apple不推荐使用诸如Appium和Calabash之类的工具的仪器技术,iOS 10版本改变了一切。 这打破了所有的移动测试自动化框架,必须使用苹果公司的新技术XCUITest。 然后,公司开始直接使用XCUITest,并且开始流行。 云测试供应商还需要增加支持以保持市场竞争力。 在本文中,我们将看到在云中的真实设备上运行XCUITest的选项。 请注意,本文不是关于服务的速度,价格或使用情况的比较。 1.位栏 Bitbar具有专门针对移动测试自动化而设计的设备云,该设备云遍及欧洲的多个数据中心。 作为仅限移动设备的测试服务,Bitbar是在云中支持XCUITests的先驱之一。 很久以来,他们都在其官方博客上撰写有关XCUITest和iOS自动化的文章。 它们与移动DevOps工具集成在一起,并具有远程调试功能。 您可以在一段时间内免费试用Bitbar。 Bitbar有很多客户,包括Microsoft,Skype,EA,Asus,Paypal,T-Mobile等。 2. AWS设备场 Amazon Web Services提供了各种软件开发服务,包括Device Farm,用于针对AWS云中的实际移动设备进行测试。 AWS Device farm包含有关如何使用各种框架(包括XCUITest)执行测试的出色文档。 我们可以将AWS服务与我们的免费套餐帐户一起使用进行试用。 AWS Device Farm已被包括Etsy在内的多个客户端使用。 3. Perfecto Perfecto是对移动Web应用程序进行基于云的连续测试的另一种选择。 Perfecto提供了在真实设备云中执行XCUITests的支持。 他们拥有有关包括XCUITest服务在内的各种服务的文档,视频和代码示例的丰富信息。 您可以在此处阅读有关配置XCUITests for Perfect cloud的更多信息。 Perfecto使用他们的服务有各种各样的客户。 这里列出了超过100个客户。 4. BrowserStack BrowserStack是另一项服务,最近宣布在其真实设备云上支持runningXCUITests。 这里有关于如何在BrowserStack上设置XCUITests的文档,它们还在此处与示例iOS项目共享了配置XCUITests的代码示例。 5.酱汁实验室 Sauce Labs在测试自动化社区中非常活跃,并举办多个活动和会议。 […]

使用Swift向图像添加滤镜-变得简单

使用Apple内置的Core Image功能过滤图像实际上非常简单。 我们需要做的第一件事是创建一个我们想要使用的过滤器类型的枚举: 枚举FilterType:字符串{ 案例Chrome =“ CIPhotoEffectChrome” case Fade =“ CIPhotoEffectFade” case Instant =“ CIPhotoEffectInstant” case Mono =“ CIPhotoEffectMono” 案例Noir =“ CIPhotoEffectNoir” case Process =“ CIPhotoEffectProcess” case Tonal =“ CIPhotoEffectTonal” 案例转移=“ CIPhotoEffectTransfer” } 接下来,我们创建一个扩展函数,该函数需要过滤器类型。 然后,它获取这个filter.rawValue并将其输入CIFilter,然后将其应用于图像。 扩展程序UIImage { func addFilter(filter:FilterType)-> UIImage { 让过滤器= CIFilter(名称:filter.rawValue) //将UIImage转换为CIImage并设置为输入 让ciInput = CIImage(image:self) filter?.setValue(ciInput,forKey:“ inputImage”) //获取输出CIImage,首先渲染为CGImage以保留适当的UIImage比例 让ciOutput = filter?.outputImage 让ciContext = […]

在XCode for iOS应用中添加自定义字体

该应用程序的不同字体提供了引人注目的外观和设计,从而在用户脑海中为使用前景创造了积极的形象。 例如,如果您要为杂志或报纸发行公司开发应用程序,则应为该应用程序选择正确的字体,就像用户阅读杂志或报纸一样。 首先,您需要在应用程序中使用的所有字体文件。 字体可以由图形设计师提供,也可以从在线网站获得。 您应该具有.ttf或.otf的所有字体文件,这些文件由XCode支持。 现在,将所有字体文件拖放到XCode特定的文件夹中。 一旦在XCode中添加了字体,请确保所有字体都在那里。 我们也可以通过将其打开到Xcode.SO中来查看字体样式,基本上它的外观如下: 现在,我们必须在info.plist文件中提及所有字体,例如: 我们还可以通过打开它作为info.plist的源代码来添加它,并添加以下代码: UIAppFonts Roboto-Bold.ttf Roboto-Light.ttf Roboto-Medium.ttf Roboto-Regular.ttf FontAwesome.ttf SF-Pro-Display-Bold.otf SF-Pro-Text-Bold.otf SF-Pro-Text-Light.otf SF-Pro-Text-Medium.otf SF-Pro-Text-Regular.otf 现在,我们必须在“ 构建阶段”下的“ 副本捆绑资源”中添加所有字体,例如: 因此,成功将字体添加到了我们的项目中。 现在,我们将通过在日志中打印所有可用字体来对其进行测试。 编写以下漂亮代码以在日志中打印字体: 对于家庭:UIFont.familyNames中的字符串 { 打印(“ \(家庭)”) 用于名称:UIFont.fontNames(forFamilyName:family)中的字符串 { 打印(“ == \(名称)”) } } 希望本文能帮助您在iOS应用中使用自定义字体。 如果对此有任何疑问。 您可以自由地联系/评论。

调试断点以替代打印

Xcode中的调试断点允许您替换打印并在以后的调试会话中重用调试语句。 通过简单地启用和禁用所需的断点,您还可以摆脱通常在CocoaLumberjack之类的库中定义的调试级别。 通过在需要时启用断点来重用它们 使用断点替换打印语句 保持代码干净,而无需调试日志 在此视图中,一旦断点被​​触发,您就可以定义其行为。 这将在控制台中记录以下行: “Did add 2 content items to bucket Photos” po代表打印对象,可用于在断点行的上下文中打印任何可到达的对象。 通过Automatically continue after evaluating actions勾选“ Automatically continue after evaluating actions您可以允许调试器在击中断点后继续运行而不会暂停。 带有断点的更高级的调试 您可以通过调试断点做更多的事情。 一个很好的开始是查看Paul Hudson的演讲“如何像专业人士一样进行调试”,此处提供了该演讲。 这个故事最初发布在: https://www.avanderlee.com/debugging/debugging-breakpoints/