Tag: xcode

核心数据代码生成说明!

从Xcode8开始,Apple在Xcode数据模型编辑器中添加了新的Codegen设置,以帮助开发人员管理和维护其NSManagedObject子类。 Codegen设置包含3种可能的配置: 手动/无 类定义 类别/扩展 最初,这3种配置可能看起来有些混乱,我发现实际上很难找到一篇好的文章来解释每种配置之间的区别以及使用哪种配置。 在本文中,我将详细介绍每种配置,并分析每种配置之间的差异,并提出一些建议,说明应该在核心数据项目中使用哪种配置以及如何使用它。 事不宜迟,让我们开始吧! 这是Xcode8之前的默认行为,开发人员必须手动创建和维护NSManagedObject子类的更改。 您可以尝试创建一个示例核心数据项目,添加一个新的实体调用TestEntity并按照此链接中的步骤生成NSManagedObject子类。 如果正确执行此步骤,Xcode将生成2个文件: TestEntity + CoreDataClass.swift TestEntity + CoreDataProperties.swift 生成这两个文件后,您应该可以在项目中使用TestEntity 。 尝试将以下代码行复制到您的应用程序委托中,您的项目应编译没有任何错误。 让_ = TestEntity(context:persistentContainer.viewContext) 在数据模型编辑器中创建实体时,此配置是默认的Codegen配置。 使用此配置,Xcode将自动生成所需的NSManagedObject子类,作为项目派生数据的一部分。 要查看实际情况,请打开先前创建的样本核心数据项目,然后删除两个TestEntity+CoreDataClass.swift 和 TestEntity+CoreDataProperties.swift 。 您会注意到,删除两个文件后,您的项目将不再能够编译。 这是因为您对Codegen使用了手动/无配置。 现在尝试将Codegen配置更改为Class Definition,您会注意到您的项目现在可以再次编译而没有任何错误。 要查看自动生成的文件,请按cmd +单击TestEntity ,然后选择“跳转到定义”。 右键单击打开的TestEntity+CoreDataClass.swift然后选择“在Finder中显示”。 现在您应该可以同时看到TestEntity+CoreDataClass.swift 和 TestEntity+CoreDataProperties.swift (由Xcode自动生成) 在查找器窗口中。 但是请注意,这两个文件均不在您的Xcode项目中,实际上它们都位于Xcode的“派生数据”文件夹中。 切勿编辑自动生成的文件,因为它们由Xcode管理,因此,每次构建项目时,它们都会被Xcode覆盖。 可以在类定义和手动/无之间描述此配置。 Xcode将仅自动生成TestEntity+CoreDataProperties.swift 为您,您将必须管理和维护TestEntity+CoreDataClass.swift 你自己。 将示例项目的Codegen配置更改为Category / Extension,您将注意到在派生数据中,Xcode不再自动生成TestEntity+CoreDataClass.swift 对您来说,您的项目将无法再次编译。 要解决该错误,您可以使用上述相同的方法来请求Xcode为您的项目创建TestEntity+CoreDataClass.swift ,但是Xcode还将为您的项目创建TestEntity+CoreDataClass.swift的副本,因此请确保将其删除从项目中删除,以避免与派生数据文件夹中的自动生成版本冲突。 希望上面的解释使您对每种Codegen配置的工作方式有更清晰的了解。 […]

如何使用IBDesignable可视化情节提要中的可重用xib

在Zenchef,我们使用情节提要来设计视图控制器并获得应用程序导航的概述。 但是,情节提要板不适用于您要多次使用的视图。 例如,您可能想在UIViewController,UITableViewCell或UICollectionViewCell中使用复杂的视图。 为了避免每次都设计视图,通常有两种解决方案 1.以编程方式设计视图 这样,您可以使视图IBDesignable并通过实现prepareForInterfaceBuilder来实现,当您包括该视图时,您将在情节提要中看到结果。 当视图使用CoreGraphics实现drawRect时,它既简单又好用。 但是,一旦获得许多子视图,这将变得不切实际。 编码自动布局约束可能会很痛苦,大小类甚至更大。 Interface Builder功能强大,我们希望尽可能多地使用它。 2.在Xib中设计视图 这样,您就可以享受Interface Builder的所有功能,包括自动布局,尺寸分类和特征收集,同时保持视图的可重用性。 但是,每次需要时,都必须加载xib并以编程方式将视图添加到视图层次结构中。 此外,您也无法从“实时视图”(Xcode 6中引入)中受益。 您不会在情节提要中看到您的xib,因为在此阶段,所有IBOutlet都为零。 它将无法呈现,并且视图调试器将给您以下错误: 展开Optional值时意外发现nil 3.替代 因此,这是在情节提要中包括和可视化xib的方法: 步骤1 —创建一个视图容器 我们需要创建一个实用程序类,其行为类似于一个称为XibView的容器。 我们的XibView将负责加载xib,并将我们的视图添加为其子视图。 它具有2个属性: contentView将是您在xib中创建的视图。 nibName是您的xib文件的标题。 我们希望稍后在情节提要中从身份检查器访问此字段。 @IBDesignable XibView类:UIView { var contentView:UIView? @IBInspectable var nibName:String? 在初始化时,该类将: 从其xib名称加载视图 添加具有自动调整大小掩码的子视图,以实现自动布局约束 覆盖func awakeFromNib(){ super.awakeFromNib() xibSetup() } func xibSetup(){ 守卫let view = loadViewFromNib()else {return} view.frame =界限 […]

iOS应用中的位置权限(始终或在使用时)

定位服务一直是Apple向开发人员提供的功能最强大的框架/ API之一,因此,您可以找到我们经常使用的大多数(如果不是全部)应用中正在使用的定位服务。 核心位置框架为开发人员提供了多种跟踪用户位置的方法,今天我们将讨论两种最常见的方法-要求“使用时”和“始终”请求位置访问。 顾名思义,“使用中”授权可让您的应用在前台或活动状态下访问您的位置,而“始终”授权可让您的应用访问其位置(即使在后台)。 在不过多讨论细节的情况下,让我们谈谈如何在应用程序中请求这些权限。 根据您的要求,您必须在info.plist文件中包括以下密钥: 对于“始终”授权,包括-NSLocationAlwaysUsageDescription” 对于“使用时”授权,请包括-“ NSLocationWhenInUseUsageDescription” 这些键的值应为文本字符串,解释为什么首先需要这些权限,并且在请求权限时显示的警报中会向用户显示相同的文本字符串。 如果您未能在info.plist文件中添加适当的密钥,则不会向用户显示位置提示。 如果我的应用程序可以同时访问前台和后台位置,为什么不总是使用该选项? 就像有人正确地说的那样,强大的能力带来了巨大的责任,只有在为您的应用程序添加确定的价值时,才应请求“始终”授权。 请求“始终”授权不仅会引起隐私问题,而且在后台访问用户的位置也会影响设备的电池。 Uber最近在最近的更新中将授权从“使用时”更改为“始终”,这导致用户和技术社区的强烈反对。 优步表示,需要在后台访问位置,以改善接送服务,客户支持和安全目的。 用户唯一可用的选项是允许“始终”访问,或者在应用程序内收到以下提示,从而消除了他们作为Uber用户最喜欢该应用程序的“易用性” 。 那么,作为开发人员,我还有哪些其他选择? 如果我希望“始终”访问权限在我的应用程序中提供某些丰富功能,但同时又考虑到用户的隐私或电池使用情况,同时又为用户提供了“使用中”权限的选项,并且仍为他们提供使用权限,该怎么办?很棒的用户体验。 是否可以让您的用户在“始终”或“在使用中”授权之间进行选择? 幸运的是,您愿意! 第一步是在info.plist文件中添加“ NSLocationWhenInUseUsageDescription ”和“ NSLocationAlwaysUsageDescription ”键。 要记住的是,仅向用户显示一次授权提示,因此您应该继续询问“始终”授权: CoreLocationManager()。requestAlwaysAuthorization 如果用户为您提供了在后台访问位置的权限,您应该会感到非常高兴,但是不幸的是,如果用户不允许,您总是可以提示用户进入设备的隐私设置并将授权更改为“使用时”。 您可以使用“ UIApplicationOpenSettingsURLString”将用户直接导航到设置应用内的应用设置屏幕。 最后,作为开发人员,我们应该构建能够为用户提供丰富直观体验的应用程序,但同时也将其隐私问题放在首位,我希望Uber团队能够理解这一点!

如何将iOS 9.3.1支持添加到Xcode 7.2.1

您可能已经知道Apple决定在Yosemite 10.10.5上不支持Xcode 7.3和iOS 9.3.1 ,因此显然您陷于Xcode 7.2.1和iOS 9.2的困境。 出于某些良好的原因,您想坚持使用优胜美地10.10.5 ! 您的设备已经高于iOS 9.2 ,就我而言是iOS 9.3.1 。 这意味着您尝试在该设备上运行或调试时会收到此错误! 问题: 找不到开发人员磁盘映像 解决方案: 自己手动添加iOS 9.3支持。 怎么样 1.从Apple网站下载Xcode 7.3.1 GM种子 。 2.打开Xcode_7.3.1_GM_Seed.dmg ,然后单击显示包内容。 3.完全关闭Xcode 7.2.1 。 对于从现在开始的进一步步骤,请确保在备份之前进行了备份。 使用风险自负! 4.从iOS 9.3文件夹中复制version.plist (新的) /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/version.plist 并粘贴以替换旧的 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/version.plist 5.复制SDK /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs 并更换 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs 6.最后DeviceSupport / 9.3(13E230) 卷/Xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.3(13E230) 至 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.3(13E230) 现在,重新打开Xcode 7.2.1 ,您应该在目标列表中看到iOS 9.3。 现在,您可以照常在设备上运行和调试了。 稍等片刻,等待Xcode在此处进行设置,然后就可以了。 🙂 […]

💻11 dicas’top’para desenvolvedores斯威夫特

Menosémais! Escreva menos,produza mais! Situação: 客观地说,可以使用Apple unc auma nova nova languagem(苹果新语),Swift或其他应用程序来表达您的观点。 请给我发短信? Entãoessas dicassãoparavocê! Sinta-se livre para copiar oscódigose testa-los no Playground 。 限定词qualquerdúvidabasta deixar noscomentários。 1.扩展 Sem扩展名: 5.属性与功能 Circumo的Calculando odiâmetrode um。 Criamos duasfunçõesmutuamente exclusivas。 Isso pode ser facilmente otimizado。 Lembre-se: Escreva menos,produza mais! 集市作为半径(直径)和直径(直径)的独立实体。 Maisconexões→菜单→菜单→菜单→菜单→菜单菜单→菜单菜单 6.枚举段“类型安全” 示例:入侵的提示。 “成人”,“儿童”和“高级”弦乐,加尔坦舞曲节奏比较,超音速舞曲,不拘一格。 se子 数位和多声产品! 示例: 枚举枚举。 // ATUALIZADO: […]

如何从口袋妖怪去取缔

您的家乡没有凉爽的地方吗? 前往纽约! 需要Mac。 通过在此处注册https:// developer来注册为Apple Developer。 apple .com / register /请阅读条款和条件。 他们可能会说您不应该使用您的帐户在Pokemon Go中作弊。 从Mac应用商店下载并安装Xcode。 打开Xcode并创建一个新的Single View Application。 文件>新建>项目。 随便命名。 4.将iPhone插入计算机。 5.从设备下拉列表中选择您的手机。 6.按下播放按钮。 您会看到一个错误。 7.按“修复问题” 8.添加您在步骤1中创建的Apple ID。 9.再次按下播放按钮。 您将收到另一个错误。 10.按照弹出窗口中的说明信任您的应用。 11.再次按播放。 12.您将在iPhone上看到一个白屏。 13.在Xcode菜单中,选择调试>模拟位置>纽约 14.单击iPhone上的主页按钮。 15.打开Pokemon Go。 16.您会发现自己在纽约市! 谢谢阅读! 赶上他们!

使用Firebase Crashlytics修复崩溃

换一种说法: 在装有iOS 11的任何类型的iPhone上,前台都会发生崩溃 这是我们的出发点。 解决崩溃 在Firebase Crashlytics引入面包屑之前,您可能会与支持团队聊天并向他们询问以下问题: 崩溃是否可以重现? 复制路径总是一样吗? 崩溃到底发生在哪里? 尤其是当崩溃导致堆栈跟踪时,几乎没有任何结果: 现在,有了新的面包屑,我们只需打开“ Logs页面,就可以在崩溃发生之前看到用户的面包屑。 它告诉我们用户在启动后立即收到了转移(存储桶) 最终接收失败: 这比堆栈跟踪给我们的要多得多! 复制路径是否一致? 通过在会话之间导航并比较面包屑,我们可以轻松地比较会话并定义每个用户的复制路径是否相同。 这将使崩溃的范围进一步缩小,并使我们有可能更快地重现崩溃。 使用自定义参数 面包屑的妙处在于它们可以为您提供更多信息。 我们可以看到接收到的传输是一个简短的URL。 接收到的传输的类型是不带密码的移动传输: 结论 使用所有这些信息可以帮助我们更快地解决崩溃问题。 事实证明,我们以错误的方式解雇了一个视图控制器。 有时,我们甚至无法通过面包屑来解决崩溃问题。 这是我们团队的游戏规则改变者,使我们更接近拥有100%无崩溃用户的梦想。 更快地解决崩溃问题也意味着需要更多时间来开发功能。 解决崩溃更快 解决最难的崩溃 腾出更多时间来开发功能,而不是解决崩溃问题。

抓住铁锹和桶,在Xcode中有一个更好的游乐场

测试代码和功能是构建任何应用程序的重要组成部分。 但是,不幸的是,在构建阶段进行测试有时可能很困难和/或耗时。 通常,我在编写代码时进行一些快速测试和故障排除的方法是在以下功能下实例化App Delegate文件中的对象。 然后,我将把打印语句放在类的函数或App Delegate中。 程序启动后,将执行此功能以创建每个对象的实例,然后查看控制台上打印的内容以评估是否实现了所需的功能。 但是,这很耗时,而且直言不讳,令人讨厌。 我要采取的另一种方法是将文件复制到操场上并在其中进行测试。 这很方便,因为它将在右侧显示进度和信息。 在功能和测试方面,它比应用程序委托提供了更多功能。 但是,这很不方便,因为一旦应用程序变得比几个文件大,您就必须复制很多副本。 此外,Playground文件通常按其写入顺序进行编译和运行,并且一行代码不知道在其下写入的任何内容。 因此,一旦程序变得有些复杂,就会引入一些问题。 知道有一种方法可以在Xcode项目中直接创建运动场文件,我认为必须有一种方法可以使该项目中的所有内容在该运动场中可用,并且肯定有! 随意打开Xcode,然后逐步学习,并逐步分享一些代码。 首先,让我们创建并命名一个新项目。 完成此操作后,右键单击左侧文件结构中的任意位置,然后单击“新建文件”,就像添加新的swift文件一样。 从这里选择游乐场,如下所示。 让我们创建更多文件,以便我们也可以进行一些测试。 请参阅下面的示例。 现在我们已经创建了一些测试文件,让我们进入我们的操场并尝试创建一个人。 您会注意到在自动完成中没有可用的初始化程序,并且您将收到类似以下的错误。 仅仅因为游乐场存在于Xcode项目中并不能使项目中的所有内容都可用。 我们将必须在项目中创建一个框架,然后将该框架导入操场。 要创建框架,请单击文件->新建->目标。 从菜单中选择Cocoa Touch Framework,然后单击下一步。 命名框架,然后单击完成。 保留所有其他选项不变。 单击完成之前,您的屏幕应如下所示。 现在已经创建了框架,我们必须将项目中的文件添加到其中,以便在导入框架时可以对其进行访问。 如果单击“个人”文件,您将在文件检查器中注意到创建的框架现在可用作目标成员身份。 选中框架旁边的框。 对性别和狗也要这样做。 这将包括框架中“人”,“性别”和“狗”文件的内容。 现在,让我们跳到游乐场文件。 需要像导入其他任何框架一样导入该框架。 为此,您需要在操场文件的顶部放置“ @testable import FrameworkName” 。 现在,您可以在操场上使用框架中包含的所有项目。 让我们尝试测试一些东西。 成功! 该项目的课程现在在操场上可用。 一旦对框架中包含的任何项目进行了更改,这些更改将不会在操场上反映出来,直到代码被编译。 通常,在框架方面,“干净”和“构建”是您的好朋友,因此,如果一切工作不正常,这应该是进行故障排除的第一步。 此外,在将新文件添加到项目中时,可以在创建文件时通过选择适当的目标将它们添加到框架中。 让我们向项目添加一个汽车类。 通过在DemoKit目标旁边放置一个对勾标记,汽车类将立即添加到框架中。 现在,我们将一些代码添加到car类中,然后进行构建并查看它是否在Playground文件中可用。 另外,让我们更新Person类,使其包含类型为“ […]

更好的Xcode内部版本号

iOS和macOS应用程序具有版本号和内部版本号。 通常,您会在Xcode或iTunes Connect中看到这些代表以下内容: 1.0 (1) 这是版本号1.0 ,内部版本号1 如您所知,内部版本号用于区分同一版本的不同内部版本,因​​此您可以上传内部版本1 ,然后进行修改,然后上传内部版本2 我过去每次创建构建时都手动增加此构建号,但是该策略存在问题: iTunes Connect将拒绝与先前上传的版本具有相同版本号的版本。 因此,如果您忘记增加内部版本号,则会浪费时间。 有时我不记得是否要增加它,所以最终会做两次 内部版本号对这个特定内部版本没有任何帮助 最后一点是最重要的。 您怎么知道您的构建正确? 质量检查人员可能告诉您他们在版本8上发现了问题…又是哪一个? 或者您要在iTunes Connect上提交您的应用程序,而构建版本为9 –是您刚刚创建的应用程序吗? 最近,我一直在使用时间戳(yyyyMM.dd.HHmm)作为我的内部版本号,如下所示: 1.0 (201805.15.1407) 此版本创建于15/05 / 2018,14:07 请注意,内部版本号只能包含三个句号,这就是为什么我将年份和月份放在一起的原因 这有很多好处: 如果质量检查人员想要测试今天构建的更改,他们可以轻松地验证其版本的构建时间是否正确 较新的版本始终具有较高的版本号,并且它是自动化的,因此您不必担心开发人员会犯错误。 如果您将一个版本上载到iTunes Connect,然后第二天将另一个版本进行了一些更改,则很明显哪个是哪个! 使用Xcode的构建阶段中的“运行脚本阶段”和以下脚本,这很容易实现: ## Generate the build number using current date and time buildNumber=$(date “+%Y%m.%d.%H%M”) ## Set the build number in plist file /usr/libexec/PlistBuddy […]

升级到Xcode 8

创建各种权利文件。 权利文件实际上是plist文件,您可以使用任何常用的文本编辑器对其进行编辑。 为您的应用程序组更改“ com.apple.security-groups”的值。 您可能希望将权利文件中的“ aps-environment”部分保留下来,以进行推送通知。 滚动到“构建设置”中的“代码签名权利”,以将权利分配给每个配置。 最后,我们使用Xcode 8获得了闪亮的新版本。