在我以前的文章中,我写了关于在您的应用中采用UIApplicationShortcutItems的文章。 现在是时候实现Peak&Pop了-3d Touch提供的一项功能。 开始吧 首先,我们需要检查我们的设备是否支持强制触摸事件。 然后,如果我们的设备熟悉强制触摸,则可以轻松注册UIViewController的强制触摸事件。 看一下这个片段: 第二种方法负责一个称为Pop的事件。 当3d touch机制检测到您强烈按下从viewControllerForLocation方法返回的ViewController ,它将调用该UIViewController并将其作为viewControllerToCommit给第二个viewControllerToCommit previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController)函数。 重要的是,当 viewControllerForLocation 返回 nil , 将不会调用 第二个函数 viewControllerToCommit 。 在此方法中,我们可以显示viewControllerToCommit或执行其他操作,例如,为触摸的视图添加动画。 实作 假设您有UIViewController ,其中包含两个UIImageViews ,其中包含漂亮的苹果图像。 对于此控制器,我们要实现3d Touch Peak&Pop功能。 在viewDidLoad()函数中,为强制触摸事件注册我们的控制器。 很好,是吗? 结论 我不喜欢确定用户触摸哪个视图的方法。 检查一个点并为此计算位置并不是很好。 实现视图的3d触摸机制的另一种更好的方法可能是:通过某些属性(例如3dTouchGestureRecognizerDelegate扩展UIView类,然后在UIViewControllerPreviewingDelegate实现某些方法。 然后,我们不必检查视图是否被触摸,因为在委托方法上,触摸的视图可以作为方法参数传递。 gestureRecognizer熟悉的东西。 也许在将来的iOS更新中,API会更改吗? 综上所述, UIViewControllerPreviewing允许我们创建非常漂亮的功能,我强烈建议您使用它并改善您的应用程序! 您可以在我的GitHub存储库中找到示例应用程序的整个实现。 感谢您的阅读,很快再见! 关于我 我是波兰格但斯克的软件开发人员。 大多数情况下都使用iOS,但我对其他任何技术,框架和挑战都持开放态度。 如果您喜欢我的帖子,请随时在Twitter上关注我并阅读我的个人博客。
第1步–从Microsoft Store安装Ubuntu Shell 在为Linux的Windows子系统安装任何发行版之前,必须以管理员身份打开PowerShell并运行: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 从Microsoft商店下载Ubuntu Shell。 第2步-安装Swift 首先,请确保您拥有系统上最新的软件包列表,然后安装Swift的必备组件,其中包括clang和Python 2.7组件: sudo apt-get更新 须藤apt-get install clang libicu-dev libpython2.7 现在,您将需要打开Ubuntu Shell并在Ubuntu System中创建用户帐户。 接下来,从swift.org 下载最新的Swift快照。 wget https://swift.org/builds/swift-4.2.1-release/ubuntu1804/swift-4.2.1-RELEASE/swift-4.2.1-RELEASE-ubuntu18.04.tar.gz 解压缩下载的档案。 tar xzf swift-4.2.1-RELEASE-ubuntu18.04.tar.gz 通过输入pwd确保下载存档的位置。 我将归档文件下载到/home/timnazar/downloads并将解压缩的文件移动到/etc/swift-4.2.1 。 然后将Swift工具链添加到您的PATH中: 导出PATH = /etc/swift-4.2.1/usr/bin:”${PATH }“ 输入此命令只会将swift命令添加到当前Shell会话的路径中。 为了确保在以后的会话中自动添加该文件,请将其添加到.bashrc文件中。 打开.bashrc文件: 纳米〜/ .bashrc 在文件末尾添加以下行: #导入Swift工具链 导出PATH = /etc/swift-4.2.1/usr/bin :“ $ {PATH}” 保存并退出文件。 为了确保一切正常,请运行swift –version命令: […]
任何为什么每个项目都应该拥有它 生成状态标志是从README显示项目当前状态的好方法。 您可能已经注意到一些受欢迎的开源Pod在其README上有此功能。 要添加一个,请在Travis CI上转到您的项目,然后选择项目名称旁边的“ build pass”徽章。 徽章将代表哪个分支以及徽章的类型。 对于类型,选择Markdown以将其添加到自述文件中。 生成的文本无需修改即可将其添加到自述文件中。 如果有任何问题,可以单击该徽标以帮助将开发人员路由到Travis CI构建页面。 现在,我们已经向项目添加了CI构建服务,我们可以放心地构建新功能。 创建新的“拉取请求”时,Github将在Travis CI上自动创建新的构建。 生成状态将显示在“拉取请求”中,如下图所示。 有关如何设置和自定义.travis.yml文件的更多信息,可以在这里找到: 建立一个Objective-C或Swift项目– Travis CI 重要的是,您的设备目标在Xcode知道的设备中唯一地标识您的设备。 以来… docs.travis-ci.com 如果您有任何疑问,意见或对以后文章的要求,请在下面发表评论!
您关心自己的应用程序已本地化,对吗? 万岁,你! 但是,仅靠照护还不够,尤其是当您不是唯一正在使用某个应用程序的人时。 让我们通过一些简单的步骤,使在iOS Simulator中查看本地化变得更加容易。 在我说“第一要务”之前,让我们先解决一下:希望您已经在所有地方都使用了自动版式。 如果您不在,没有比现在更好的时间开始过渡了。 标签中的变长文本意味着在某些时候它们会四处移动。 也让其余布局也相应地移动。 回到表演! 一幅图片价值一千个字 第一件事:确保您的UI可以处理翻译文本比预期长得多的情况。 当然,您可以尝试一堆不同的翻译,但是一个快速的近似值是假设所有内容都是当前长度的两倍。 等待。 不,不要开始两次粘贴您的翻译。 当然,您的运行方案中有非常方便的“双倍长度伪语言”,但这不能让您用另一种语言测试双倍长度。 你为什么想这么做? 也许您的系统语言不是您应用的主要语言。 我们将以老式的方式进行处理,并带有启动参数。 编辑方案(“⌘+⇧+ <”或单击“产品,方案,编辑方案”) 选择“运行”操作,然后单击“参数”选项卡 将“ -NSDoubleLocalizedStrings YES”添加为新参数 运行该应用程序,然后点按Tappa 现在,您可以将任何一种语言加倍运行,以真正对您的UI进行压力测试。 👊 您获得了本地化,您得到了本地化,然后… 好的,您的UI可以使用样式和宽限期处理不同长度的翻译。 现在,确保您不会错过任何这些翻译。 回到计划! 编辑方案 选择“运行”操作,然后单击“选项”选项卡 选中“显示非本地化的字符串”选项 当字符串没有翻译可用时,这会将文本变成大写。 您会看到“ USERNAME”跳出来,而不是缺少诸如“ username”之类的占位符短语。 没什么吸引人的UI。 其他名字的玫瑰 所有这些模板讨论,我们甚至都没有尝试在应用程序中查看本地化的文本。 让我们修复它。 进行方案设置! 您可以始终尝试“选项”>“应用程序语言”,但这需要单击,单击,单击。 相反,让我们使用另一个方便的启动参数来指定要使用的语言。 编辑方案 选择“运行”操作,然后单击“参数”选项卡 将“ -AppleLanguages(de)”添加为新参数 要使用德语以外的其他语言,只需将“ de”替换为您选择的语言代码即可。 您可以设置一堆这样的参数并根据需要启用它们,但请记住,您不能同时使用多种语言运行应用程序。 太多的用户界面,很少的代码 您可能已经通过Interface […]
当用户没有积极使用我们的应用程序时,系统会将其移至后台状态,例如,音乐应用程序可能希望在锁定屏幕上播放音乐,任何新闻应用程序都可能希望在后台下载供稿,以最大程度地减少展示时间内容提供给用户。 这类工作分为3类: 当应用程序移至后台时,在前台启动短期任务的应用程序可能会要求额外的时间来完成该任务。 在前台开始下载的应用程序可以将下载职责移交给系统,从而允许操作系统在后台继续下载时挂起或终止。 需要在后台运行以支持特定任务类型的应用。 运行有限长度的任务 如果您的应用程序正在执行任务,并且需要一点额外的时间来完成该任务。 调用beginBackgroundTask :暂时延迟应用程序的终止,使其有一点额外的时间(180秒)来完成其工作。 完成该工作后,您的应用程序必须调用endBackgroundTask :方法,以使系统知道它已完成并且可以挂起。 beginBackgroundTask:方法生成一个唯一的令牌以与相应的任务相关联。 当您的应用程序完成任务时,它必须使用相应的令牌调用endBackgroundTask :方法,以使系统知道任务已完成。 在后台下载内容 在下载文件时,应用程序应使用URLSession对象开始下载,以便在应用程序被挂起或终止的情况下,系统可以控制下载过程。 如果您的应用在传输过程中终止,则系统会在后台继续传输,并在传输完成后启动您的应用(视情况而定)。 实施长期任务 对于需要更多执行时间才能实现的任务,您必须请求特定权限才能在后台运行它们而不会被暂停。 在iOS中,只允许特定的应用类型在后台运行: 导航应用程序,可让用户每次都知道其位置 一个音乐播放器应用,可在后台播放用户可听的内容 支持互联网协议语音(VoIP)的应用程序 定期下载和处理新内容的应用程序(即新闻应用程序) 接收来自外部配件的定期更新的应用程序 要在应用程序中启用后台服务,我们必须在应用程序的Info.plist添加“ 必需的后台模式 ”键 定期获取少量内容 定期从网络下载并处理少量内容的应用程序可以要求系统将其唤醒,以便它们可以启动对该内容的提取操作。 为了支持此模式,我们必须在Xcode项目的“ 功能”选项卡的“后台模式”部分中启用“ 后台 获取 ”。 提取间隔 如果获取间隔是UIApplicationBackgroundFetchIntervalMinimum,则系统将决定何时调用performFetchWithCompletionHandler方法。 请注意,获取间隔是最小而不是最大! 因此,系统决定后,您的应用程序将被唤醒。 这可能是一天一次或一天多次。 委托方法 当系统在后台启动您的应用程序时,在AppDelegate.swift内部调用了一个委托方法performFetchWithCompletionHandler :。 使用该方法检查新内容,并在内容可用时启动下载操作。 一旦下载完新内容,就必须执行提供的完成处理程序块,并传递指示内容是否可用的结果。 执行此块告诉系统它可以将我们的应用程序移回暂停状态并评估其电源使用情况。 与外部配件通讯 对于某些定期发送数据的附件类型(例如心率监视器),此支持非常重要。 启用此模式后,外部附件框架不会关闭与附件的活动会话。当附件中有新数据到达时,该框架会唤醒您的应用程序以便可以处理该数据。 系统还唤醒应用程序以处理附件连接和断开连接通知。 注意 :任何支持附件更新的后台处理的应用都必须遵循一些基本准则: 应用程序必须提供一个允许用户启动和停止附件更新事件传递的界面。 然后,该界面应根据需要打开或关闭附件会话。 唤醒后,该应用程序将有大约10秒钟的时间来处理数据。 […]
您好,我叫James Rochabrun,请允许我抛弃这个免责声明 ,但是,现在说这还为时过早。 正如您在本期或以后的帖子中将会看到的那样,英语不是我的母语,因此,如果您对语法犯罪敏感,那么这是离开此页面的最佳时间,我不会个人化,不会有任何感觉伤害。 Phhhhhhiiewwww说了这句话,我的内心不再感到内,这让我深入了解了真正重要的事情。 我是一名IOS开发人员,是一名自学成才的人,没有计算机科学学位,但是对代码充满好奇和热情,我刚刚在旧金山完成了一个iOS Bootcamp,并为两家初创公司工作,为他们的应用开发新功能。 我目前正在从事自由职业项目,但我正在积极寻找更稳定的工作。 就像许多本人一样刚进入该领域的开发人员一样,我目前正处于人生苦闷的时期,被称为“接受过技术职位面试”; 没错…长长的电话,白板测试了所有有趣的东西。 第一次面试中的一个错误答案可以确定您是否找到了工作,或者只是“感谢您的参与”电子邮件。 这就是为什么对我来说(有时您会学习“教学”对吗?),我想分享我从与Wells Fargo,Facebook等公司的访谈以及在线论坛和网站中收集的一系列不错的iOS问题。 1 —什么是内存泄漏? 内存泄漏是一种资源泄漏,当计算机程序以不释放不再需要的内存的方式错误地管理内存分配时,会发生这种情况。 在面向对象的编程中,当对象存储在内存中但无法被运行的代码访问时,可能会发生内存泄漏。 2-描述“应用程序稀疏”是什么意思? 商店和操作系统通过根据用户特定设备的功能量身定制应用程序交付,从而以最小的占用空间优化了iOS,tvOS和watchOS应用程序的安装。 这种称为应用程序细化的优化,使您可以创建使用最多设备功能,占用最少磁盘空间并容纳Apple可以应用的将来更新的应用程序。 3-什么是自动版式? 自动版式会根据对这些视图施加的约束来动态计算视图层次结构中所有视图的大小和位置。 4 —什么是GCD? 如何使用? GCD是最常用的API,用于管理并发代码和在系统的Unix级别异步执行操作。 GCD提供并管理任务队列。 一个很好的例子是,当应用程序从API获取数据时,此网络调用应在后台线程中进行,并且视图中的数据显示应在主线程中执行,以及任何UI更新。 5-Swift比Objective-C有什么好处? Swift更容易阅读。 (真的吗?) Swift更易于维护。 Swift更安全。 Swift与内存管理统一。 Swift需要更少的代码。 Swift更快。 与开源项目的名称冲突更少。 Swift支持动态库。 Swift Playgrounds鼓励交互式编码。 Swift是您可以影响的未来。 这是一个链接,您可以在其中详细查看这些断言。 6 —什么是GCD中的“同步”与“异步”? 这些术语描述了函数何时将控制权返回给调用者,以及到那时将完成多少工作。 同步函数仅在完成其订购的任务后才返回。 另一方面, 异步函数立即返回,命令任务完成但不等待它。 因此,异步功能不会阻止当前执行线程继续进行下一个功能。 7 —为什么在块中使用self时通常会创建弱引用? 为了避免保留周期和内存泄漏。 8 —您调用什么GCD方法以异步方式将一些工作传递到队列? 您为此方法提供哪些参数? […]
使用Okta,用户可以轻松地将身份验证和授权集成到本机iOS应用程序中。 两种类型的Okta身份验证。 Okta Mobile Connect(SAML) OpenID连接 Okta Mobile Connect为支持SAML(安全性断言标记语言)的本机移动应用程序启用SSO(单一登录)。 SSO(单点登录)的优点: 1.无需输入用户名和密码 2.无需记住和更新密码。 3.没有弱密码。 OpenID Connect扩展了OAuth 2.0协议。 OAuth 2.0通过作用域访问令牌提供API安全性,而OpenID Connect提供用户身份验证和SSO(单点登录)功能。 Okta身份验证API: Okta身份验证API用于通过创建和控制会话令牌来控制对本机应用程序的访问。 会话令牌是身份验证事务成功完成时发出的一次性令牌。 Okta中使用的会话令牌,而访问令牌,刷新令牌和用于访问第三方应用程序(例如您的应用程序)的客户端ID。 OAuth 2.0: OAuth 2.0协议用于以安全的方式授予对您的应用程序数据的授予访问权限。 OAuth 2.0具有以下4个重要角色: 服务器是“授权服务器”,它发出访问令牌。 Okta是授权服务器。 “资源所有者”,通常是应用程序的最终用户,授予使用访问令牌访问资源服务器的权限。 应用程序“客户端”从Okta请求访问令牌,然后将其传递到资源服务器。 “资源服务器”,它接受访问令牌,并且必须验证它是否有效。 资源服务器就是您的应用程序。 OAuth 2.0授权流程的工作方式如下: 客户端向资源所有者(用户)请求授权。 如果用户给予授权,则客户端将授权授予传递给授权服务器(Okta)。 如果授予有效,则授权服务器将返回访问令牌以及刷新令牌和ID令牌。 客户端使用访问令牌来访问资源服务器。 OpenID Connect: OpenID Connect是建立在OAuth 2.0之上的身份验证标准。 它添加了另一个称为ID令牌的令牌。 OpenID Connect的重要角色: “ OpenID提供程序”是颁发ID令牌的授权服务器。 Okta代表OpenID提供者。 “最终用户”,其信息包含在ID令牌中。 “信赖方”,即从Okta请求ID令牌的客户端应用程序。 “ […]
这是我第一次尝试将Code Jam转换为I / O进行女性编程竞赛。 Google每年都会举办一次代码拥塞挑战赛,这是他们针对女性的第五个年头,专门帮助女性增加在线竞赛空间的多样性和在Google I / O开发者大会上的代表性。 最简单的部分是注册并确定比赛中我将使用的语言。 作为参考,您可以查看解决方案和其他统计信息,包括过去几年中用于提交的最受欢迎的语言。 允许您使用任何编程语言(包括那些不在注册列表中的语言)。 接下来是最困难的部分,这是使我自己为应对挑战做好心理准备,接下来是准备自己的事情。 为了准备,我正在回顾过去几年中的问题。 我研究了一些解决方案,以了解开发人员使用了哪些库以及他们如何解析输入。 我想像这些应该是相同的,而不管问题是什么。 我也在辩论是否使用python或swift。 我熟悉Swift并经常在工作中使用它,但是最近我一直在学习python,它是使用的顶级编程语言之一,对处理大型数据集非常强大。 无论如何,我不想花很多时间来决定,所以我采用了一些性能基准测试,并且我尝试了一些示例挑战以使自己熟悉该过程,从而有可能更成功地竞争。 我用Xcode创建了一个新的命令行项目,并将其重用于解决每个示例挑战集。 命令行项目需要一个main.swift文件,因此我制作了单独的文件夹来包含问题解决方案和示例输入文件。 我的文件夹结构如下所示: 请注意,每个练习都有自己的main.swift和ParseInput.swift文件。 对于当前要解决的当前问题,我在实际的Xcode项目中仅包含一个main.swift文件,以免使Xcode感到困惑。 对于每个挑战,解析输入文件的内容可能非常相似,因此所有可重用的读取方法都可以在ParseInput.swift文件中找到。 在提交过程中,我选择通过标准输入读取示例文件的内容。 因此,我创建了一个小的Shell脚本来尽可能频繁地编译/重新运行我的解决方案。 我的shell脚本如下所示: 要运行脚本,您将传递问题编号和不带文件扩展名的示例输入的名称。 这是一个例子: ./re-run-code-jam.sh 2 B-小型练习 如果您对我如何使用泛型通过标准输入解析行感到好奇,请看以下内容: 在比赛到来之时,我将采取以下步骤解决每个问题: 花一些时间来了解问题。 这个问题往往很罗word,但它为您提供了所需的所有信息。 在编写我的解决方案之前,我经常必须阅读几次问题描述。 正确理解问题将为您节省很多时间。 提出一种解决纸上问题的方法,根据样本输入对其进行测试,然后比较您的解决方案。 如果您认为得到了解决方案,请对其进行编码。 用一小部分问题测试您的解决方案,并修复Xcode中任何明显的错误。 我添加了额外的打印语句,以确保正确读取/或计算内容。 下载大小样本文件,以生成预期的输出。 根据需要重复最后一步。 最后一刻进行清理并提交您的输出和源代码! 祝我好运! 如果您也参加,也祝您好运! 让我们玩得开心。 🙂
在Ubuntu上设置Web框架Vapor 本教程将引导您完成在Digital Ocean上设置Vapor应用程序的步骤。 本教程需要Unix / Linux命令的基本知识,并假定您使用macOS。 尽管本教程适用于Digital Ocean。 它可以应用于提供Ubuntu映像设置的任何VPS提供程序。 让我们开始吧。 DigitalOcean入门 请访问www.digitalocean.com 如果您还没有Digital Ocean帐户,请在此处注册。 拥有Digital Ocean帐户后,登录并进入Drops部分。 我们需要为我们的Vapor网站创建一个新的Droplet,为此,请单击右上角的Create Droplet按钮。 现在我们需要配置新的Droplet。 在发行版中,我们需要选择Ubuntu 14.04。 对于大小,我们可以选择最小的$ 5 / mo 。 这对于本教程或任何基本站点都应该很好。 如果需要更多服务器,则可以稍后升级Droplet。 在“ SSH密钥”部分,您可以为Droplet提供适用于您的机器的SSH密钥,这样就无需提供密码来登录Droplet。 您可以在此处找到有关如何为计算机生成SSH密钥的详细信息。 但是,对于本教程,为简单起见,我们将不提供任何内容。 最后,我们需要选择一个主机名,我将其命名为“ Vapor-Tutorial”,但是无论您喜欢哪种名称,都欢迎您使用。 连接到服务器 现在,我们已经设置了虚拟专用服务器或VPS。 我们需要连接到它,并设置Vapor。 为了连接到服务器。 如果您未提供SSH密钥,则我们需要它的IP地址和密码。 您可以从“ IP地址”列的“ Droplet”列表中获取服务器IP地址。 如果您不提供SSH密钥,那么您应该已经收到DigitalOcean的电子邮件,其中包含您的IP地址和密码详细信息。 现在我们有了需要连接的详细信息,我们现在可以SSH进入我们的服务器。 打开终端并输入 ssh root @ 将替换为服务器IP。 例如我的是ssh root@162.243.105.170。 可能会询问您是否要继续。 输入“是”。 如果提示您输入密码,请输入从DigitalOcean收到的ssh密码。 3.现在,我们已经通过SSH成功连接到服务器。 […]
我看到无数人鼓吹说单元测试对任何软件项目都非常重要。 实际上,只有极少数人使用令人信服的示例来支持自己的论点,这使得单元测试看起来像是可悲的旧式教条,可以放心地忽略。 人们是榜样的创造者,直到看到一个榜样,我们才会真正相信某些东西。 今天,我再次提出这个论点:单元测试对于确保代码按预期工作至关重要。 单元测试似乎没什么用,因为在您第一次编写代码时,它确实不是很有用。 但是我们不是生活在一个静止的世界中,我们生活在一个市场中,业务逻辑可以在几个小时内多次变化,我们生活在一个明天我们可以与今天的朋友展开战争的世界中。 不断变化的环境意味着不断发展的代码库。 几乎可以肯定,您会回到软件的一部分并对其进行修改,以执行一些不同的操作,尽管有些不同。 更改发生时,单元测试确实会发光:当新更改意外破坏应用程序的其他部分时,它将通知您。 为了支持我的观点,我邀请您进行一次遥远的冒险。 2148年,整个地球都震惊了一个令人震惊的消息:火星人的住所已被我们致命的太空敌人-虫族(Zerg)接管。 我们所有的火星定居者都被劫为人质。 太空级武器制造商Space Force的CTO感到恐惧和愤怒,决定部署一支由您最先进的外星战斗机器人组成的机队,这是世界上最史诗般的太空救援任务之一。 您迅速地慢跑到计算机上,开始键入一个程序,凶猛的机器人机群将在该程序上运行。 您选择了一个多世纪以前开源的编程语言。 当您的机器人到达时,火星将有两种:人类和虫族。 因此,您需要两个模型来表示它们。 由于它们都是有机的,因此您将创建两个符合相同Bio协议的结构。 Bio协议规定,任何Bio单元都将具有两个共同的属性:它们将具有一定数量的腿和体温(以摄氏度为单位)。 根据一直研究这种残酷外来物种的贵公司精英科学家的说法,每个异虫都有8条腿,它们的体温为27摄氏度。 协议Bio { var bodyTemperature:Double {get} var numberOfLegs:Int {get} } struct Human:Bio { 让bodyTemperature = 37.0 让numberOfLegs = 2 } struct Zerg:Bio { 让bodyTemperature = 27.0 让numberOfLegs = 8 } 现在,您已经定义了所需的模型,接下来继续向复杂的Zerg杀人机中添加一些代码。 根据您从科学人员那里获得的数据,您可以自信地编写机器人的逻辑代码。 机器人上的高级计算机视觉算法和热传感器可以轻松识别生物的腿数和体温。 因此,您继续创建基于这些属性来确定生物是朋友还是敌人的方法。 在这种方法中,您需要检查以下内容:如果一个生物单元的两条腿以上或它的体温低于30摄氏度,那么消除这种恶心的异虫。 […]