Tag: 移动应用开发

技术堆栈摘要3:2017年4月

四月是一个繁忙的月份! 有太多很棒的技术堆栈帖子,以至于我们很难挑选十个。 到4月为止,我们总共有20个热门帖子,其中包括10个隐藏的宝石💎。 来自Netflix , Flipboard , Slack , Twitter , Yelp , Dropbox , LinkedIn,Shopify等的帖子 。 令人惊讶的是,四月份的一个主要主题是移动开发 。 LinkedIn,Yelp和Uber都写了关于Android的用法,而Uber则用Swift分解了对应用程序的重写,Shopify则写了关于构建移动CI系统的文章。 查看以前版本的Tech Stack综述 十大技术栈文章: 我们如何构建Twitter Lite(Twitter) 如果您还没有听说过,那么Twitter Lite是一种“快速且响应迅速,使用较少数据,占用较少存储空间,并支持推送通知和在现代浏览器中脱机使用的功能”,旨在成为您在使用Twitter时使用Twitter的最佳方式。连接速度慢,不可靠,受限或昂贵。 基本上,是精简版的Twitter。 Twitter将其构建为客户端JS应用程序,并使用React,Redux,Normalizr,Globalize,Babel,Webpack,Jest,WebdriverIO和Yarn构建。 作者 : 尼古拉斯·加拉格尔(Nicolas Gallagher) 技术堆栈 : React , Redux , Normalizr , Globalize , Babel , Webpack , Jest , WebdriverIO和Yarn Slack的TypeScript(Slack) 有人在打字TypeScript …事实证明,您一​​直使用的Slack桌面应用程序非常复杂。 这是一个多线程应用程序,使用JavaScript与Windows,macOS和Linux的本机代码进行交互。 Slack希望能够保证一切都能融合在一起,因此他们转向TypeScript […]

获得iOS开发人员工作需要了解的三件事

找工作很难。 如果您花了很多时间浏览iOS开发人员的职位,您会发现所需技能列表非常艰巨。 您真的需要五年经验吗? 了解TDD是否有意义? 他们列出的所有那些框架呢? 他们有多重要? 看来他们还希望有人将应用程序运送到App Store。 您也需要这样做吗? 在我的生活中,有一点我看了看所有的东西,耸了耸肩,决定不申请。 然后,我负责并在业余时间系统地学习了其中的每一项技能。 这是我作为独立的iOS开发人员工作多年后发现的。 大多数职位发布都是心愿单,而不是硬性要求 技能清单并不是一成不变的。 它可能甚至不是由开发人员编写的。 您会看到,大多数开发人员都太忙了,以至于不愿意撰写职位发布。 在其他许多相互竞争的优先事项之间,我们的时间几乎被拉长了。 通常是这样的。 人力资源部的一个人问开发人员,他们在新员工中想要什么技能。 然后,开发人员会喷出任何突然冒出来的东西。 人力资源人员会编译一个列表,将其添加到职位发布中,并提供给所有人查看。 这样我们才能得到听起来像这样的职位 “我们正在寻找一位资深Rockstar iOS Ninjaneer,他熟悉通知,委托,表视图,配置,堆栈视图,TDD,Stacy提到的一件事和变量。 除非您有Swift十年的工作经验,否则请不要申请。” 同时,回到现实世界,事实证明, 您只有三项核心技能才能成为iOS开发人员。 这是因为大多数iOS应用项目都是同一事物的不同风格。 要了解优秀员工的模样,您需要了解一般的iOS应用项目 无论是供企业使用还是供消费者使用,大多数人都希望应用程序能够与Internet通讯。 结果,典型的iOS应用仅是围绕某种Web服务的漂亮外壳。 如果您接受这个前提,这三个技能将是最优先的 对Web服务的理解以及编写与之交互的代码的能力。 对关注点和设计模式(例如MVC和MVVM)分离的理解,可以加强这种分离。 了解对象持久性及其如何在iOS应用中实现。 而已。 这实际上只是三个核心技能。 让我们更详细地了解它们。 对Web服务的理解 要成为一名高效的iOS开发人员,您需要编写与Interwebs交流的代码。 这意味着您需要了解Web服务,REST API,数据库,异步进程和JSON。 您编写的代码将与这些东西交互。 除了iOS应用程序外,有些工作可能还需要您构建Web服务,但这并不是很常见。 通常,他们为此有一个单独的人。 关键是您需要知道那些东西是什么。 您需要花费大量的时间来构建可与Web服务一起使用的应用程序。 如何获得经验 我通常不会提倡这一点,但是到底是什么。 只需联系一些公司,告诉他们您正在学习iOS开发,并询问他们是否对开发人员进行了代码测试。 代码测试将告诉您获得该工作所需的一切。 大多数iOS代码测试都要求您编写一些示例应用程序,以与其示例Web服务对话。 它们是学习Web服务如何工作的好方法,而无需自己构建Web服务。 如果您可以在其时间限制下通过其中一项测试,那么您已具备基本的Web服务技能。 […]

使用Organismo-iOS-Driver获得激动人心的探索应用程序

2.通过旁路将框架注入到现有的“ ipa / app”中 。 绕过是一种很酷的OS X命令行工具,可将Organismo-iOS-Driver注入您可以推迟的任何.IPA或.APP中。 您不需要APP的源代码。 您只需要拥有开发者证书和移动设备。 3.在越狱设备中使用MobileSubstrate。 在越狱的世界中搜索Mobile Substrate来找乐子。 交付用于3D表示的UI 收集UI树的信息非常简单。 它包括迭代每个窗口及其子视图,并获取每个UIView的信息。 //迭代应用程序的窗口 for([UIApplication sharedApplication] .windows中的UIWindow *窗口)… //迭代Windows子视图 对于(UIView * window.subviews中的subView)… 检查ORGUIViewHierarchy.m中的代码。 树信息和屏幕截图可以得到与WDA相同的结果,即屏幕截图和UI树并排表示。 见下图: 但是我们现在可以在App中进行其他操作。 我们可以将UI探索带入一个真正引人注目的地方。 如果每个UI元素都将提供其渲染的图像,我们可以隔离每个元素,并且不仅在它们的X,Y平面而且还沿着Z轴渲染它们 。 好吧,这是一个很酷的主意,事实证明这也是可能的。 这是我们的第一个幸运步骤:UIView具有将自身绘制到图形上下文上并从中创建PNG或JPEG的功能。 -(BOOL)drawViewHierarchy:(CGRect)rect afterScreenUpdates:(BOOL)after 我们还没有到, drawViewHierarchy绘制视图及其所有子视图,这不是我们想要的,我们需要没有子视图的图像。 接下来的三个步骤描述了实现此目标的一种方法: 隐藏所有子视图。 对于(UIView * subview在hiddenViews中){ [subview setHidden:YES]; [view setNeedsDisplay]; } 2.使用drawViewHierarchy将视图绘制到图形文本上。 3.恢复子视图的可见性。 这个把戏行之有效。 参见下面的图片。 我们掌握了每个UI元素及其可视表示形式的信息,现在我们可以进行惊人的3D UI探索。 检查ORGScreenshot.m以查看创建UIVIew图像的代码。 UI树的详细程度 […]

向Siri打个招呼

苹果宣布在上届WWDC中Siri将向开发人员开放。 因此,让我们在应用程序中使用它。 由于SiriKit是一个功能强大的框架,开发人员可以毫不费力地向其应用程序添加语音识别功能。 由于语音在Apple服务器中处理,因此Siri将需要Internet连接。 在将UITextView和UIButton放入视图控制器之前。 当用户点击按钮时,他/他将在UITextView上看到他/她在说什么。 您的应用需要获得许可才能捕获麦克风中的语音并加以识别。 因此,您需要在info.plist文件中添加两个字符串。 密钥为隐私-麦克风使用说明和隐私-语音识别使用说明 。 这些值是任意的。 当然,您将需要在项目中检查这些权限。 为了使用SiriKit,应导入Speech类。 您还需要使用SFSpeechRecognizerDelegate ,该方法只有一种实现方法, func speechRecognizer(_ speechRecognizer:SFSpeechRecognizer,availableDidChange可用:Bool) 。 代码 您可以使用上面的代码来测试设备中的语音识别。 别忘了模拟器不适合测试,因为您可以使用麦克风。 使用真实的设备进行测试。 如果您愿意,可以从下面的Github链接下载示例项目代码: onurtuna / SpeechRecognition-Swift SpeechRecognition-Example-Swift –用Swift编写的语音识别示例。 github.com

越来越难像您已精通iOS开发。

您已经进行了很多工作以保持技能的领先,但是角色不断扩大,并且在整个新领域中您的知识可能不足。 您想成为一名高级程序员……但是您将如何实现呢? 由于在线内容数量众多,因此很难决定下一步需要学习什么,甚至是否可以应用。 如果您厌倦了筛选低质量,无关紧要的内容,并且想要针对实际问题的简短实用的解决方案,请相信以前走过这条路的专家。 在迈向精通的过程中,我们距您仅几步之遥,而我们的激情就是使您到达那里。 您将从一位值得信赖的指南中获取知识,该指南为当今的行业领导者提供培训团队和解决问题的能力。 进行14天的免费试用,开始在Frontier上观看我们的iOS大师技能包,其中包括10个有关iOS开发中适用主题的截屏视频。 人们说过的好话: “内容很棒,提醒您即使您认为自己从内到外都了解iOS开发,仍然可以学到很多。” “我喜欢知识的小块。 我学到了一些新东西,这让我继续学习感到兴奋。 “ “能够访问视频真是太好了。 他们提供了许多我感兴趣的主题的快速简单的介绍。” 转到iOS大师技能包 前往BigNerdRanch.com

类型转换:* [as!] * vs. * [as?] *

类型转换是一种出色的工具,可帮助实现OOP(面向对象编程)。 类型转换是检查实例类型的方法,|| 将该实例视为与其自身类层次结构中其他地方不同的超类或子类。 Swift中的类型转换使用is和as实现? / 作为! 操作员。 这两个运算符提供了一种简单而富有表现力的方式来检查值的类型或将值转换为其他类型。 但是,我们将仅专注于吗? 和! 如? :预期元素的可选。 如果要实现这一点,我们会说:“嘿,我不确定所说的元素是否属于这种类型。 如果不是,则返回nil并且不要使我的应用程序崩溃。” 如! :强制展开元素的可选。 如果要实现这一点,我们会说“嘿,我确定这个元素是这种类型的,我不需要返回nil,因为它将起作用。” 投射仅通过两种方式起作用: Down Cast:从父类转换为子类。 快播:从子类到父类。 上投: 在此示例中,我创建了两个类。 父类:人类,具有子类(成人)。 我创建了👩🏾,并将其设置为Humans,其子类为Adults。 从这一点开始,无论类型如何转换? 要么 ! 将起作用,因为父类型为Humans的is。 但是,当我们看待我们设定为重视人类的要素时,有一个警告, 但却是一个好警告。 不,严重的是,此错误仅警告我们:从成人到成人的有条件强制转换将始终成功。 因此[!]运算符与否,我们知道这将毫无错误地发生。 下调: 在此示例中,我创建了三个类。 超级类:人类,子类:成年人,子类:TinyHumans。 当我尝试给它键入Adults时,它仍然以TinyHumans的形式返回。 但是,一旦我将值更改为Adult并尝试将其类型转换为原始类型并将其子类化,则返回nil。 哦,是的! 当我申请为! 在我的代码中,它显然给了我一个错误,我们知道会发生错误,因为? 返回零。 所以不要以这样沮丧的年轻人而结束….. 我们将用作? 永远永远解决我们的类型问题。 如有任何疑问或意见,请输入Google! 😀

关于Swift镜像的思考

Swift镜像是Swift语言中功能最强大但尚未使用的功能之一。 使用动态提取类实例的元数据的能力 令人惊讶的是,Swift镜像非常简单。 下面的实现动态读取与Flower结构关联的属性,并将其打印在输出窗口上。 但是,我们要做的不只是在输出窗口上简单地打印它。 我们可以使用Swift镜像技术为简单的CRUD(创建读取更新删除)操作创建通用数据访问层。 这是使用Vapor SQLite提供程序的简单通用保存功能。 魔术发生在prepareInsertSQL函数中,该函数利用Swift镜像创建所需的sql。 在prepareInsertSQL中,我们动态创建插入实体所需的所需SQL。 用法如下所示: 现在,我们创建了一个非常基本的通用“保存”函数,该函数可以使用Swift镜像的功能来动态生成SQL并将数据插入SQLite数据库。

[iOS]评论耦合器文件委托和关闭?

NATIF的toujours上的dans notrelancéesur le mobile上的aujourd’hui的Salut les Astronautes。 Cet article s’inscrit dans lalignéedes 2précédents,et il estimpératifde les avoir lu pour comprendre ce dont il s’agit ici: http://blog.eleven-labs.com/fr/delegates-closures/ http://blog.eleven-labs.com/fr/android-listeners/ 共有2条个人评论文章,请参见cel pari-ci va parler的著作。 -Mais oui在Sait上发表评论,alezdépêche-toilà在veut savoir上发表评论,评论员在iOS cette fois-ci上听了。 -好的,请重新申请小技巧。 注释ça va se passer: Bon总理文章,Pour que tout le monde soit heureux,Jum vais vous produire du DUMMY代码,Swift。 iOS开发者Dans le monde […]

ID3TagEditor和Mp3ID3Tagger的诞生以及我进入ID3标签标准的旅程

最近我买了一辆新车。 经过大量搜索,我最终决定购买雷诺Clio 2017 1.5 dci。 我爱这辆车。 这是我上一辆车向前迈出的一大步。 它最有趣的功能之一是其媒体娱乐系统:Media Nav Evolution系统。 该系统具有7英寸触摸屏和地图集成功能,并且具有Siri语音识别和电话支持功能的基本智能手机集成功能。 引起我注意的一件事是在开车时可以开始听我的mp3专辑的可能性(在以前的汽车上,我有一个标准的CD播放器)。 因此,我准备了一些mp3的usb密钥,然后开始收听它们。 我突然发现了一个很棒的发现:我的一些歌曲在触摸屏上显示了有关专辑的信息,并且正在显示专辑的封面! though我虽然说:“哇,这太酷了!! 我需要开始用所有这些信息填充我的mp3。 我想查看我所拥有的每个mp3专辑的封面! 这正是我进入ID3TagEditor和Mp3ID3Tagger开发之旅的那一刻,但是我还没有意识到。 所以我坐在MacBook前面,打开iTunes,然后开始标记mp3文件。 我将它们保存在usb密钥上,然后我去了汽车上对其进行测试。 结果如下: 这到底是怎么回事??!!?! displayed显示的标题和专辑,但没有在屏幕上显示封面。 所以我回到办公桌上,开始下载一些本地macOS应用程序,该应用程序让用户编辑我发现的称为ID3标签的内容 。 他们都没有按预期工作。 然后我找到了一个名为Mp3Tag的应用程序。 这是Windows应用程序,也可以使用Wine在macOS上运行。 所以我下载了它,并尝试标记一些mp3。 我将它们放在USB闪存盘上,然后… Mp3Tag工作正常expected。 但是后来我开始自问:“其他本地macOS应用程序没有在做Mp3Tag吗?”。 发现这个奥秘的原因的唯一方法是将标记为Mp3Tag的mp3与标记为其他应用程序之一的mp3进行比较。 因此,我以我最喜欢的十六进制编辑器HexFiend打开了一个带有iTunes标签的mp3和另一个带有Mp3Tag标签的mp3,然后将它们进行了比较…

处理可编码和核心数据

最近,我一直在为iOS应用程序实现缓存机制。 为了实现这一目标,我设定了以下目标: 利用Codable协议轻松解析来自Web服务的JSON响应并创建适当的模型实例。 将所需的模型实例存储在Core Data中。 这项任务是一次有趣的学习经历。 因此,我决定回到我的示例应用程序之一,以说明如何使数据模型支持Codable并与Core Data Codable工作。 模型:NSManagedObject和Codable 我开始的示例应用程序只有一个简单的模型User ,如下所示: Core Data的用例非常简单:允许离线使用该应用程序(即:当网络连接不可用时)。 实现此目的的最简单方法是,每当应用程序具有网络连接时,就删除并重新创建Core Data数据库。 这就是为什么在parse(…)方法中,在实际解析JSON响应之前调用clearStorage() :在开始添加已解析的User实例之前,我们想清除存储(数据库)。 清除存储所需的代码非常简单,因为我们只需要删除一个表即可: 为了检索存储的User实例, UserController提供了fetchFromStorage()方法: 两种方法都通过NSFetchRequest执行各自的任务。 通过实现上述两种方法,我们现在拥有了与Core Data和User实例成功交互所需的一切。 结论 在这篇文章中,我描述了我使用Codable和Core Data的个人经历。 特别是,我专注于如何无缝解析JSON响应并将结果模型存储在Core Data中的适当数据库表中。 这篇文章中说明的示例应用程序的代码可在GitHub上找到。