Tag: iOS应用程序开发

iOS开发设置:Xcode

定制Xcode以获得更流畅体验的小技巧。 这篇文章是有关设置iOS开发环境的系列文章的一部分。 Xcode定制高度依赖于个人喜好,您可以做很多事情来改善自己的体验。 以下是一些我最喜欢的技巧来增强Xcode。 如果您不喜欢任何内置的Xcode主题,则可以轻松导入新主题。 这是一个很好的入门资源: hdoria / xcode主题 xcode-themes – Xcode的颜色主题 github.com 除了导入主题外,您还可以轻松自定义主题并保存或导出主题。 您可以在~/{user}/Library/Developer/Xcode/UserData/FontAndColorThemes/找到所有已安装的主题。 这是我的自定义主题在“首选项”窗格中的示例: 以及它的使用方式: 我在代码的任何地方都使用TODO:和FIXME:作为“自我注释”。 因为我不需要生产代码中的注释,所以我想在使用过关键字的位置添加警告,因此很明显,在进行生产之前,需要清理一些内容。 在Objective-C中,我们能够根据需要使用#warning标记显示警告,但是Swift没有等效选项。 相反,您需要添加一个Build Phase Run Script来为TODO:和FIXME:添加警告。 该脚本可在Swift和Objective-C工作区和测试中使用,但会忽略Pods。 最终看起来像这样: 隐藏Cocopod警告: 为确保您不会丢失新的TODO和FIXME警告,并且通常只需要为安装的Pod遍历大量警告,请确保禁止Podfile中的所有警告。 这应该在平台声明下的Podfile的顶部: #忽略来自所有Pod的所有警告 hibit_all_warnings! 我将直接链接到此,因为机器人Natasha的解释要好得多,但是要点是:如果添加异常断点并打印出参数,则每次应用崩溃时,崩溃的原因在控制台中打印出来。 它极大地改善了我的调试生活,并强烈建议所有人使用。 Xcode:一个奇怪的调试技巧,可以挽救您的生命 好的,希望您能告诉我这个标题让我玩得太开心了🙂无论如何,现在又恢复了定期安排… www.natashatherobot.com

Swifty Firebase API @ Ka-ching —第2部分

更新,2018年10月14日: 自撰写本文以来,这些博客文章中描述的概念已被分为两个开源框架,可以在这里找到: ka-ching-as / FireSwift-Database Firebase实时数据库的扩展,可以使用“ Codable” Swift类型。 … github.com ka-ching-as / RxFireSwift-Database Firebase实时数据库的RxSwift扩展-ka-ching-as / RxFireSwift-Database github.com 这篇文章是3部分系列文章的继续,该系列文章首先为Firebase API添加了Codable支持: 在这篇文章中,我们将讨论一个非常有趣且功能强大的主题,它受objc.io Swift Talk#71:带有幻影类型的类型安全文件路径的启发。 在Swift Talk中,Brandon Kase和Florian Kugler讨论了“幻影类型”,简而言之,这些类型永远不会实例化,而只会用作通用约束。 这些是将强类型添加到通常不是强类型的API的强大工具,就像Firebase RTDB Reference使用的路径一样。 请,请去观看关于objc.io的精彩演讲! 在这篇文章中,我们将混合Phantom Types和实际的Codable模型类型,以创建一个真正强大的API。 可以在第一篇博客文章中介绍的github仓库的typesafe_paths分支上找到该文章的示例代码: ka-ching-as / SwiftyFirebase SwiftyFirebase – Swift中Firebase API的简单包装 github.com 请注意,本文涉及Firebase,但是所描述的技术可以用于具有“字符串”定义的数据层次结构的任何类型的API。 我们将介绍一种Path类型,该类型基本上包装了一系列路径组件,但在此过程中增加了类型安全性。

发布移动应用程序-是否使用您自己的应用程序开发人员帐户

在完成移动应用程序的开发后,您将在以下几个方面进行选择:1.您的应用程序需要标准帐户还是企业帐户? 2.如果需要标准帐户,您应该创建自己的帐户,还是让自定义软件开发公司在其帐户下发布您的应用程序? 虽然第一个问题的答案绝对简单明了,但第二个问题的答案绝不是万能的。 相反,最佳决策取决于您的业务优先级。 标准版与企业版开发者帐户 App Store-标准帐户:标准帐户是组织通过App Store向公众发布应用程序的正确选择。 Apple开发人员帐户每年的维护费用为$ 99。 App Store-企业帐户:在组织内私下发布应用程序时,企业帐户是正确的选择。 它不会在App Store中提供。 苹果开发者企业帐户的维护费用为每年$ 299。 Google Play商店:无论哪种情况,您都只需要一个Google Play开发者帐户,该帐户只需一次性支付25美元的注册费。 然后,企业应用程序需要使用API​​在组织内进行分发。 如前所述,这是一个简单的决定,取决于您的应用是公共用途还是私人用途。 下一部分将使事情变得不清楚。 如果您的应用仅供私人使用,那么这将与您无关-根据发行需求的性质,您必须创建自己的企业帐户。 另一方面,如果您的应用程序是供公众使用的,则您的应用程序开发公司可能会询问您是否要使用自己的帐户或他们的帐户发布应用程序。 继续阅读有关该决定的含义的信息。 在您的软件开发商店的帐户下发布您的应用程序: 可见性:在开发商店的帐户下发布应用程序的最大好处可能是,因为这是他们从事的业务,因此他们的帐户上也可能有许多其他广受好评的应用程序。 这将在应用程序商店中建立其“权限”,类似于域权限在网络上的工作方式,并使您的应用程序在搜索中的排名高于仅拥有一个或两个应用程序的帐户的排名。 可见性的提高对吸引用户绝对至关重要。 认真地说,我们不能夸大找到提高您在搜索中的位置的重要性。 实际上,我们将很快发布一篇有关App Store Optimization的冗长文章,请注意! 便利:为您的组织机构设置Apple开发人员帐户需要DUNS®号。 如果您还没有,则需要申请一个,这可能需要几个星期。 这可能会延迟您的应用程序的发布,因此,如果计时是重中之重,那么这可能是决定因素。 如果您让开发人员在他们的帐户下发布您的应用程序,则无需理会其中任何一个。 此外,您还可以省去$ 99的年费,而不必担心帐户维护问题,例如保持付款信息为最新。 注意事项:Google Play商店的要求不那么繁琐,但是如果您要让开发商店来处理iOS应用程序发布,那么您也可以同时进行这两个工作。便捷,更高的知名度和更快的发布非常有价值,但是出于一些原因,您也可以考虑自行发布该应用。 在您自己的开发者帐户下发布您的应用程序: 光学:坦率地说,在您创建的应用程序中将自己的公司列为开发人员看起来不错。 对于试图定位您的应用程序的用户而言,它不太可能造成混淆,并且为您的品牌增添了可信度。 此外,如果您打算将来创建更多应用程序,则在开发人员位置中的名称将用作您其他产品的链接。 使用工具: Apple开发人员计划的成员可以访问Beta OS版本和最新的软件开发工具包。 虽然您的开发合作伙伴可以通过代理为您提供访问权限,但它为您创建了一个额外的步骤。 尤其是如果您有开发人员来维护应用程序,您可能希望消除中间人的麻烦,并直接从Apple接收他们来节省一些时间。 最坏的情况:最后,如果您的开发合作伙伴破产了,那么您就必须麻烦创建自己的帐户才能转移应用程序,以免将其从商店中删除。 。 尽管这可能是最令人信服的理由,但还是值得一提,尤其是如果您与开发人员的经验使您怀疑他们是否能够继续生存下去。 如您所见,您要做出的选择实际上取决于您特定业务的需求。 希望这篇文章有助于揭开似乎无关紧要或无关紧要的决定的神秘面纱,但是如果您还有其他疑问,请务必将其提出给开发人员。 […]

安全快捷地处理快速日志并进行测试

如果您开始使用Swift开发iOS或OS X应用程序,也许DDLog这个词不会引起您的注意,但是您不必担心,如果您不使用DDLog可以代替NSLog(除其他外)希望您的日志在版本中可读。 出于多种原因,实际上不建议发布带有日志的应用程序,例如: NSLog由于其同步性而减慢了应用程序的速度 通常会记录网络请求,并且您可能不希望其他人知道您的后端如何工作 您肯定会注意到的另一件事是, 您不需要每次都拥有所有日志 ,实际上调试过程通常是这样构造的: 构建应用 降落在您需要测试的视图(或其他任何视图)上 清除日志控制台 做测试并查看日志 一种简单的解决方案是使用彩色原木,但是一旦使用了已知的7或8种颜色,就必须对不同的原木重新使用相同的颜色。 如果您是一个知道超过8种颜色的女孩,则可以这样做(也许是因为这样,女人在编码方面比男人要好?:D),但至少我需要找出一种更好的方法。 所以让我们回顾一下到目前为止 我们仅在必要时才需要日志 我们不希望发布日志 我们如何才能有效地解决这个问题? 当然有枚举。 问题 让我们想象一下,我们有一个从后端检索并希望在TableView中显示的小猫的列表。 我们要登录 网络请求和响应 关于视图的操作(显示一个新的单元格,点击一个单元格,等等) 并且我们不希望手动导航我们的应用程序,直到包含TableView的视图控制器为止(是的,我们很懒惰)。 解 这是代码 基本上,每种类型的日志都有一个大小写,因此我们可以使用isEnabled和#if DEBUG阻止释放中启用任何大小写的功能来分别打开和关闭它们。 您可能已经注意到,枚举名称是Test而不是Log 。 那是因为: 我发现阅读诸如Test.kittensNetworkService.stuff()之类的内容更容易理解 此解决方案不仅限于日志:请记住,在小猫VC之前我们不手动导航? 用法 我们要记录所选单元格的indexPath吗? 我们要导航到KittensVC吗? 如果我们需要在任何情况下执行某项操作,则可以使用performBlockFor方法 PS: 要使用#if DEBUG宏,我们必须在目标/ Swift编译器-自定义标志/其他swift标志的Build阶段中添加值-D DEBUG。 感谢您的阅读,直到这里,我希望您像我一样喜欢这种解决方案🙂

iOS 11:如何使用CoreNFC检测和读取NFC标签

注意:该项目的源代码可以在Github上找到。 iPhone三年来一直在为Apple Pay配备NFC(近场通信)阅读器,而开发人员一直在耐心地等待访问该小芯片。 随着今年秋天iOS 11的发布,Apple终于向开发人员提供了这一急需的功能。 幸运的是,我们不必等待三个月就可以开始玩了! iOS 11的新框架之一是CoreNFC ,实际上设置起来非常简单! 注意: CoreNFC仅在iPhone 7或iPhone 7 Plus上受支持,即使其他iPhone内装有NFC芯片也是如此。 证书,标识符和配置文件 为了使用具有NFC Tag Reading功能的应用程序,您需要在Apple的证书,标识符和配置文件网页上注册应用程序ID。 前往该处,然后在“ Identifiers标题下选择“ App IDs ”。 继续并添加一个iOS应用ID,该ID与您在Xcode中使用的绑定ID相同。 您可以根据需要命名描述。 在“ App Services部分中,选择“ NFC Tag Reading ,然后单击“继续”。 完成添加新的App ID,然后回到Xcode开始! 无论您是否将此应用程序发布到App Store,都需要执行此步骤,所以请不要跳过它! 入门 就我而言,我将创建一个名为TestingCoreNFC的新项目。 创建一个新的Single View App,并根据需要命名。 我正在为此项目使用Swift,并跳过了单元测试。 继续保存到任何地方,让我们开始吧。 权益 在Project Editor选择“ Capabilities 。 打开其中任何一个,然后再将其关闭。 为什么? 因为这是将权利文件添加到您的应用程序的最简单方法。 在我的情况下,它称为TestingCoreNFC.entitlements 。 在您的权利文件中,添加一个键为com.apple.developer.nfc.readersession.formats的数组。 在数组内部添加一个值为NDEF的字符串。 […]

简单的自定义UINavigationController过渡

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

轻松管理Swift项目中的不同环境

想象一下,您已经完成了应用程序的开发和测试,现在可以将其提交生产版本了。 但这是问题所在:您所有的API密钥,URL,图标或其他设置都针对测试环境进行了配置。 因此,在提交您的应用程序之前,您将必须修改所有这些内容以适合您的生产模式。 显然,这听起来不太好。 另外,您可能会忘记在庞大的应用程序中进行某些更改,因此您的服务将无法正常运行。 代替这种凌乱的方法,最好有几个环境并在需要时简单地更改它们。 今天,我们将通过最流行的方法来尝试组织不同的环境: 使用注释。 使用全局变量或枚举。 使用带有全局标志的配置和方案。 将配置和方案与多个* .plist文件一起使用。 1.使用注释 当您有2个分离的环境时,您的应用程序需要知道它应该连接到哪个环境。 想象一下,您拥有Production , Development和Staging环境以及API端点。 处理此问题的最快,最简单的方法是拥有3个不同的变量并注释其中2个: 这种方法非常肮脏,凌乱,会使您哭泣很多。 有时我会在黑客马拉松上使用它,因为代码的质量不起作用,而速度和灵活性才是关键。 在任何其他情况下,我强烈建议您完全不要使用它。 2.使用全局变量或枚举 另一种流行的方法是使用全局变量或Enum (这会更好)来处理不同的配置。 您将必须在3种环境中声明您的Enum ,并在某处(例如在AppDelegate文件中)设置其值: 这种方法要求您每次更改代码时都只在代码中设置一次。 与以前的方法相比,此方法要好得多。 它非常快速,可读性强,但有很多局限性。 首先,在运行任何环境时,您始终具有相同的捆绑ID。 这意味着您将无法同时在设备上拥有两个具有不同环境的相同应用程序。 一点都不舒服。 同样,在每个环境中使用不同的图标也是一个好主意,但是采用这种方法,您将无法更改图标。 同样,如果您忘记在发布应用程序之前更改此全局变量,则肯定会遇到问题。

在我的iOS应用程序屏幕录像中显示触摸手势

我之所以写本指南,是因为我花了几个小时才弄清楚该如何做,但我没有找到完整的指南,因此我正在创建它。 希望对你有帮助 问题 我需要记录我的iOS应用程序的展示,并能够在屏幕上显示触摸手势,以便用户可以看到我在做什么。 解 我在Github上找到了这个名为FingerTips的仓库 ,它承诺会做我需要的一切,所以我想试试看。 这些是我成功将其安装到我的iOS项目中的步骤: 正常生成您的iOS应用。 因为我正在使用Ionic Framework来创建我的应用程序,所以我只是这样做了: 离子科尔多瓦平台添加ios离子科尔多瓦建立ios 2.从https://github.com/mapbox/Fingertips克隆或下载Fingertips存储库 3.在Xcode中打开iOS项目,然后将FingerTips存储库中的MBFingerTipWindow.h和MBFingerTipWindow.m类添加到Classes文件夹中。 4.打开您的AppDelegate.m文件,然后执行以下操作: 导入MBFingerTipWindow #import“ MBFingerTipWindow.h” 添加以下用于显示触摸的方法: -(MBFingerTipWindow *)window {静态MBFingerTipWindow * visualFeedbackWindow = nil; if(!visualFeedbackWindow)visualFeedbackWindow = [[MBFingerTipWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; return visualFeedbackWindow;} 现在,您的AppDelegate实现应如下所示: 5.转到MBFingerTipWindow.m并将boolean变量alwaysShowTouches设置为true,这样触摸事件将始终显示在我们的应用程序中。 为此,请在第84行中添加以下代码: self.alwaysShowTouches = true; 6.通常使用Xcode构建iOS应用。 现在,安装在iPhone上的iOS应用将显示您进行的所有点击 因此,现在我准备开始记录Ion2FullApp ELITE(最完整,最优质的离子模板)的展示了。 Ion2FullApp ELITE | 最完整的Ionic 3 Starter App | 离子模板 Ion2FullApp […]

Swift:没有人会打扰的常见错误-一流的功能和保持循环

您好,我亲爱的开发人员, 最近,我认识的一家基于洛杉矶的创业公司联系我,要求我进行代码评估。 他们在代码不稳定,随机崩溃和类似问题上遇到了可怕的问题。 我能说什么 代码中充满了我在上一篇文章中提到的错误(尤其是强制拆包和强制转换,我向之致敬,因为它们是导致大量崩溃的原因)。 但是,由于人们了解Swift中的所有功能都是一等的高阶函数,因此在不同的项目中一遍又一遍地出现了一个特别的错误。 您可以放入变量,将其作为参数发送给其他函数,并作为执行某些函数的结果来接收。 因此,让我们看一下一般的简化情况: 免责声明 : 这是概述方法的示例代码,其他代码段也是如此。 请原谅我,我的读者,我的确理解这一点。 令我震惊的是,有多少人没有得到我所有的文章都描述了通用方法,而不是具体用例。 处理器是执行处理并在处理完成后调用回调的某种实体。 在这种情况下, 数据是拥有处理器并对处理完成时调用的回调感兴趣的某个实体。 最简单的用户故事之一是Data是UIViewController子类,而Processor是UIView子类,当用户以某种方式与视图交互时,该类从控制器调用回调。 那么,这段代码有什么问题呢? 我们这里有一个保留循环。 Data和Processor都不会被释放。 检查我的陈述确实是真的很简单。 只需将调试打印放入Processor和Data的 deinit方法中即可。 如您所见,它从未打印任何内容,因为从未调用过deinit 。 那是因为保留循环。 但是为什么在这种情况下实际上会出现保留循环? 为了掌握这一点,您需要了解swift中的任何struct和class实例函数都是闭包。 闭包是捕获和存储外部上下文(例如变量)的一种函数。 一个完美的关闭示例是: autoincrementedIDGenerator返回一个函数,该函数捕获id并对其进行操作。 每次我们调用该函数时,它都会创建一个名为id的新变量,并返回捕获该变量的函数。 当我们测试输出时,我们将收到: user id = 0 user id = 1 user id = 2 image id = 0 image id = 1 image id […]

iOS(Swift 4.0)中的SVG或TTF图标,无需使用任何第三方库。

根据iOS设计标准,我们需要保持其类,质量设计,最重要的是使用尽可能少的内存。 Android开发人员大部分时间在应用程序中使用TTF图标或SVG图标,因此,他们不一定要固定图标的大小,他们可以根据需要调整图标的大小。 现在,在iOS中,我们可以使用TTF或SVG图标并将其用作UILable并以大小播放,而不必担心像素化图像/图标。 我在下面分享步骤。 选择FontAwesome(或您的ttf文件名)。 真是太容易了。 😛 等待最后一步。 步骤5(上一个):打开字体文件,选择要使用的图标并复制它。 粘贴到情节提要/ XIB中的UILable文本区域。 而已。 万岁! 您可以使用此文件中的任何图标,并且https://fontawesome.com/cheatsheet?from=io中已经有很多图标可用。 您只需要复制粘贴标签文本即可。 步骤1、2和3是一个项目的一次性过程,如果要在另一个项目中使用相同的TTF文件,请跳过步骤1和2。 按钮也有相同的过程。 它节省了很多开发人员和设计人员的内存和时间,并且还保持了质量标准。