Tag: 开源

iOS版Firefox Focus中的错误修复#2

一周前,我写了一个故事,讲述了我在Mozilla的iOS隐私浏览器Firefox Focus中首次修复漏洞的故事。 在该文章中,您还可以找到我对Firefox Focus的介绍。 如果您错过了我以前的故事,我强烈建议您阅读: iOS版Firefox Focus中的错误修复 我将继续我在开源软件领域的旅程,我想分享一下我最近在修复软件方面的经验。 medium.comi Firefox Focus iOS版本8.0即将发布。 此新版本将主要增强浏览器的搜索建议功能。 我研究了搜索建议中的错误之一。 如果用户选择搜索建议而不是按下键盘上的“执行”按钮,URL栏将不显示搜索文本。 这是一个例子: 如果您搜索mozilla并按“ Go”按钮,则URL栏将包含mozilla 。 但是,如果您搜索mozilla并选择了搜索建议之一,则网址栏将包含www.google.com 。 我修复此错误的策略是: 查找在搜索建议单击上调用的函数。 调试此功能并了解其工作原理。 查找将文本设置为URL栏的代码。 进行更改以修复该错误。 Firefox Focus在其文档中有一个有用的文档,称为UI和代码映射。 该文档基本上将UI映射到代码,并且对不太熟悉项目代码库的新贡献者非常有用。 在该文档中,我发现包含建议的视图称为OverlayView 。 它让我开始调查。 我在应用程序中经历了OverlayView类。 在OverlayView.swift ,我找到了OverlayViewDelegate协议声明。 该协议包含一堆应该响应不同用户操作的功能。 我怀疑上面的两个功能: didSearchForQuery和didSubmitText 。 我在BrowserViewController找到了它们的实现。 我在它们的每一个上创建了两个断点,并通过场景重现了该错误。 正如我发现的那样,当用户选择建议时, didSearchForQuery被调用。 现在,我必须调试此功能,并找到设置URL Bar文本的代码段。 如果看一下didSearchForQuery的实现,您会发现它并不是那么大。 但是,当您调试此功能时,它会变得越来越深,并且会涉及许多其他功能。 我还比较了didSearchForQuery和它的模拟功能,当用户按下“ Go”按钮时会调用它。 我发现它们彼此之间是相似的,最终它们调用了一个名为setTextToUrl的函数,我认为这正是我想要的。 我花了一些时间玩代码并进行了不同的更改。 我以为我找到了didSearchForQuery不会更改URL栏中文本的原因,因为我注意到它没有将搜索推送到SearchHistory堆栈,因此setTextToUrl函数无法获取值。 我在didSearchForQuery中添加了一种将搜索推入SearchHistory堆栈的方法,似乎setTextToUrl函数正在获取当前搜索的值,但是URL Bar仍然包含www.google.com ! […]

没有(NS)FileManager的世界

您能想象没有标准库的现代编程语言吗? 这种香草技术不是很有用。 每当您需要字符串操作或链表时,您都必须重新发明轮子。 很难想象,但是为了学习,也许您应该这样做。 从人到人 一遍又一遍地编写相同的功能与通用方法是矛盾的,后者站在巨人的肩膀上,采用经过战斗验证的代码并以此为基础。 标准库不是全能者从天上赐给我们的神圣礼物 。 这只是人们为人们编写的代码,因此我们可以对其进行调查并从中学习。 Swift编程语言具有可靠的标准库。 您可以在其中找到大量协议和数据结构,这对我们的日常工作至关重要。 它并不止于此。 如果有Swift,则必须有标准库,但是您也可以选择使用Foundation框架。 该框架是Objective-C的遗产,可为我们提供对操作系统服务(及更多)的访问。 作为iOS开发人员,无论您是否想要, Foundation都是您工作中必不可少的工具 。 一个众所周知的事实是,当您从事物中获取事物时,您会更加欣赏它们的价值。 这是一项很棒的运动,可以帮助您成长。 让我们在实践中尝试一下。 想象一下,您需要加载一个文本文件并将其内容打印到控制台。 您有一个空旷的操场,不能使用Foundation。 我们什至从哪里开始? 游乐场沙箱 我们需要解决的第一个重要主题是创建要读取的文件。 由于Playground的沙箱,访问文件并非易事,它只允许我们访问特定目录中的文件。 在Playground中进行沙箱操作要安全得多。 使用Foundation,这很容易,但是我们只是摆脱了使用它的特权。 存放文件的最基本的位置是游乐场束的Resources目录中。 要访问它,您可以使用: Bundle.main.path(forResource:“文件”,ofType:“ txt”) 没有Foundation,将很难生成您将获得的URL。 /var/folders/p6/bzwgcq8j5gbg60b_lqprskch0000gp/T/com.apple.dt.Xcode.pg/resources/0A333528–48D8–4FF7–885E-9E2151867350/file.txt 我们可以访问的另一个位置是“ 共享游乐场数据”文件夹,我们可以在“文档”中创建此文件夹。 您可以使用PlaygroundSharedDataDirectory全局变量(PlaygroundSupport模块)获取路径,但是它包含URL(Foundation结构!),因此我们将在此练习中使用硬编码的路径(将来可能无法使用)。 通过在终端中键入以下命令来准备测试文件(-e in echo是用于启用反斜杠转义解释的标志): mkdir〜/ Documents / Shared \ Playground \ Data echo -e“要打印的示例文本。\ n新行文本。”>〜/ Documents / Shared \ […]

RichTextView

假设您是一名iOS开发人员,并且要求您构建一个呈现HTML的标签。 这很容易,您可以使用NSAttributedString并传入HTML文档类型,使其发挥作用。 如果现在要求您同时显示Markdown和HTML怎么办? 好吧,您可以找到Markdown解析器或构建自己的解析器,并以某种方式与HTML协调。 如果随后要求您显示LaTeX或YouTube / Vimeo链接怎么办? 然后,您必须担心WKWebView以及正确的布局和约束。 好吧,没有更多了。 引入RichTextView,它是UIView的子类,可处理上述所有富文本数据类型 为了使RichTextView处理它可能遇到的各种用例,需要正确格式化输入字符串。 您可以在我们的项目网站上查看适当的输入格式。 输入的格式正确后,将使用WKWebViews呈现Youtube / Vimeo链接,并使用WKWebViews呈现其余的富文本NSAttributedStrings 。 然后, RichTextView将使用SnapKit来动态约束视图,使其在输入字符串中出现的顺序一个接一个。 RichTextView旨在轻松支持根据需要添加更多的富文本类型。 如果您希望获得支持,请随时为我们的回购做贡献。 简而言之, RichTextView是一个功能强大的工具,可用于呈现各种富文本类型。 它是在Swift中设计和构建的,一旦在项目中实现,只要格式正确,它就可以处理您向它抛出的任何类型的输入。 RichTextView可以使用Cocoapods或Carthage集成到您的iOS应用程序中,现在就可以轻松开始在您的应用程序中使用!

贡献给WWCodeDFW iOS项目

设置完项目后,就可以开始进行贡献了! 检查回购的问题标签以查找需要处理的内容。 有自己的想法要补充吗? 创建一个问题,将其分配给自己,然后开始工作! 如果您想参加Digital Ocean的Hactoberfest活动,请务必用“ Hacktoberfest”标签标记问题。 容易完成的任务都标有“好问题”的标签,我创建的所有问题都具有指向文档/方法的链接,以帮助您入门。 一旦准备好进行编码,请从development创建一个分支,然后在其中提交更改。 确保以您当前正在处理的问题为分支命名。 如果您需要git教程,那么Git文档和git教程都适合初学者! 将分支推送到远程后,转到github创建请求请求! 从仓库的主页中选择“创建请求请求”。 从标题为“比较”的右侧下拉列表中选择分支。 从那里,点击“创建请求请求”按钮。 如果存在合并冲突,则必须先解决它们,然后才能将拉取请求合并到开发中。 而已! 创建拉取请求并解决所有冲突后,我们将能够合并您的更改! 如果还没有,请加入Slack的’dfwiosapp’频道,然后查看更多可解决的问题! 如果您想提供帮助,但是添加代码似乎很吓人,请随时为问题积压添加想法。 欢迎任何大小的捐款! 快乐编码🤘🏻

适用于iOS应用的控制台视频游戏风格作弊代码

如何在iOS应用中实现D-pad风格的作弊代码 最近,我在考虑如何在iOS应用中实施复活节彩蛋,以及用户如何找到它。 如果您不熟悉复活节彩蛋的概念,那么复活节彩蛋 是一项隐藏在用户必须发现的应用程序中的有趣功能。 在游戏机游戏的早期,视频游戏通常包含作弊代码以解锁复活节彩蛋或游戏的其他功能,例如关卡选择屏幕或上帝模式 。 通常,这些是由开发人员创建的,可以跳至特定级别等,而无需一直玩游戏。 由于此时几乎所有的控制台都是使用D-Pad控制器(由带有向上,向下,向左和向右箭头的方向盘以及(通常)四个彩色/带字母的按钮,例如A,B,C,D组成)来播放的,必须使用这些输入的组合来输入作弊代码。 常见的8位时代视频游戏作弊代码示例是Konami代码,该名称取自视频游戏开发者Konami的名字,该游戏经常包含向上,向下,向下,向左,向右,向左,向右,B,用于解锁该游戏特有的作弊功能。 随着时间的流逝,其他开发人员甚至DVD和网站都已在视频游戏中采用了此代码和许多其他变体来解锁复活节彩蛋。 不依赖D-pad控制器进行输入的游戏和媒体已经找到了使用户能够输入作弊代码的创造性手段。 例如,《舞蹈大革命》系列中的某些游戏允许通过跳舞垫输入作弊文件,而某些DVD通过DVD播放器遥控器接受作弊代码。 要在iOS应用中实现作弊代码(例如Konami代码),我们可以将方向滑动等同于D-pad箭头按键,而A,B,C按钮的按键可以使用iOS键盘进行数据输入。 秘籍 Cheats是一个开放源代码框架,旨在允许iOS开发人员定义自己的复古视频游戏风格作弊代码,应用可以识别这些作弊代码,以解锁隐藏功能/复活节彩蛋。 它是使用Swift 4编写的,可通过Cocoapods,Carthage和Swift Package Manager获得。 用法 例如,一个简单的作弊代码序列可以定义如下: let actionSequence:[CheatCode.Action] = [.swipe(.up)、. swipe(.down)、. swipe(.left)、. swipe(.right)、. keyPress(“ a”)、. keyPress(“ b“)] 此顺序允许用户向上滑动,向下滑动,向左滑动,向右滑动 (在视图上),然后调出键盘以允许输入A和B键 。 通过定义一系列动作,我们可以定义一个CheatCode和一个CheatCode.Action数组CheatCode.Action对象需要一个完成闭包,每次CheatCode更改状态时都会调用该闭包。 let作弊= CheatCode(actions:actionSequence){ 切换cheatCode.status(){ case .matched://正确 打印(“作弊解锁!”) case .matching://到目前为止正确 打印(“解锁作弊需要进一步的动作。”) case .notMatched://不正确 打印(“作弊不正确。”) case .reset://初始状态或序列重置 打印(“作弊序列重置”) } } 调用该闭包将返回CheatCode实例作为参数,从而允许使用state()方法查询CheatCode.State 。 […]

2017年您肯定要尝试的10个新IOS库

九头蛇 Hydra是功能齐全的轻量级库,可让您在Swift 3+中编写更好的异步代码。 GitHub – malcommac / Hydra:承诺与等待–用Swift编写更好的异步代码 Hydra –承诺与等待–在Swift github.com中编写更好的异步代码 AnimatedCollectionViewLayout 通常,当您从一项滚动到另一项时, UICollectionView没有过渡效果。 有很多方法可以为UICollectionView编写动画,但是使用UICollectionViewLayout子类是迄今为止最简单的方法。 而且它不会破坏您现有的任何代码。 您仍然可以使用UICollectionView子类,而无需更改UICollectionViewCell。 只需即插即用。 GitHub – KelvinJin / AnimatedCollectionViewLayout:一个UICollectionViewLayout子类,添加了自定义… AnimatedCollectionViewLayout –一个UICollectionViewLayout子类,可将自定义过渡/动画添加到… github.com ESTabBarController ESTabBarController是一个高度可定制的TabBarController组件,该组件继承自UITabBarController。 GitHub – Eggwift / ESTabBarController:ESTabBarController是一个Swift模型,用于自定义UI,徽章… ESTabBarController是一个Swift模型,用于自定义UI,徽章并向选项卡项添加动画。 支持彩票! github.com 洛蒂 Lottie是一个适用于Android和iOS的移动库,它使用bodymovin解析作为json导出的Adobe After Effects动画,并在移动设备上通过React Native原生渲染矢量动画! github – airbnb / lottie-ios:一个iOS库,用于原生渲染After Effects矢量动画 lottie-ios –一个iOS库,用于本地渲染After Effects矢量动画 github.com 英雄 Hero是用于构建iOS视图控制器过渡的库。 它在UIKit繁琐的过渡API之上提供了一层。 对于开发人员而言,使自定义转换成为一件容易的事。 […]

Coffe-Shop-MVC [项目跟踪备忘录]

这是要学习的非常简单的MVC项目。 源代码

占位符介绍

在UITextField上设置多个占位符并UITextField设置动画 占位符是一个源远流长的功能强大的概念-易于被用户识别,具有严格,合理的含义,并为开发人员提供了一种提示用户的简便方法。 但是,有时仅拥有一个占位符是不够的。 有时您想向用户展示可以输入的所有内容。 例如,如果您有一个名为“活动标题”的字段,那么您当然可以在其中将“运行”作为占位符。 或者,您可以定义一组占位符,例如“运行中”,“行走”,“行进”,“拳击”,并对它们进行动画处理。 如果认真使用此技术,则可以提供出色的用户体验。 看起来像这样: 占位符库允许您做到这一点。 实际上,它确实非常简单,我鼓励您自己尝试实现类似的东西-它可以很好地介绍迭代器, CATransition和Timer (以前称为NSTimer )。 在本文中,我们将快速浏览API,然后讨论一些体系结构选择和功能。 在开始之前,这里是GitHub上的占位符 : 德雷蒙德/占位符 占位符–🅿️为UITextField定义多个占位符,并对它们的更改进行动画处理 github.com 现在让我们潜入吧! 如何使用 占位符旨在与视图控制器很好地配合使用。 API的核心部分是Placeholders类。 您可以直接创建它: let占位符=占位符(占位符:[“正在运行”,“正在行走”,“骑自行车”]) 这将创建一组三个占位符。 当然,通常您希望“循环”占位符,以便动画永远运行。 或者您想改组您的集合,以使用户不会每次都以相同的顺序看到相同的占位符。 为此,应分别使用.infinite和.shuffled选项,如下所示: let占位符=占位符(占位符:[“正在运行”,“正在行走”,“骑自行车”],选项:[.infinite,.shuffle]) 然后,在viewWillAppear方法中,应将Placeholder实例绑定到UITextField 。 您可以通过调用start方法来做到这一点: placeholders.start(时间间隔:3.0, fireInitial:正确, textField:textField, 动画:.pushTransition(.fromBottom)) ( fireInitial用于立即设置第一个占位符) 基本上就是这样! 现在,您有多个动画占位符。 您可以间隔播放或调整动画以适合您的需求。 如果要创建完全自定义的动画,请查看自述文件。 怎么运行的 总的来说,该解决方案非常简单:它是Timer ,迭代器和CATransition的组合。 数据源是通过AnyIterator提供的,占位符的更改是通过Timer安排的,并使用简单的CATransition执行。 如果您想知道动画的执行方式,则为: 让过渡= CATransition() transition.duration = 0.35 transition.timingFunction = […]

我的第一个GitHub项目:方法

关于如何为您的第一个GitHub项目做出贡献的步骤 因此,您已经决定要开源 经过同仁的压力和FOMO,您已经决定要尝试这个GitHub贡献的东西,并选择了一个值得您的才华的项目。 这篇文章描述了开始GitHub之旅所需采取的步骤,以及如何继续进行下去。 步骤1:叉 好的,您已经在GitHub上选择了一个开源项目,并希望对此做出贡献。 让我们来 kgellci / Area51 适用于iOS的开源Reddit客户端完全内置于Swift中– kgellci / Area51 github.com (顺便说一句,如果您想磨练您的Swift语言和iOS SDK技能,则是一个完全rad开源的iOS项目)作为您想要的开源项目。 从哪里开始? 好的,首先,您需要分叉该项目。 这是什么,它将在您的 GitHub个人资料中以您的名字创建该主存储库(kgellci / Area51)的副本,如下所示:https://github.com/yourusername/Area51/。 您所需要做的就是,转到所需的项目存储库,然后单击“ Fork”按钮,如下图所示。 然后,GitHub会告诉您它正在以您的名字创建一个新的存储库,大约需要30秒才能完成该过程。 和瞧! 您拥有第一个分叉的存储库。 第2步:克隆 现在,您已经有了代码库,可以开始编码了。 接下来要做的就是在本地计算机上克隆存储库。 转到您的存储库(https://github.com/yourusername/Area51/),然后单击“克隆或下载”按钮,如下所示。 2. GitHub将打开一个带有HTTPS URL的小弹出窗口,格式为:https://github.com/yourusername/Area51.git。 复制该链接。 注意:如果选择复制SSH URL链接,则可能需要为本地计算机设置SSH密钥。 要了解如何执行此操作,请转到以下链接:https://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent 3.然后,打开您的终端并将目录更改为所需的位置。 4.键入git clone https://github.com/yourusername/Area51.git并按Enter。 Git将在您指定的位置创建您的项目的本地克隆。 步骤3:提交 这是该过程中最简单的步骤。 您现在所需要做的就是编写代码。 您可以打开项目的本地克隆并进行所需的更改。 然后,提交更改并将更改推送到远程存储库(https://github.com/yourusername/Area51/)。 注意:提交更改时,请记住添加结构化提交消息。 您可以在这里找到一些有关构造提交消息的有用指南:https://chris.beams.io/posts/git-commit/ 第四步:公关 好的,现在,您的更改已存在于存储库中。 接下来要做的是将您的更改发送到主存储库(https://github.com/kgellci/Area51/),以便将其集成到主代码库中。 为此,您需要做的就是打开一个请求请求。 […]

本地化macOS应用程序。

https://appfillip.com/important-tips-for-app-store-localization-help-to-increase-app-ranking-globally/ 世界上有太多语言(超过6500种)。 但是,地球上的大多数人口(约60–70%)仅使用其中的50–60。 对我们有利,我们不需要将我们的应用程序转换为所有6500! 实际上,并非每个应用程序都需要本地化,它取决于客户群(大多数用户使用哪种语言)以及该应用程序的受欢迎程度。 此外,如果他们在理解内容时遇到困难,可以将本地化视为可以鼓励用户使用该应用程序的功能。 我一直在寻找一个有助于发展的项目,却发现了一个名为IINA的项目。 伊娜 IINA是适用于macOS的现代视频播放器。 它具有本机播放器(快速时间)不具备的许多功能,例如制作播放列表,添加字幕,缩略图预览等。 同时,它具有漂亮的用户界面,与“快速时间”非常相似。 IINA仍在发展中。 我打开了一个问题页面,找到了一些尚待解决的错误,然后发现要求对多种语言进行本地化。 我在应用程序本地化方面没有任何经验,因此认为这是学习如何进行的好机会。 在不同的网站上有很多关于如何本地化iOS / macOS应用程序的教程。 他们非常简单,并通过分步说明详细解释了所有内容。 本质上,本地化是通过将强类型文本( UILabel , UIView等中的所有文本)移动到单独的文件中来完成的。 所有本地化的字符串都存储在扩展名为.string文件中。 内容很简单,由键值对组成。 在我刚开始的时候,INIA已经针对多种语言进行了本地化(对于某些语言仍然不完全适用)。 但是,如果您正在处理的项目没有任何本地化,则可以从添加一种新语言开始:在项目导航器的“信息”选项卡中有一个“本地化”部分。 只需单击+按钮即可添加新语言。 如果要将本地化添加到新项目中,我建议使用本教程。 由于已经为该项目设置了本地化,所以我决定检查俄罗斯和乌克兰的本地化。 要使用特定的本地化环境运行应用程序(更改应用程序语言),您需要在xCode中编辑方案,或者更改系统语言(老实说是个坏主意)。 导航到“产品”->“方案”->“编辑方案”,或单击活动方案(位于旁边的左上角 按住alt键的同时点击“ stop按钮)。 在这里,您可以选择一种语言,该语言将是使用xCode运行该应用程序时的默认语言。 因此,我以两种语言运行了IINA,发现它并没有完全本地化为乌克兰语。 我首先过滤所有文件以仅获取用于乌克兰语本地化的.string文件(例如uk.lproj / PrefGeneralViewController.strings或iina / uk.lproj / PrefCodecViewController.strings)。 这些文件与Localize.string文件不同,因为它们没有键的明确名称,而是包含UI元素的ObjectID (例如“ hWC-KJ-FuC.title”)。 因此,在Localize.string文件中添加缺少的翻译很容易。 为其他文件添加翻译要困难一些,因为几次我遇到缺少的ObjectID ,这意味着具有这些ID的对象将无法翻译。 为了修复它,我为相同的ViewController打开了本地化文件,并从那里复制了缺少的ObjectID 。 现在,我唯一需要做的就是翻译它们。 完成这些操作后,我再次运行该应用程序,并注意到整个菜单选项卡仍未翻译。 那是因为我只向缺少的.string文件添加了缺少的翻译。 很明显,该菜单选项卡的翻译文件不存在。 要为该视图添加本地化文件,我为PrefUtilsViewController打开了一个xib文件,并在“检查器”菜单中选中了缺少语言的复选框。 […]