Tag: JavaScript

使用Firebase Cloud功能实施DeviceCheck

(这不是教程) DeviceCheck是iOS 11引入的,它使开发人员可以检查用户是否处于四个自定义状态之一。 所有状态均由开发人员决定。 引入DeviceCheck是为了允许开发人员在所有开发人员的应用程序中正确识别和分类其用户,而无论用户是否删除了他们的任何应用程序。 有许多用途,但通常与货币化和社交有关。 如果您提供应用内新用户交易并希望确保用户无法删除,重新下载和再次访问该交易,则DeviceCheck是您的解决方案。 如果您提供社交应用程序,并且想要确保违反您条款的用户无法长时间访问您的服务(直到他们获得新手机),DeviceCheck是您的解决方案。 在DeviceCheck之前甚至今天,开发人员将在Apple的视野中实施一般或高度可斥责的识别用户的方法,其中最大的例子是Uber直到2017年左右。 一般的解决方案之一是为每个用户使用唯一的,但不是永久的,有时甚至是不存在的广告标识符。 另外,一些开发人员会将信息存储在钥匙串中,但是一旦删除该应用程序,该信息就会被删除。 高度谴责实际上涉及访问每部电话的唯一IMEI /序列。 DeviceCheck已成为各方的完美答案。 它为开发人员提供了永久性,但确保了隐私,使Apple和用户都感到高兴。 开发人员在实施它时遇到的问题。 DeviceCheck要求与Apple的服务器通信,这意味着您必须拥有一台服务器才能完全实现它。 对于在大型公司以外工作的开发人员,花时间了解实施情况可能没有吸引力。 实际上,实施可以非常简单,并且无服务器。 对于我自己的项目(社交),我之所以坚持不懈,是因为用户的质量对于应用程序的成功是不可商议的。 所需的只是Firebase Cloud Functions,Firebase数据库和Node.js。 实施DeviceCheck所花费的大量时间涉及熟悉JavaScript,请求承诺和Apple的错误代码。 因为不仅在服务器之间,而且在数据库之间都会有很多来回回响,所以逻辑确实不是那么简单。 但是,一旦完成,这无疑会让您感到无比的成就。

Flutter vs React Native-您需要知道的。 – openGeeksLab的Dmytro Dvurechenskyi

Flutter vs React Native-您需要知道的。 先进的工具不时需要现代流行的移动应用程序来实现它们。 因此,专业开发商努力满足这一领域的实际市场需求。 最有趣,最有用的创新成为讨论的主题。 React Native跨平台于2015年在GitHub上作为开源发布,结合了Android和iOS本机API。 尽管它具有无可置疑的好处,但是我们可以肯定的是,您一定听说过另一种有趣的,不寻常的编程方法-Flutter,它是Google对标准技术的高级答复。 这个新的用户界面于2017年启动,旨在在创纪录的时间内制作iOS和Android版本上的高质量本机应用程序。 什么是颤振? Flutter是Google对React Native的回应,我敢肯定您一定听说过它。 在Flutter发布之后,各种移动开发社区开始进行比较讨论,其中“ React Native或Flutter”是使用JavaScript开发跨平台移动应用程序的最佳框架。 但是,这很容易。 Flutter允许Google开发人员同时使用完全相同的代码同时为iOS和Android构建应用。 对于Flutter来说,这听起来像是一次巨大的飞跃,但要赶上React Native仍然有很长的路要走。 目前,对React Native开发心存疑虑的开发人员甚至没有认真考虑Flutter。 尽管我相信Flutter可能是移动应用程序的未来。 关于Flutter的5个快速总结: –这是Dart语言。 说什么飞镖? !!! 那是大多数开发人员的反应。 –推荐的带有Flutter插件的IDE是Android Studio或Intellij Idea。 – Flutter具有Dart桥,应用程序较大,但运行速度更快。 与带有Javascript bridge的React Native不同。 – React Native和Flutter共享类似的范例,例如事件处理程序和类扩展。 – Flutter的动画和安装体验分别非常出色和流畅。 大多数人在初次熟悉Flutter时会问的问题是“它像React Native吗?” 为了回答这个问题,我们的开发人员Viktor Gavrilov驾驶Flutter旋转了一下,这是他的发现: 在添加软件包时: 在Flutter中,所有内容都会自动连接。 但是,在React中,某些本机模块是手动连接的。 我们通过内置的“程序包管理器”连接程序包,因此不必像通常那样通过Xcode CocoaPods,React Native链接进行连接,而是通过npm将程序包连接到RN。 我们添加到pubspec.yaml。 该包,我们之前在https://pub.dartlang.org/flutter中找到并执行以下命令: “颤振包得到” […]

在UIWebView中禁用点击延迟

从历史上看,使混合移动应用感到有点“偏离”的差异之一是,使用简单的click事件处理程序处理UI元素上的轻击时会有所滞后。 创建了诸如Fastclick之类的库来通过使用原始触摸事件立即触发事件处理程序来缓解这种情况。 尽管它们用于基本用途,但为触摸事件增加了JavaScript执行开销,这导致了麻烦。 最近,Android上的Chrome和iOS上的Safari都取消了对不可扩展页面的限制。 这是单次点击延迟的根本原因-无法知道用户是尝试双击还是单次点击,因此浏览器必须在第一次点击后等待才能看到如果另一个来了。 我以为这适用于应用程序中嵌入的Web视图,但是我很失望地看到Quip的行为在iOS 9.3或10.0上并没有改善(对于大多数事件处理程序,我们都有自己的类似Fastclick的包装器,但不适用于到复选框,然后仍然很落后)。 进一步的研究表明,该改进不适用于UIWebView (用于将Web视图嵌入iOS应用程序的较旧机制WKWebView较现代,但仍存在一些局限性,因此Quip尚未迁移到该应用程序)。 有关改进的WebKit博客文章包括一些与相关的跟踪错误相关的链接(如前所述, WKWebView是完全开源的,仍然不错)。 深入研究关联的提交之一,这似乎是要调整多个UIGestureRecognizer实例之间的交互。 通常,处理单次点击的操作必须等待处理两次的操作失败,然后才能触发其动作。 由于一次敲击要花费350毫秒来确定一次敲击是否跟随另一次敲击,因此单次敲击需要很长时间才能失败。 Apple所做的更改是为不可缩放的页面禁用了第二个手势识别器。 UIWebView不是开源的,但我认为其实现必须类似。 为了验证这一点,我添加了一个小代码段以转储其视图层次结构的所有手势识别器(由[self dumpGestureRecognizers:uiWebView level:0]触发: -(void)dumpGestureRecognizers:[UIView *)view level:(int)level { NSMutableString *前缀= [NSMutableString新]; for(int i = 0; i <level; i ++){ [前缀appendString:@“”]; } NSLog(@“%@视图:%@”,前缀,视图); 如果(view.gestureRecognizers.count){ NSLog(@“%@ gestureRecognizers”,前缀); 的(UIGestureRecognizer * gestureRecognizer in view.gestureRecognizers){ NSLog(@“%@%@”,前缀,gestureRecognizer); } } 对于(UIView * view.subviews中的subview){ [self dumpGestureRecognizers:subview级别:level +1]; } […]

可编程逻辑控制器VB1-14MT-D(PNP晶体管输出)

品牌 :活力 型号 :VB1-14MT-D 可编程逻辑控制器(PLC)或可编程控制器是坚固耐用的工业数字计算机,适用于控制生产流程,例如组装线或机器人设备,或任何需要高可靠性控制且易于编程的活动和过程故障诊断。 它们最初是在汽车工业中开发的,旨在提供灵活,坚固耐用且易于编程的控制器来代替硬接线的继电器和计时器。 从那时起,它们就被广泛用作适用于恶劣环境的高可靠性自动化控制器。 PLC是“硬”实时系统的一个示例,因为必须在有限的时间内响应输入条件产生输出结果,否则将导致意外操作。 特点和规格: 类型: 8点,DC 24V信号输入; 6点NPN晶体管输出 输出: 0.5A PNP晶体管输出 输入电压 :24V DC 有关更多信息,请访问我们的网站: www.autocon.biz 由Autocon Instruments发布

iOS 9升级:为什么我的单元测试停顿了?

关于为什么从iOS 8升级到9 SDK导致测试缓慢的调查。 由 艾伦•芬伯格 ( Alan Fineberg)撰写 。 抬起头,我们已经搬家了! 如果您想继续了解Square的最新技术内容,请访问我们的新家https://developer.squareup.com/blog 将Square Register从iOS 8升级到iOS 9时,我们发现单元测试行为发生了难以诊断的变化。 我们调查了此问题,并追溯了我们的步骤以找到根本原因。 最终,我们发现潜在的问题不仅是Square特有的,而且可能会影响任何iOS开发人员。 现在测试缓慢,不可靠 iOS版Square Register已有将近7年的历史,它是一个庞大的应用程序,其中包含超过一百万行代码。 从iOS 8或iOS 9迁移基本SDK似乎很简单,但这种变化的规模却带来了许多挑战。 这些挑战中最主要的是应用程序的测试套件。 实施更改后不久,我们注意到我们的单元测试套件(每个构建都运行了数千个测试)已经大大减慢了速度,最终将失败。 这些测试失败在单独运行时从未发生,但通常在较大的测试套件中失败,并且并非总是以相同的方式失败。 由于没有一个单一的测试有缺陷,所以一个合理的解释表明共享测试环境受到污染。 这是主队列! 下一步是减少草垛的大小。 我们开始注释测试以缩小范围。 在文件变得乏味之后逐一注释掉-我们提供了使生活更轻松的类别技巧(下)。 不幸的是,不存在一种更好的方式来运行与iOS中的命名模式匹配的测试子集: 令人沮丧的是,此Xcode功能仅启动了Instruments的惰性实例,而不是附加到进程。 相反,要描述测试运行,我们必须: 在代码中设置一个断点, 运行测试, 发射仪器, 通过进程ID小心地附加到正确的进程(下拉列表中可能有重复项) 然后点击“记录”。 泄漏工具不认为NSManagedObjectContext(下面的屏幕快照中为SDManagedObjectContext)是泄漏,因为它最终被拆除了。 但是它确实报告了保留/释放对的列表。 因此,我们查看了单个对象超过6000个保留/发布的列表。 当时,我们没有发现问题的根源,因此它又回到了通过lldb进行调试的过程。 经过大量调试并打印出[context keepCount]后,我们发现上下文的save:方法添加了一个保留,并且,如果我们注释掉了这一行,则按预期方式清理了上下文(!),并且泄漏为堵塞。 我回到了Instruments,用此新信息对它的报告进行了交叉检查,并且肯定的是: 罗,未配对的保留。 导致泄漏的保持架的详细视图: Instruments的详细信息视图:堆栈跟踪包括save:,CFRetain和_registerAyncReferenceCallback(sic) 诊断 为了调试,我覆盖了[NSManagedObjectContext(_NSCoreDataSPI)performWithOptions:andBlock]并设置了一个符号断点(基于上面的Instruments输出)。 我的汇编语言不太流利,但是我可以通过阅读以下注释进行跟进: 在第91行,我们增加了保留人数。 在第132行,我们将异步工作添加到队列中。 我们推断出,在调用save:时,上下文正在排队一些工作并同时保留其自身(逐步执行并调用p(int)[$ […]

Tooploox Hackathon:Timeploox,用于时间跟踪的Slack机器人

在Tooploox,我们在时间和物质上与合作伙伴一起工作,因为该模型使我们能够完全采用敏捷开发方法。 多年来,我们尝试了各种开放源代码和商业工具,这些工具旨在减轻与日志记录时间相关的负担和总体开销,可视化进度并生成报告。 不幸的是,即使是我们目前所依赖的当前服务(Freshbooks)也无法满足我们的所有要求,例如易于访问,工作流程快速且使用起来很有趣。 在黑客马拉松开始之前,我们有很多想法如何解决整个Tooploox团队的痛苦。 最后,我们选择了一个非常适合我们日常工作的特定概念-一个完整的(即目标)时间跟踪和报告bot,用于我们的主要沟通工具Slack。 在我们进行开发的几个小时中,该机器人“学习”了如何以丰富的方式解释和响应从任何Slack通道发出的简单命令。 例如,要记录时间,可以发出/log命令: 作为回应,您会获得简短的记录时间摘要: 可以通过/log view命令在任何给定的时间点查看和删除条目: 结果是: 我们的团队还设法构建了一个配套的iOS应用程序,该应用程序至少在黑客马拉松的范围内,用于查看各种Slack用户记录的时间报告: 从技术角度来看,我们决定使用可快速开发和部署原型每次迭代的工具和平台。 在后端,我们使用了Node.js(ES6,Express.js,Mongoose),Heroku,MongoDB(通过附加组件)和Slack API,而移动应用程序是使用Storyboard进行Swift编写的(用于快速UI原型制作)很少有开源框架,例如Alamofire和Charts。 尽管有时会遇到颠簸,但为iOS应用程序和机器人本身构建API通常非常简单和有趣。 我们在MongoDB插件上遇到了问题,不得不在Slack部分处理一些奇怪的消息格式选择,例如在父JSON结构中编码为原始字符串的JSON内容。 由于黑客马拉松赛仅进行了两天,因此我们只需要为我们的iOS配套应用选择最重要的功能。 我们得出的结论是,使用此应用程序的主要目的是检查我们或我们的同事条目。 因此,在产品设计团队的帮助下,我们准备了用于摘要视图的设计,然后开始工作。 您可以在上面的屏幕截图中看到结果。 该视图非常简单,最困难的是日历视图,我们免费获得-我们使用了强大的FSCalendar控件。 最后但并非最不重要的是,团队。 我们很幸运,并设法组建了一支由产品设计师,全栈和iOS工程师组成的团队。 这意味着我们有足够的原始马力来解决我们想在合理时间内解决的难题。 就目前而言,该机器人为更大的事物奠定了良好的基础,并有望在不久后将其推向新的高度。 总而言之,一起破解项目并制定各种怪癖很有趣! 由Krzysztof Tarnowski和Karol Wieczorek撰写。

可编程逻辑控制器VH-10MR(2A继电器输出)

品牌 :活力 型号 :VH-10MR 可编程逻辑控制器(PLC)或可编程控制器是坚固耐用的工业数字计算机,适用于控制生产流程,例如组装线或机器人设备,或任何需要高可靠性控制且易于编程的活动和过程故障诊断。 它们最初是在汽车工业中开发的,旨在提供灵活,坚固耐用且易于编程的控制器来代替硬接线的继电器和计时器。 从那时起,它们就被广泛用作适用于恶劣环境的高可靠性自动化控制器。 PLC是“硬”实时系统的一个示例,因为必须在有限的时间内响应输入条件产生输出结果,否则将导致意外操作。 特点和规格: 输入类型: DC 24V电源输入 6点DC 24V信号输入 输出: 2A继电器输出/ 4点继电器输出 输入电压: 24V DC 有关更多信息,请访问我们的网站: www.autocon.biz 由Autocon Instruments发布

反应本地培训

Callstack.io 的 Nader Dabit 和 Mike Grabowski 专业的React Native研讨会和公司培训 。 今天,我们很高兴启动React Native Training。 毫无疑问,React Native在去年特别是在过去的几个月中确实起飞了。 尽管React Native一直是初创企业和中小型企业的可行选择,但我们现在看到越来越多的公司和企业公司正在研究和整合该技术,并使用该框架重写许多现有的本机应用程序。 在本机跨平台移动应用程序开发成本上升和效率下降的刺激下,React Native现在不仅是可行的选择,而且对于大多数用例而言,对于现实世界中的移动应用程序开发而言,它是成倍节省成本的方法。 随着受欢迎程度的提高,现有开发人员需要在尽可能短的时间内快速熟悉该框架。 像任何技术一样,没有比在该领域的顶尖人士上手进行培训更好的方法了,通常是几天之内就学会了数周或数月的时间。 我们将在北美和欧洲提供世界一流的前沿培训和课程材料,专门针对两件事:教室研讨会和现场公司培训。 如果您对我们来到您的城市感兴趣,请给我们发送电子邮件至info@reactnative.training或访问我们的网站reactnative.training。 如果您对专业的Web或移动应用程序开发或咨询感兴趣,请确保查看专门从事React和React Native开发的CallStack.io。 谢谢你的时间!

内部来源

这有什么不同? 在Impala Studios,我们从拥有共享维护权的两个团队待办事项到通常由模块化和微服务件组成的包含我们所有产品的单个待办事项。 您会看到我们的产品由应用程序,框架,第三方模块和后端服务组成。 每个模块都可以设置为特定产品。 例如,Alarm Clock HD的iOS应用程序内部具有Alarm Clock Framework。 它使用多个SDK和3rd Party模块在应用程序营销和新闻中显示广告,收集数据,并使用我们自己的气象服务来获取新气象。 在我们当前的设置中,整个应用都有一个监护人和一个产品负责人,但是没有一个模块具有特定的所有权。 基本上每个人都拥有内部维护的代码,没有人拥有由外部各方维护的代码。 由于集成产品由其每个模块(不断更新)的最新版本组成,因此创建了相当复杂的依赖关系集。 随着模块的更新,诸如App之类的集成产品将会崩溃。 我们通常也不知道有没有损坏,因为应用程序中的大多数集成都不受自动化测试的影响。 当前,查看已经存在于存储库中一段时间​​的App是否仍然有效的唯一方法是制作和测试当前版本,然后修复发现的内容。 借助Innersourcing,Alarm Clock HD将拥有一个“所有者”(即产品所有者),但是监护权现在将进入每个模块。 现在,团队将负责团队中具有监护人的所有模块。 每个人仍然可以更改这些模块,但是拥有该模块监护权的团队拥有最终批准权。 监护团队确保它使用自己的模块(例如Cocoapods)的依赖处理程序来制作其模块的新版本,然后可用于新版本。 从例子中学习 Google — 20亿行代码 使用内部外包的单个产品的最大示例可能是Google的实现。 Google的所有25,000名工程师都可以在一个存储库中访问几乎所有20亿行代码! 我们可以从Google中学到的东西: 他们将代码保存在团队拥有的“目录”中。 除目录外,任何开发人员都可以进行任何更改,您的更改必须经过所有者的批准。 分支-它们具有“基于主干”或“发布分支”的模型。 尽可能晚地制作master分支的快照,并在此基础上开发新功能。 如果主服务器上已更新了开发所需的内容,则可以将其“放入樱桃”到发行分支中(由于其大小,他们甚至没有选择与主分支保持同步)。 发布分支是生产的基础。 我们可以考虑使用GitLab Flow,当然也可以考虑使用CocoaPods冻结版本。 它们具有每次提交时运行的单元测试的代码覆盖率。 他们使用拉取请求和自动部署进行代码检查。 贝宝(Paypal)-开源和内部源之间的优势 有许多公司一直活跃在开源社区中,而不是从专有或内部源码,甚至是开源方面发生变化的公司。 Google和Facebook在开放源代码许可下拥有部分代码,Apache基金会和Ubuntu / Canonical拥有完全基于社区的软件。 Paypal是后来者,但自2014年初以来,他们在kraken.js项目上开始从Java过渡到JavaScript和Node.js时,就采用了Inner Source。 他们注意到,要为许多项目做出贡献,就必须采用一种新的工作方式。 一个重要的变化是迁移到GitHub和使用Git。 另一个是就质量标准达成共识,例如单元测试。 最后,他们注意到开放源代码贡献者的工作是分散的,而他们正在迁移到同一地点的团队。 面对面交流的缺点是,对于不了解该软件的人而言,没有文档记录,他们必须学习使用readme.txt,changelog.txt并在git中进行文明的在线公开讨论注释。 由于kraken.js是开源的,因此与外部贡献者的通信在某种程度上迫使了这一点。 O’Reilly上提供了对Paypal内源的深入了解。 […]

React Native —使用fetch()的陷阱

使用fetch()时,您是否曾经被卡住?由于某种原因,尝试从第三方API提取数据时会不断出错? 即使您按照该教程进行操作,您仍在按照作者编写的方式进行操作? 我最近陷入困境,直到2016年12月的某个时候才发现这不是问题。这就是我所发现的。 Apple默认为与iOS 9.0或OS X v10.11 SDK链接的应用程序启用应用程序传输安全性(ATS)。 在本机中,这些设置在ios / {您的项目名称}文件夹下的info.plist文件中。 0.28之前的react-native版本默认将info.plist中的命令默认为允许使用以下代码的非安全请求(即http): 上面的代码允许您的fetch()命令使用http或https uri。 但是,Apple宣布,在2016年12月之后,所有将此键的值设置为True的应用程序都会触发App Store的自动审核,并且需要证明其合理性。 请参阅此处的Apple ATS文档:https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33。 结果,react native更改了默认的info.plist代码以使其与Apple的ATS策略保持一致,并对该代码进行了结构化,以专门标识将允许进行非安全访问的每个域。 因此,现在info.plist中的默认代码如下所示: 该应用仅允许在没有安全连接的情况下访问localhost ,必须通过https访问所有其他域。 当您要访问未使用https提供服务的第三方API时,会出现问题。 为此,您必须在NSExceptionDomains下添加另一个。 例如,假设您的API位于testapi.com。 您需要打开info.plist并将其添加到异常域列表中,如下所示: 现在,您的应用应该停止引发安全错误,并且fetch()命令应该可以正常工作。 请记住,每当您的应用程序需要访问不使用安全连接的第三方URL时,请确保通过在info.plist文件中添加域来解决该问题。