Tag: Xcode 9

iPhone尺寸等级

尺寸类别可让您对屏幕的宽度和高度进行分类,并根据这些组合设置条件。 例如,您可以确定化身在具有紧凑宽度的屏幕上为30 x 30 pt ,但在具有常规宽度的屏幕上为50 x 50 pt ,这仅仅是因为较大的屏幕上有更多的空白空间。 由于纵向和横向之间或iPhone和iPad之间的版式可能完全不同,因此尺寸类对于自定义版式超出常规的“自动版式”约束至关重要。 宽度和高度共有3种大小类别: Compact , Regular和Any 。 通过组合这些,您将同时影响多个设备。 例如, 紧凑型 (宽)x 常规型 (高)将以纵向模式定位所有iPhone,但不会影响横向或iPad。 有趣的是,即使屏幕的宽度很大, Compact x Compact也会影响风景中的iPhone(iPhone 6 +,7 +,8 +除外)。 因此,重要的是要熟悉不同的组合,如下图所示。 归功于: www.designcode.io

XCFit 7.0发布:XCTActivity,新的Xcode模板和多个CI服务支持

XCFit-7.0的新版本刚刚发布,具有一些新功能。 XCFit在版本6.0发行版中已经支持Xcode 9和Swift 4。 XCFit是Xcode for iOS应用程序中Xcode的面向全栈协议的BDD,使用Swift使用XCUITest。 XCFit允许我们使用诸如Give / When / Then格式的工具以人类可读的语言编写Swift的BDD样式API /合同级别,UI和验收测试。 在这篇简短的文章中,我们将看到XCFit-7.0的新功能。 此版本具有一些新功能,例如XCTActivity,新Xcode模板和持续集成服务支持。 我们将详细介绍以下新内容 XCTActivity支持 Xcode 9和XCTActivity支持的新Xcode模板 对XCFit的多个持续集成服务支持 UI测试通常是长时间运行的,并且在那里发生许多动作,例如,点击按钮,滑动等。到目前为止,XCTest报告显示了测试报告中的所有动作,这些动作不是特别可读。 活动是通过提供有意义的名称来将这些操作组织到组中的方法,因此XCTest结果将在结果中使用该活动名称以使其更具可读性。 您可以在此处阅读有关Apple官方文档的更多活动。 我们可以将活动分散到任何一组操作上,例如以干净状态启动应用程序 XCTContext.runActivity(名称:“鉴于我已经以干净状态启动了应用程序”) XCUIApplication()。launchArguments = [“ -StartFromCleanState”,“ YES”] XCUIApplication()。launch() } 当我们运行测试时,然后在测试报告中,我们将看到“鉴于我已经以干净状态启动了该应用程序”,因此更具可读性。 我们仍然可以通过扩展活动来访问基本操作。 XCTActivity现在支持XCFit预定义步骤。 现在,所有步骤都包装在XCTActivities中,以便可以读取Xcode报告。 您将在本文结尾的演示视频中看到这一点。 如果您使用过XCFit,那么您可能知道XCFit提供了Xcode模板,以开始使用Xcode中的面向协议的BDD。 可以使用Rubygem安装XCFit模板 $ gem install xcfit 如果您正在使用系统(预安装)Ruby(2.0),则可能需要使用sudo。 XCFit gem将用于为Xcode设置所有Xcode模板。 当前的Xcode模板具有Xcode组结构,如下所示 Feature.swift 该文件具有您的功能,它将所有可以作为验收测试实现的需求(测试)。 该文件包含Swift协议。 FeatureSteps.swift 该文件包含模板代码,该模板代码如何在功能协议之上使用Swift扩展实现给定功能的步骤定义。 它还提供了一些示例,这些示例在实现步骤定义时如何使用XCTActivity。 FeatureElements.swift 该文件包含与功能有关的所有XCUIElement。 […]

如何在Xcode 9中使用Xcode服务器

由于Xcode服务器已内置到Xcode 9中,因此我尝试使用Xcode服务器来替换我现在用于CI的fastlane。 Xcode和Xcode服务器签名的新功能– WWDC 2017 –视频– Apple Developer 了解Xcode对代码签名的支持的新进展,包括更强大的分发签名,更好的开发者。developer.apple.com 设置Xcode服务器 首先下载Xcode 9,您将在Xcode Preferences中找到Xcode服务器。 单击右上角的关闭/打开按钮以打开Xcode服务器。 Xcode将询问您要使用哪个帐户来创建服务器。 建议创建一个新的。 然后Xcode将为您创建服务器,您只需要登录帐户即可。 服务器部分已完成,非常容易。 设置客户 现在您有了Xcode服务器,那么如何在其上配置CI? 创建一个客户帐户。 仍在“ Xcode首选项”中,切换到“帐户”选项卡,单击左下角的小加号图标,然后选择“ Xcode服务器”。 在弹出列表中选择您的服务器并登录。每个团队成员都可以在自己的Mac上创建一个客户帐户,如果他不想编辑服务器,则可以使用来宾帐户登录。 创建机器人 最后,我们可以通过单击Product-> Create Bot来创建运行CI的机器人。 Xcode将要求您配置Bot。 如果选择在构建配置上进行测试,构建参数和触发器,则紧随其后的是信息,git repo,构建配置,构建时间表,签名,测试设备。 您可以稍后编辑机器人。 您可以在Xcode报告导航器中检查该漫游器。 右键单击Bot,可以创建/编辑/删除Bot。 您可以在网页上查看该漫游器。 您可以触发积分。 单击集成将在右侧显示一个报告页面,该页面告诉您集成的状态,测试数据和日志。 苹果有一个旧的Xcode服务器行会,但是如果遇到麻烦,它会提供一些有用的信息。 Xcode服务器和持续集成指南:关于Xcode中的持续集成 提供有关使用Xcode Server和实施持续集成工作流的指南和示例。 developer.apple.com 分配 如果您以前使用过其他CI工具,例如Jenkins,fastlane,您会发现Xcode服务器没有那么强大。 如果将其用于构建项目和测试也可以,但是分发效果不佳。 OTA OTA用于让质量检查测试应用程序ipa或安装Inhouse ipa。 Xcode服务器有一个内置网页,其中安装了OTA。 但是,您只能使用“ server.local”主机名安装ipa,这会使OTA仅适用于LAN网络。 扳机 另一种方法是使用触发器。 集成成功后,将ipa上载到HockeyApp等测试平台进行测试,或上载到testflight以准备提交。 […]

Xcode 9的主线程检查器和XCUITests

苹果公司最近发布了Xcode 9的稳定版本,其中包含许多新功能。 大多数iOS开发人员都说Xcode 9是最好的版本,因为它具有iOS开发人员一直想要的强大新功能。 您可以在此处阅读有关Xcode 9功能的更多信息。 我们刚刚将现有的XCUITest套件迁移到Xcode 9,发现通过XCTest编写的单元测试通过了,但是XCUITests停止工作并出现以下错误。 主线程检查器:在后台线程上调用的UI API:-[UIApplication委托] PID:740,TID:51958,线程名称:(none),队列名称:FIRAnalyticsQueue,QoS:9 XCUITests根本无法启动代理测试运行器应用程序,并且测试套件崩溃了。 从错误消息中可以明显看出,这与Firebase SDK有关,并且与主线程检查程序有关。 你们中的某些人可能已经陷入这个陷阱,或者您将很快迁移到Xcode9。在本文中,我们将讨论该错误的全部原因,以及新的具有Xcode功能的主线程检查器将如何帮助捕获潜在的错误。在应用程序中。 在陷入错误之前,我们将学习WTF是Main Thread Checker,以及Apple为何将其作为Xcode 9的一部分引入的原因。根据文档,“ Main Thread Checker从后台检测到对AppKit,UIKit和其他API的无效使用”线。 “ 这是什么意思?。 iOS开发人员可以轻松理解这一点,但是对于其他人,我将尝试用简单的语言进行解释。 有一些Apple框架旨在仅在主线程中在iOS应用中使用,在后台线程中使用这些框架是一种罪过。 如果您在后台线程中使用这些框架,那么您可能会在下一生中下地狱。 如果iOS工程师在后台线程中使用这些框架,则会发生疯狂的事情,如UI响应迟钝,视觉缺陷,数据损坏和崩溃。 简而言之,在后台线程中使用这些框架将使您的iOS应用成为可能。 主线程检查器发现框架的这种无效用法,并在运行时警告工程师,不要这样做。 它可以检测出罪魁祸首,以便您在不解决问题时对其进行惩罚。 Main Thread Checker是方便的工具,可以尽快检测到代码中的错误。 默认情况下,它在Xcode 9中被激活。 XCUITest启动名为XCUIApplication的代理测试运行器应用程序,以在代理应用程序中启动测试。 相应方案的XCUITest的主线程检查器处于活动状态。 在启动应用程序的UI时,主线程检查器检测到Firebase SDK在后台线程中使用了UP API。 Firebase团队已修复了Github上存在的问题。 可能还有其他一些第三方框架可能存在相同的问题,例如Flurry用户也在此处在Github上报告了相同的问题,但在撰写本文时仍未解决。 我们几乎没有办法解决此问题并开始使用带有Xcode 9的XCUITests。 如果问题在应用程序内部,我们可以通过解决iOS框架无效使用的问题来修复XCUITests。 如果主线程检查器检测到Firebase SDK等第三方框架中的问题。 我们需要让他们立即解决问题。 如果主线程检查器检测到第三方框架中存在的问题,并且他们无法及时解决该问题,那么不幸的是,我们需要从该方案中禁用主线程检查器。 转到“产品”>“方案”>“管理方案”,搜索用于测试的方案,然后在左侧栏中按“编辑”,然后按“测试”,然后转到“诊断”并取消选中“主线程检查器”复选框 请记住,这不是理想的解决方案,这是我们不应该在代码中添加的hack。 我们应该专注于直接在代码中解决导致无效使用框架的问题。 我希望,当您遇到相同的问题并节省几个小时的调查时,您会发现这篇文章很有用。 您是否已将XCUITests迁移到Xcode […]

Xcode 9.0 Beta(iOS 11上的无线调试)

调试。 通过网络无线调试iOS和tvOS设备,Metal的新调试器以及整个Xcode的更多功能。 源代码管理。 所有新的源代码控制导航器和对GitHub帐户的集成支持,可快速浏览存储库并将您的存储库推送到云中。 内置Xcode Server。 连续集成机器人可以在任何使用Xcode 9的Mac上运行,而无需安装macOS Server。 新的Playground模板。 包括旨在在iPad的Xcode和Swift Playgrounds中良好运行的iOS模板。 新的构建系统。 Xcode新构建系统的可选预览提供了改进的可靠性和性能。 无线调试 网络调试需要在MacOS 10.12.4或更高版本上运行的Xcode 9.0或更高版本,并且在设备上需要iOS 11.0或更高版本或tvOS 11.0或更高版本。 设置iPhone,iPad或iPod touch 选择“窗口”>“设备和模拟器”,然后在出现的窗口中,单击“设备”。 使用避雷线将设备连接到Mac。 在左列中,选择设备,然后在详细信息区域中,选择“通过网络连接”。 Xcode与您的设备配对。 如果Xcode可以使用网络与设备连接,则在左列中设备旁边会出现一个网络图标。

Swift gRPC和Protobuf集成

最近,我试图将gRPC和SwiftProtobuf添加到我的iOS应用程序中,这样做有很多问题,并且在整个周末以及星期一都在墙上ash头。 因此,首先,如果您不熟悉gRPC和Protobuf,请访问官方网站http://grpc.io/。 如果您尝试在Google上搜索诸如how to create Swift gRPC app东西,或者具有gRPC or Swift gRPC任何东西, gRPC or Swift gRPC您很可能最终会找到gRPC github,这是一个很好的资源,但对于某些人来说确实不清楚第一次尝试将此出色的框架集成到他们的项目中。 我现在要做的基本上是为您提供一些必要的步骤,以便设置您的环境(即拥有一个满意的Xcode)。 从https://github.com/grpc/grpc-swift克隆swift gRPC存储库 cd到grpc-swift并进行make 然后在grpc-swift cd third_party内部 在third_party文件夹中,您具有swift-protobuf cd 然后做一个 所以现在您将在 swift-protobuf文件夹中拥有SwiftProtobuf.xcodeproj ,在根目录grpc-swift 现在是时候将这些人添加到您的项目中了。 如果您要构建Mac应用程序,这会更简单一些,但是我将介绍iOS应用程序的步骤 创建一个新的iOS项目 将这两个.xcodeproj文件拖放到根项目下的项目中。 11.然后打开项目设置,然后转到“常规”选项卡。 12。 在嵌入式绑定器中,单击plus,然后添加BoringSSL,CgRPC,gRPC和Czlib框架。 13.如果您执行build,则将至少遇到一个编译错误,该错误表示无法找到CgRPC. 14.返回项目设置,然后选择“构建设置”选项卡并搜索搜索路径。 15.在您的System Header Search Paths和System Framework Search Paths添加“ / grpc-swift / Sources / CgRPC / include System Framework […]

Swift 4:使用可编码协议处理复杂的JSON结构

在任何应用程序中,最常见的功能之一就是解析来自服务器的响应,该响应主要以JSON字符串的形式出现。 虽然在android和其他平台中,有一些库可以用来解析并返回您填充的模型,但与此同时,iOS中缺少此主要功能。 JSONSerializer确实生效了,但是它所能做的就是将您的JSON字符串/数据转换为字典。 因此,您可以自己填充模型,同时要记住类型转换和错误处理。 这不仅增加了代码的大小,而且还花费了很多时间,尤其是在处理庞大而复杂的JSON文件时 解析不带编码的JSON 这是一个看起来很丑的Apple博客,用于在Swift中解析JSON 在Swift中使用JSON – Swift Blog 从创建它的工程师那里获取有关Swift编程语言的最新新闻和有用的提示。 developer.apple.com

收藏查看Swift 4-iOS11

今天,我们将在Swift 4 iOS 11 Xcode 9中讨论集合视图, 步骤1:建立新的Xcode专案 步骤2:创建MVC文件夹(Model View Controller) 在controller文件夹中,创建新的可可触摸快速文件(UIViewController),将其命名为MainVC,在View文件夹中,创建新的可可触摸快速文件(UICollectionViewCell) 步骤3:打开Main.Storyboard 从对象库拖动集合视图 将Class CollectionViewCell连接到我们的单元格 在单元格中添加名为proLbl Label,并通过单击将其连接,然后在键盘上按Control键并拖动到CollectionViewCell View中 步骤4:打开Controller — MainVC.swift 将UICollectionViewDataSource和UICOllectionViewDelegate添加到类中,然后添加这两个支持功能 func collectionView(_ collectionView:UICollectionView,numberOfItemsInSection部分:Int)-> Int { //返回section的行数。 } func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell { //返回配置的单元格对象。 } 添加一个数组变量以显示collectionViewCell中的数据 //创建一个包含我们的数据的数组 var array = [“第一个单元格”,“第二个单元格”,“第三个单元格”,“第四个单元格”,“第五个单元格”] 编辑numberOfItemsInSection函数以返回array.count func collectionView(_ collectionView:UICollectionView,numberOfItemsInSection部分:Int)-> Int { 返回array.count } 编辑cellForRowAt函数以返回单元格 func collectionView(_ collectionView:UICollectionView,cellForItemAt […]

Swift 4和@objc警告

最近,我参与了一个迁移到Swift 4的项目,该项目在其代码库中混合了Swift 3和Objective-C。 因此,在接受来自Xcode 9的邀请以将项目转换/迁移到Swift 4之后,我遇到的第一件事是一个可怕的警告,说: 不建议在Swift 4模式下使用Swift 3 @objc推断。 请解决已弃用的@objc推断警告,启用“使用已弃用的Swift 3 @objc推断”日志记录来测试代码,然后通过将“ VarageSale”的“ Swift 3 @objc推断”构建设置更改为“默认”来禁用推断。目标。 @objc推论? WTF! 好的,这就是我所拥有的,正如您所知,Swift生成的代码仅对其他Swift代码可见/可用。 就像《猿人星球》电影中“猿不杀死猿”的扭曲版本一样。 因此,如果您有一个Swift类,要在Objective-C中使用哪些成员(函数,协议,变量),则需要通过使这些成员具有@objc属性来显式指示这些成员。 这是棘手的部分,在Swift 3中,编译器非常纵情,为某些类成员添加了@objc ,即使您可能不需要它。 但是在Swift 4中,在此问题上限制更大或更宽泛,因此我得到了警告(也可能是您)。 解决方案 1-使用@objc 就像我提到的,您可以使用@objc属性标记函数或属性, @objc会将标记的成员公开给Objective-C。 2-使用@ objcMembers 现在,如果要将所有类成员公开给Objective-C,则可以使用@objcMembers标记该类。 但是使用@objcMembers时要明智,因为由于需要在Swift和Objective-C之间映射的额外代码,它会使二进制文件更大。 参考文献 迁移到Swift 4 @objc推断 限制@objc推断

使用.xcconfig文件在Xcode Project中存储各种SDK密钥和ID。

可以直接保存在plist中。 如果是Facebook和Google Login集成,则还必须在项目目标->信息中添加URL类型。 如果有一天,您必须为项目更改这些开发密钥,ID,机密ID,ClientId,RevereClientId等。 然后,您必须在多个位置(例如info.plist,项目目标的信息中的URL类型和.swift文件中的URL类型)中更改这些内容。 因此,如果您只想在一个地方管理这些事情,这就是解决方案。 在名为Release.xcconfig和Debug.xcconfig的项目中创建两个带有.xconfig扩展名的文件,并在如下所示的两个文件中写入各种SDK的所有密钥,ReverseClientIds,ClientIds等。 URL类型内重复相同(项目目标->信息) 如果要访问.xcconfig,则.swift文件中的任何键或值。 就像使用Google SignIn一样,您必须使用以下代码访问Google Client ID GIDSignIn.sharedInstance()?. clientID = xxxxxxxxxxxx 这样,您将无法直接从.xconfig文件访问值,但可以从Info.plist文件访问值。 因此,请先确保将其添加到Info.plist中 在我们的情况下,该名称以GOOGLE_CLIENT_ID的名称添加。 因此,要从Info.plist访问此代码,请编写以下代码。 让googleClientID =(Bundle.main.infoDictionary?[“ GOOGLE_CLIENT_ID”] 作为 ?字符串)? .replacingOccurrences(of:“ \\”,其中:“”) 还有一件事,如果您已经安装了Facebook SDK,GoogleSDK或任何其他SDK,则可以按照以下命名约定在xcode项目中找到两个.xcconfig文件。 Pods-PROJECT_NAME.debug.xcconfig Pods-PROJECT_NAME.release.xcconfig 因此,您已经分别将这些文件导入或包含在Release.xcconfig和Debug.xcconfig文件中。 在第一行的Release.xcconfig中写入以下内容。 #include“ Pods /目标支持文件/Pods-PROJECT_NAME/Pods-PROJECT_NAME.release.xcconfig” 在Debug.xcconfig里面写这个。 #include“ Pods /目标支持文件/Pods-PROJECT_NAME/Pods-PROJECT_NAME.debug.xcconfig” 现在,您必须完成最后一步。 转到项目导航器->信息->配置 并使用您创建的文件(如下所示)更改带有红色标记的xcconfig文件。 现在,您将所有密钥,ClientID等都集中在一个地方。 您可以随时在Release.xconfig和Debug.xcconfig文件中进行更改。 快乐的编码:— — — — — — — —)和平家伙 如果您觉得有帮助,请这样做。