Tag: ios

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)[$ […]

Charles Proxy-主管代理工具

作为软件开发人员,对不同数据集的代码进行单元测试非常重要。 我需要在运行时更改模型对象或更新服务器。 如果我做错了事,这两种方法都可能造成麻烦。 一旦从设备传递了请求,我们通常就没有太多的控制权,而每次在代码中使用不同的值对其进行更改都不是一件容易的事。 Charles Proxy,为我节省了时间,并帮助您处理许多请求和响应 。 术语“互联网”的兄弟姐妹 深入了解Charles代理有助于修改充当互联网兄弟姐妹的术语。 以下是关于此的小注释。 该注释将帮助您解决互联网上最常见的问题:“互联网如何工作?” 。 连接到互联网的所有内容都将具有IP地址 。 IP地址不是人类可读的格式,因此引入了域名 。 在DNS服务器中找到与该域名对应的IP地址,该服务器分为(1)递归解析器,(2)根名称服务器,(3)TLD(顶级域名)名称服务器和(4)权威名称服务器。 记住顺序,因为这是完成搜索相应IP地址的方式 。 路由器中的NDL (网络转换设备)将专用IP地址转换为公用IP地址 。 互联网中的信息以数据包的形式传递。 当数据包向目的地移动时,成千上万的路由器充当中间设备,并将自己的IP地址添加到数据包中。 一旦到达服务器并向后导航,路由器便会将其IP地址从数据包中解包。 什么是代理? 代理人,代表他人的权力。 代理服务器或软件充当端点设备和Internet之间的中介。 请求和响应通过代理传递,因此我们可以查看或记录设备的流量。 代理服务器还有助于缓存数据,阻止恶意流量。 这是阻止我们进入YouTube和Facebook的罪魁祸首。 由于它能够缓存数据,因此可以避免再次访问服务器。 安装 您可以从以下链接下载LINUX , Mac OS和Windows的代理: 下载Charles * Charles Web调试代理的免费试用版 Charles Web调试代理–官方网站 www.charlesproxy.com 查尔斯 代理软件在我们的系统中通过简单的UI和命令行工具运行。 查尔斯代理包含两种视图结构和顺序。 结构有助于分隔不同的主机URL,顺序有助于我们根据时间,持续时间,大小等确定每个呼叫的顺序。 Charles代理的有用功能: 如果要观看Charles代理的每个功能如何工作,可以直接单击此链接。 了解Charles代理的功能有什么好处? 一旦您了解了Charles,使用诸如Fiddler之类的其他代理软件就不会很复杂。 它节省了我的时间并帮助提高了生产率,我希望它能为您做同样的事情。 观察HTTP流量 一旦您在同一网络中连接了Charles代理和设备并在设备中更改了代理地址,Charles将显示通过它的每个请求和响应。 […]

如何下载和安装用于移动设备的Xfinity Home App

Xfinity以优惠的价格向客户提供Internet,语音,有线电视和家庭安全服务。 您可以轻松使用Comcast Xfinity的这些出色服务。 但是有时,这些高级Xfinity产品和服务也会遇到随时困扰您的问题。 这就是为什么我们在这里。 在下面的文章中,我们提到了有关如何下载和安装Xfinity家庭应用程序的一些方法和说明。 这将帮助您访问移动设备的所有安全功能。 阅读更多: 如何检查comcast电子邮件 Comcast Xfinity提供为用户提供便利的最佳服务。 Comcast商业客户服务处理有关Comcast Xfinity商业服务的服务质量和性能的所有查询和建议。 Xfinity客户服务中心也可为用户提供实时帮助。 下面提供了使用Home应用程序的独家指南,您可以按照说明享受无中断服务。 Xfinity的家庭应用程序可用于以下设备: iPhone,iPod,iPad touch。 平板电脑或Android手机。 iPhone,iPod,iPad设备入门- 通过搜索Xfinity Home App从您的Apple设备上的App Store下载该应用程序。 下载并安装。 点击确定。 (系统会提示您允许该应用添加联系人,发送消息,拨打电话,识别设备上的文字) 点击应用程序,然后在安装后输入您的用户名和密码。 所需设备: Xfinity的家庭订阅。 Xfinity密码和用户名(使用您的Comcast客户登录 ID和密码访问您的帐户) iOS 10 适用于iOS 10的设备: iPad Mini 2或更高 iPad 4或更高 第六代或更高版本的iPod touch 设置为24/7录制 阅读更多:文本代码使用Xfinity警报获取帐户更新 平板电脑或Android移动设备入门 转到Android设备上的Google Play商店,然后查找Xfinity Home应用。 或者,您可以通过单击此处下载应用程序。 在您的设备上下载并安装该应用。 点击“允许”(这将使Xfinity Home可以拨打电话,阅读和添加联系人,在闹钟关闭时发送消息以及从Home应用程序中识别重要的文本和消息。) 安装应用程序后,点击“应用程序图标”,然后使用Xfinity密码和用户名登录到您的帐户。 所需设备: […]

学习Swift和iOS开发第12部分:多态

在本文中,您将通过阅读有关多态的方法结束对面向对象编程的基础研究。 除了成为一个很酷的词外,多态性是成为程序员时要理解的一个非常重要的概念。 在开发人员求职面试中通常会被问到:“您能定义’多态性’吗?”我们将打破多态性的含义,含义以及它的实际方式,而不是像鹿一样大开眼界。在代码中播放。 什么是多态? 长期以来对多态性的编程定义是:“多态性允许表达某种合同,可能有许多类型以不同的方式实现该合同,每种类型均根据自己的目的。” 这可能只是教科书的定义,但是这里的基本概念是我们的代码可以以许多不同的形式出现,并且其功能可以以不同的方式实现。 这可能仍然令人困惑,没关系。 让我们构建一个代码示例,因为这样更容易理解多态。 创建一个新项目 首先,如果尚未打开Xcode,请点击Create New Playground 。 为其命名,如Polymorphism ,然后单击Next 。 选择某个位置以保存此.playground文件,然后单击“ Create以保存它。 您应该会看到类似下面的屏幕。 删除左侧的所有样板代码,但根据需要保留import UIKit 。 Creating a base Class with default functions 首先,我们将创建一个名为Shape的类,该类具有area属性和一个用于计算形状面积的函数。 将以下内容添加到您的游乐场: 类Shape { var区域:Double? func computeArea(valueA:Double,valueTwo:Double){ } } 我们的基类Shape包含了我们需要的一切-一个用于存储面积的变量和一个用于计算具有两个输入值的面积的函数。 让我们创建一个子类以继承Shape类。 为了证明多态性,我们需要做的是遵守Shape设置的“合约”,该合约具有一个calculateArea函数。 创建一个三角形子类 添加以下类,并覆盖Playground底部的函数calculateArea(valueA:valueB:) : 类Shape { var区域:Double? func computeArea(valueA:Double,valueB:Double){ } } 三角形:形状{ 覆写func computeArea(valueA:Double,valueB:Double){ 面积=(值A […]

越狱iOS 11快速指南—带有Electra的iOS 11.1.2

Electra越狱已经结束。 由于Cydia安装程序支持iOS 11软件版本,因此大多数iDevice用户已跳入Electra iOS 11越狱之旅。 这个处于测试阶段的越狱工具包存在很多问题。 但是,经过艰苦的工作和更多的研究人员,CoolStar可以针对iOS 11.1.2-11.0发布稳定的越狱。 似乎Saurik对此事件不满意,他已指出不要在您的iDevice上安装Electra越狱。 由于CoolStar使用了Substrate的替代方法,Saurik提到它不会采用Cydia下载的真实经验。 但是,我已经测试过Cydia iOS 11,并且看起来运行良好。 现在,由您决定是否选择iOS 11越狱。 无论如何,这是有关如何使用Electra越狱的快速指南。 如何使用iOS 11的Electra越狱-iOS 11.1.2 从此处下载Electra的最新版本。 从官方网站下载Cydia Impactor的最新更新。 打开Cydia Impactor,然后将iDevice连接到计算机。 Impactor将识别您的设备,然后将下载的Electra的IPA文件拖放到Impactor界面。 出现提示时输入有效的Apple ID和密码。 在设备上安装越狱应用程序后,导航至设置>常规>设备管理 。 选择相应的开发者资料并信任该应用。 从主屏幕打开Electra,然后点击“越狱”按钮。 然后,该应用将开始越狱并安装Cydia iOS 11。 该过程完成后,设备将重新弹出。 恭喜你! 您已经将Electra越狱的 iPhone,iPad或iPod touch设备越狱了 。 由于Cydia下载当前正在运行,因此您有权在iDevice上安装调整,主题,应用,游戏和更多内容。 注意 :通常,我不建议用户遵循越狱规则,因为这种机制可能存在一些问题。 因此,您有责任越狱iPhone,iPad,iPod touch。

为什么我们放弃传统的iOS网络

在开始讨论之前,我将先声明免责声明:这不是您的典型的I-a-a-fant-new-thing科技博客,具有非典型,晦涩的图案。 不,这是一篇有关采用常见的基本范式并将其应用于我们以前可能从未想到过的地方的文章,或者更准确地说,是在我们忘记了它们与之相关的地方。 软件产品往往会经历总结能力成熟度模型的相同阶段,转化为软件开发。 我们通常会坚持不懈地进行尝试并进行创新。 这是因为我们不想浪费时间和金钱来为尚未得到的答案过度设计解决方案。 我们希望将精力集中在发明新事物上,因此我们会避免为重新发明轮子做任何努力。 在我开发和制造的所有移动产品中,其中一个轮子始终存在: 网络。 在MINDBODY,我们已经维护和扩展了许多不同的移动产品超过四年。 同样,大多数软件产品具有相同的根源,我们的移动应用程序也不例外。 根据年龄的不同,每种产品在某种程度上都很大程度上依赖于许多人认为是事实上的开源网络库: AF网络 Alamofire MKNetworkKit 这些功能强大且受社区支持的第三方可解决任何Cocoa开发人员的大部分联网问题-Cocoa HTTP库的全地形轮胎。 但是,我们是一家企业,以此类推完整的圆圈,不能在Peterbilt上打一堆全地形轮胎并且期望行驶很远。 多年来,我们一直在不断改进这些常见要求: 将具有不同范例和传输格式的多个API整合到一个网络会话中的能力。 在单个会话中应用不同级别的授权和其他一次性装饰的能力。 具有满足以上两个要求的具有不同主机/客户端配置的多个会话的能力。 最重要的是,我们渴望拥有SOLID基础。 建立一个全新的网络层听起来很昂贵,冒险且彻头彻尾,这在很大程度上缩小了故障间隔。 最终,这意味着我们需要从以下两个问题的明确答案入手: 我们如何设计新车轮,以及如何将东西砸在行驶的汽车上? 设计车轮 曾经有人告诉我,“只有在第三次失败之后,新架构才能成功。”作为坚定地支持这一说法的人,我将转变话题,并略谈一下Node.js。 为什么选择Node.js? 不,我不会开始赞扬JavaScript及其动态的,松散类型的,嵌套回调的荣耀。 Node.js如此流行的原因是容易和简单,通常要付出代价。 但是在某些情况下,语言和平台为出色的模式提供了基础。 在我们的案例中,我们决定招待Express.js及其中间件模式的实现。 没有花哨的全局请求管理器到处都是路由规则,序列化模式,全局请求标头,过于简化的嵌入式授权机制,缓存策略等; 没有请求操作会承担太多责任,无法尝试使摆锤向模块化方向摆动太远; 无需花三个小时阅读有关所有工作原理的文档。 网络管道架构 当简化为体系结构时,我们发现针对任何给定请求有四个主要参与者: 管道 中间件的集合 请求 响应 在我们的Swift实现中, 会话与请求管道同义。 管道中显示的任何更改或全局行为将影响该会话内的所有请求。 会话客户端使用提供的URLSessionConfiguration管理单个管道,并且它直接接受URLRequests作为输入。 这意味着,网络架构是Apple网络库之上非常薄的一层 。 客户端只是简单地通过串行队列来收集请求,通过提供的中间件链来处理它们(每个请求可以不同),最后将它们传输到URLSession。 这满足了我们的第一个要求。 中间件范式 中间件组件具有基于具体实现的职责范围,但是它们都可以做三件事: 修改请求 冻结/清空输出管道 用错误使响应短路 中间件被定义为一个简单的协议,并且可以从任何地方定义和注入自定义中间件。 […]

未经App Review批准,开发人员无法再编辑App Store描述

一夜之间,开发人员注意到iTunes Connect接口的一项无提示政策更改,Apple似乎尚未正式宣布。 开发人员无法在不制作新版本的情况下编辑其应用程序的描述,更新注释或任何其他元数据,而必须将其提交给App Review批准…… 在今天之前,开发人员可以随时更改其App Store列表的几个属性。 这包括编辑描述文本,更改“新增功能”更新说明。 现在页面上唯一可编辑的字段是隐私策略URL。 这意味着开发人员现在必须创建一个新的应用程序版本,更改元数据,然后将该应用程序提交批准。 然后,他们必须等待App Review才能使更改生效。 查看更多:https://solutionanalystsblog.wordpress.com/2017/03/10/developers-can-no-long-edit-app-store-descriptions-without-app-review-approval/

纸牌硬vs纸牌简易iPhone游戏

你喜欢纸牌游戏! 这些是最好的2游戏,具有新的接龙游戏概念。 一种游戏可以轻松获胜,而另一种则需要一些时间才能获胜。 Solitaire Easy –永远赢:在App Store上的内容 阅读评论,比较客户评分,查看屏幕截图,并了解有关Solitaire Easy – Always Win的更多信息。 下载… itunes.apple.com 纸牌硬–纸牌:在App Store上的内容 阅读评论,比较客户评价,查看屏幕截图,并了解有关Solitaire Hard – Play Cards的更多信息。 下载… itunes.apple.com 两种游戏均可从App Store免费安装到iPhone中。 在2017年的前一年,它每年的下载量超过1万。 让我们看看它的一些功能和差异。 差异 : Solitaire Easy游戏允许您将扑克牌拖放到任何色卡上。 例如,您也可以将钻石卡和十字色卡一起拖到心形卡上。 因此,这里没有颜色限制拖放扑克牌。 另一方面,在Solitiare Hard游戏中,您在玩游戏时必须注意交叉色卡规则。 这两个应用程序共有的功能如下: 它会计算总移动次数并存储时间,因此您可以衡量自己的表现 它允许您撤消最后一步。 您可以随时重新启动游戏。 您可以将您的获胜职位分享给任何社交媒体或应用程序。 您可以更改一堆图像的背景 您也可以根据需要更改卡的背面。 漂亮又酷的设计:

今日扩展:得分小部件

分数小部件是可重用的组件,可用于通过“今日扩展”显示任何游戏的分数和其他详细信息。 使用Today Extension扩展您的容器应用程序,即使您的手机被锁定,也可以让用户参与其中。 让我们看看如何使用这个很酷的小部件。 首先从下面提到的GitHub存储库下载ScoreWidget的zip文件。 pallavtrivedi03 / TodayExtension-ScoreWidget TodayExtension-ScoreWidget –可重用的代码片段,用于使用Today Extension扩展iOS应用。 github.com 在项目中导入分数小部件文件 为您的Xcode项目添加一个新目标(即今天的扩展),并导入Score Widget文件。 只需解压缩ScoreWidget.zip,然后将解压缩的文件夹放在目标层次结构下。 注意:添加文件时,请确保选择“如果需要,请复制”,然后选择扩展名作为目标。 添加分数小部件视图 将Today Extension目标添加到项目后,XCode会自动生成TodayViewController.swift和MainInterface.storyboard。 转到MainInterface.storyboard并从TodayViewControllerScene中删除Label。 我们不需要XLabel,因为我们拥有用于得分小部件视图的XIB。 接下来,我们需要将XIB作为子视图添加到TodayViewControllerScene。 为此,将以下内容添加为TodayViewController类的第一行。 var scoreWidgetView:ScoreWidgetView? 实例化声明的变量,并使用以下代码添加为子视图。 scoreWidgetView = ScoreWidgetView()。loadNib()为? ScoreWidgetView scoreWidgetView?.frame = self.view.frame self.view.addSubview(scoreWidgetView!) 这就是您的viewDidLoad()的外观。 我们完成了实例化自定义视图并将其添加为子视图的操作。 现在,让我们在“显示更多/显示更少”按钮上处理视图的放大和缩小。 处理视图的扩大和缩小 要添加“显示更多/显示更少”按钮,请在viewDidLoad中添加以下几行。 如果#available(iOSApplicationExtension 10.0,*) { extensionContext?.widgetLargestAvailableDisplayMode = .expanded }其他 { //早期版本的后备 } “ widgetLargestAvailableDisplayMode”的值决定是否可以扩展窗口小部件。 现在,您的viewDidLoad()应该看起来像 添加以上行将在我们的小部件上启用“显示更多”按钮。 接下来,当用户点击“显示更多”按钮时,我们需要处理扩展和收缩。 […]

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撰写。