Tag: ios

CocoaTouch:框架和边界

用户界面是应用程序开发中最重要的部分之一。 我们的工作是创造出色的用户体验,以与其他应用程序脱颖而出。 但是,让我们先深入基础知识。 对于UI组件,我们必须考虑两件事: 我的元素有多大? 应该放在哪里? 我的元素有多大? 您必须考虑UI元素的宽度和高度 。 Core Graphics为该用例提供了一个结构。 CGSize结构{ CGFloat宽度; CGFloat高度; }; 应该放在哪里? UI元素使用坐标系定位。 这开始于(在iOS中)屏幕的左上角。 用CGPoint结构指定位置。 CGPoint结构体{ CGFloat x; CGFloat y; }; 两者在一起 现在我们有了大小和位置。 两者结合形成一个“矩形”。 还有一个同时包含信息的结构,称为CGRect 。 struct CGRect { CGPoint起源; CGSize大小; }; 仔细研究源代码,我们将看到矩形是一个包含已知结构(CGSize和CGPoint)的结构 。 帧 让我们创建一个新的UIView。 将矩形(大小和位置)指定为CGRect并将其作为参数传递给构造函数。 let rect = CGRect(x: 70, y: 70, width: 160, height: 100) let myView = […]

与技术女士的三个问题:Tinybop产品负责人Youngna Park

艾莉森·格林伯格·福恩斯的访谈 您是Tinybop产品负责人。 您能告诉我们更多关于公司以及您从事的工作吗? Tinybop为孩子们制作教育性的iOS应用程序。 他们旨在鼓励孩子们对周围的世界更加好奇-提出问题,想知道为什么? 如何? 并成为发明家和讲故事的人。 我们有两个不断增长的应用程序系列:资源管理器的图书馆和数字玩具。 Explorer的Library应用程序向孩子们介绍了通用的大型主题,例如The Human Body,Simple Machines,Weather和Skyscrapers。 Digital Toys应用程序使孩子们能够构建和测试不同的作品; 在Infinite Arcade中拥有自己的视频游戏,在The Monsters中拥有可怕的怪物,在The Robot Factory中获得了机器人,这是2015年度iPad应用程序。 现在,我们推出了11个应用程序,今年还将发布另外两个应用程序。 自Tinybop成立(2012年)以来,我一直领导并壮大产品团队,现在从事产品工作并监督日常运营。 在产品方面,这意味着要弄清楚我们的产品路线图(我们计划在明年扩展到Android并开发以学校为中心的产品),确保我们所有的项目都有适当的资源,弄清楚并向其传达产品战略。团队,并作为产品团队与设计,工程,市场营销,研究等之间的接触点,以确保我们位于同一页面上,并且所有产品在外观和感觉上都确实像Tinybop产品。 公司发展了很多。 对于正在成长的团队或正在迅速成长的团队成员的其他Tech Ladies,关于如何负责任地进行扩展,您可以提供一些建议吗? 缩放是如此艰难! 周围没有捷径。 在Tinybop,我们已经或正在做的一些事情: 保持对不断变化的流程的开放态度:作为一个团队,我们对流程本身非常迭代。 无论是决定使用哪种工具(Trello,Asana和Pivotal)还是如何召开概念会议,我们都对它是否有效持诚实态度。 从项目到项目,我鼓励我的团队问:“这项工作成功了吗? 如果是后者,我鼓励他们下次尝试并尝试一种更好的方法。 文档资料:我们最近雇用了几位新产品经理,我意识到在公司工作了很长时间的一些人中积累了多少信息。 我认为,向人们提供有关流程和产品的历史记录,策略和文档,以使他们有权制定决策并采取行动,这一点非常重要。 我们的产品团队目前正在处理大型产品入门文档,该文档涵盖了开发的所有主要阶段,产品价值,策略以及我们发布的每个应用程序。 不要只关注招聘,而要考虑内部增长:当您扩大团队规模并扩大流程时,我认为有一种趋势正在思考新员工如何解决您所有的增长问题。 但是,我认为重要的是要退后一步,了解团队中的技能,并确保您正在考虑团队中现有人员的成长空间。 许多人需要被授权去做最好的工作。 我们最近与所有人一起制定了职业发展计划,我学到了很多人想要努力的目标,而不仅仅是他们目前的工作。 Tinybop致力于激发儿童的好奇心。 如果您可以给年轻的自己一个建议,那会是什么? 哈! 我的年轻自我会从很多建议中受益。 我是一个认真认真的超级书呆子。 我会告诉自己放松一点,打破规则。 我太专注于适应和取得好成绩。 最好的事情来自有点奇怪。

编写一次-在整个项目中随处使用,无条件-无修改

视力: 更少的代码,更少的错误,更少的测试用例 任务: 通过在极端情况下减少每种情况下的项目代码,减少错误的可能性并提高可伸缩性。 挑战是什么? 您是否曾经考虑过为整个项目只编​​写一次表视图委托和数据源? 一旦您完成了在一个位置编写代码的工作,即实现数据源和创建表视图的委托方法,就不需要在整个项目中实现数据源和表视图的委托的视图控制器,就必须在一个位置编写仅放置一次并使用很多次,当您将使用不同的单元设计开发新的屏幕时,不需要任何条件或修改。 您的可重用代码也必须可在其他项目中使用,而无需任何修改或条件。 您的解决方案必须是框架级别的解决方案,而不是项目级别的解决方案。 您无需在此处创建框架,但我的上下文是,您不能限制用户使用他/她自己的现有基类(如果他/她已经在项目中),例如UIViewController和UITabelViewCell的基类。 您不得限制用户访问Apple的UIKit提供的API来创建表视图或表视图单元格,应允许用户使用纯代码或XIB或情节提要创建表视图或单元格。 用户-正在使用您的可重用组件的用户 在常规编码中,每当在视图控制器中确认UITableViewDatasource时,编译器都会要求您提供两个必需的方法cellForRowAtIndexPath: 和 numberOfRowsInSection: 如果您错过了这两种方法中的任何一种,则会出现编译时错误。 您的可重用组件必须允许用户在需要时无限制地在view controller手动编写委托和数据源方法。 这意味着如果用户只想编写cellForRowAtIndexPath: 具有自定义逻辑且未实现numberOfRowsInSection:如果用户想要在cellForRowAtIndexPath:自定义逻辑,则该方法必须起作用cellForRowAtIndexPath: 只要。 同样,所有UITableViewDelegate方法也是如此。 不允许使用闭包或块或obj-c运行时 , 它只能通过委托模式来实现。 开始考虑挑战。 如何参加这项挑战? 推动自我,学习新事物并成为赢家。 1.只需填写此Google表单: https : //goo.gl/forms/zj2YrQu3H1LTbEKw2 2.为您的解决方案提供适当的步骤或Readme.md,因此我可以通过创建新的视图控制器,新的单元格和新的数据模型或字典来测试您的组件,从而对其进行测试。 3.解决方案提交: https : //goo.gl/forms/RIgCO1EAqmHgPGPN2 优胜者的奖金是多少? 获奖者将获得151.00 USD的奖金。 可能会增加到200.00 USD或更多,具体取决于参与者和获胜者的总数。 如果将有不止一名获奖者,我将按获奖者人数分配奖金。 如果有两名获胜者,则奖金为151.00美元 ,则每位获胜者将为151/2美元或更多 。 获奖者将如何获得奖金? 贝宝 UPI付款 Paytm | 免费|电话支付| G Pay(Google pay)应用 […]

在Bitrise上为Cordova和Ionic项目引入自动预配置

现在,可以在 Bitrise 上分离Cordova和Ionic项目的准备阶段和构建阶段 ,因此您也可以对这些项目类型使用iOS Auto Provision步骤。 -! 我们最近发布了iOS自动配置步骤,该步骤可管理Xcode项目的iOS配置配置文件。 该步骤使iOS的代码签名更加容易:您只需上传iOS开发和发行证书,该步骤将处理Provisioning Profiles。 该步骤分析iOS Xcode项目(或工作区),以确定签署该项目需要哪些Provisioning Profiles。 Cordova和Ionic的构建步骤(Cordova存档和Ionic存档)使用Cordova和Ionic CLI生成本机项目(通过调用platform rm和platform add命令)并进行构建(通过调用build命令)。 与在工作流中运行Cordova archive和Ionic archive步骤之前一样,本机iOS Xcode项目不存在,因此自动配置功能不适用于这些项目类型。 为了让您的生活更轻松,我们进行了一些更改以使其正常运行: 1.分开的Cordova / Ionic项目的准备和构建阶段 Ionic和Cordova存档步骤都有输入: Should remove platforms as prepare step? ,它控制是否应在构建阶段之前删除并重新添加本机平台。 通过将此输入设置为false ,该步骤将不会触摸生成的本机项目。 2.为Cordova / Ionic项目的准备阶段创建了新步骤 我们在构建步骤中关闭了平台删除功能,但是我们还必须注意准备过程。 从现在开始,您可以使用: 和 脚步。 新的准备步骤可以通过调用platform rm和platform add命令从您的Cordova和Ionic项目生成本机项目。 3.更新了 iOS Auto Provision 步骤 最新步骤版本(1.1.2)导出 项目的开发团队 已安装的代码签名标识的名称 已安装的配置文件 这些输出可用于提供“ […]

WSJ iOS团队如何通过OKR驱动的功能请求促进跨团队协作

今年早些时候,《华尔街日报收入》团队的一些同事发现了一个完美的工具来帮助他们加大广告工作,但是他们需要WSJ iOS团队(我的团队)来实现该工具的软件开发套件(SDK)。 尽管这似乎是一个简单的请求,但我们很快发现了多个危险信号,其中包括由于SDK庞大而可能对WSJ应用造成巨大性能影响。 在我们的团队之间经过三个多月的反复交流之后,我们得出结论认为SDK不必全部实现。 我们仅需要SDK中包含的一项非常基本的功能。 两个团队都对结果感到满意,但是花了不必要的时间才能达到这个简单的解决方案。 当我们享受合作的广泛时,我们的团队想知道这个古老的问题: “我们如何更快地获得相同的结果?” 为了改善跨团队的协作,《华尔街日报》的产品,设计和工程(PDE)小组一直在实施“ 目标和关键结果 (OKR)”,这是一种流行的方法,鼓励个人设定可衡量的,面向团队的目标设定目标,支持团队目标,最终帮助推动公司目标。 为了给这些PDE OKR的规模提供一些背景信息,以下是《华尔街日报》上整个​​PDE组的示意图。 尽管事实证明OKR在整体PDE方面非常成功,但仍缺乏对功能级别的转换。 我和我的团队认识到了收入团队的要求的意图,但并没有完全理解其价值或重要性。 意识到缺乏对功能级别细节的关注,我的团队开始尝试在产品级别上使用OKR进行功能请求。 从那时起,我们已经看到了一些奇妙的好处,包括更好的团队之间的协作,更轻松地确定功能请求的优先级以及经过更好的功能审查。 现在,当另一个团队希望就某个功能进行协作时,我们要求该团队的产品负责人将请求与PDE级别的OKR以及具体请求的客观和预期关键结果以及如何进行度量保持一致。 通过解决以下问题: 团队确保他们正在考虑部门级别的目标 涉及功能请求的每个人(从工程,设计到产品)都了解为什么要通过已定义的预期结果来实现该功能 所有PDE都可以更好地集思广益,以达到相同的结果 还不清楚吗? 让我们看一个假设的场景:产品负责人要求WSJ iOS团队提供一项特定功能,即“添加一个新的介绍性视频,以显示通知在应用程序中的位置。”我们的模板如下所示: 功能要求:添加新的介绍性视频,以显示通知在应用程序中的位置。 PDE目标:使读者体验引人入胜。 PDE关键结果:到第三季度末,将至少具有一个针对iOS或Android应用程序的通知警报的读者数量从10,000个增加到12,000个。 功能目标:鼓励读者注册他们关心的通知。 功能关键结果: 在第三季度末,将至少已为WSJ iOS应用程序打开一个通知的读者数量从5,000个增加到6,000个 将第三季度访问通知设置的读者数量从10,000个增加到12,000个 将第三季度请求通知的客户服务票证数量从200减少到100。 当我们将这些由OKR驱动的功能请求带给更广泛的团队时,就会展开美好的协作。 设计师可能会说:“如果我们想让更多的读者进入通知部分,这将有助于将图标更新为更加醒目和直观的方式。”然后工程师可能会大声说:“因为我们要针对特定​​读者,我们可以使该应用再次向那些没有通知的读者显示入职通知屏幕。” 通过促进OKR驱动的功能请求,我们开始鼓励采用不同的观点,以便团队协作地考虑请求的基础价值,而不只是请求本身。 功能请求的讨论变得简洁明了,指向“把功能请求扔在篱笆上等待其完成”的心态已过时。 我们计划继续迭代此方法,以便将来使跨团队协作更好。

iOS 11.3 Cydia背后的越狱下载

超过70%的Apple iDevice用户急切地等待着下一个最大的固件版本,即具有令人难以置信的新功能的iOS 11.3。 其中一些是ARKit 1.5,它支持更多曲面,电池运行状况,Airplay 2,四个新的Animoji,并且还有一些其他重要功能要发布。 苹果最近发布了iOS 11.3的第六个Beta版本,其中包含其他错误修复和改进功能。 拥有iOS 11.3的称号的越狱社区中的大多数成员都在寻找一种方法,甚至可以在iOS 11.3 Cydia发布之前在其设备上安装它。 它显示了Cydia下载到越狱者中的重要性。 您如何看待越狱并在11.3更新中下载Cydia? 请看一下本文。 iOS 11.3 Cydia在iPhone,iPad,iPod上下载 我们可以越狱iOS 11.3吗? 绝对不能。如果您当前正在使用与iOS 11兼容的iDevice,那么您应该知道11.3更新将在几天之内发布给iDevice。 在这种情况下,直到iOS 11.3正式发布,才有适当的越狱行为。 大多数iOS黑客和越狱开发人员都在寻找Beta软件程序中的漏洞和漏洞,但Apple会在正式版本中予以纠正。 这就是越狱社区无法在Beta更新中下载Cydia的原因。 iOS 11.3越狱何时发布? 目前,尚无法记录有关iOS 11.3 Cydia下载的日期,因为我们仍在搜索中,但无法获得有关该事实的任何积极线索。 阿里巴巴潘多拉实验室的一组研究人员已经在iPhone X上越狱了iOS 11.2.1,但他们已经注意到它不会向公众开放。 但是,这是iOS 11.2的更新,但不久后会有机会越狱并在我们的iDevices上下载iOS 11.3。

使用CMPedometer的iWatch准确计算步数

Apple Watch Series 3具有大量传感器,处理速度显着提高,这使其成为功能强大的机器,可以比以前的Watch版本更好地跟踪和评估您的健身数据。 我最近正在研究计步器类型应用程序的实现,在该应用程序中,我必须准确确定iWatch用户采取的步骤。 对于此用例,我决定使用Core Motion框架的CMPedometer。 CMPedometer基本上让您跟踪: 步数 行驶距离 根据爬了多少楼梯的楼层数 你走多快或多慢 iWatch跟踪此信息的方式是通过消耗iPhone中集成的加速度计,陀螺仪,磁力计和指南针生成的数据。 CMPedometer是Core Motion框架的一部分,该框架使您可以访问iPhone 5S及更高版本上的内置运动处理器。 它可以处理从集成的加速度计,陀螺仪,磁力计和气压计生成数据(尽管iPhone 6提供了气压计)。 iWatch处理器始终跟踪此数据并临时存储以供使用。 请务必注意,Core Motion只能在任何时间存储当前的7天时间段。 开发健身应用程序的任何人都可以使用Core Motion来同时使用iPhone和iWatch测量运动类型。 除了跑步,散步和骑自行车等常见活动外,iWatch还可以帮助跟踪众多其他户外运动。 CMP计 为了获取步数和有关行进距离的其他详细信息,我使用了计步器对象。 可以使用计步器对象查询历史数据的缓存信息。 除此之外,同一个对象使我们能够在处理数据时获取实时信息。 您可以使用计步器实例来调用以下类型的方法。 使用queryPedometerData(from:to:withHandler:)获取历史数据 使用startUpdates(from:withHandler:)放置观察者实时更新 让我们开始一个演示计算步骤,距离和楼层数(爬楼梯)的演示。 但是,让我们先谈谈隐私! CMPedometer更具体地使用了Apple认为私有数据的几种动作 。 在计步器上,您还将使用位置数据,因此隐私是一个更大的问题。 开发人员需要在info.plist中添加密钥NSMotionUsageDescription来征求用户的许可。 您可以在plist中添加密钥,如下所示: 步骤1:导入Core Motion 您需要先导入核心运动才能使用CMPedometer。 //导入CoreMotion 导入CoreMotion 步骤#2:创建CMPedometer的实例 让我们创建CMPedometer实例并需要变量 // MARK:-变量 fileprivate let计步器= CMPedometer() fileprivate var startDate:日期? =无 fileprivate […]

NSUserDefaults与CoreData

创建应用程序中最重要的方面之一是利用数据,但是在某些情况下,您的Internet连接可能不可用,因此使您的应用程序无用。 某种程度的数据持久性至关重要,这意味着我们可以在离线使用应用程序时存储数据。 有一些保留数据的方法,但是我要讨论的两种是NSUserDefaults和CoreData。 我想简要说明每种数据持久性选项的优缺点。 NSUserDefaults 这是使用键值对在没有数据库的情况下存储数据的最简单方法。 这种方法是存储少量数据的理想方法。 在大多数情况下,最好使用NSUserDefaults保存用户的设置和非关键数据。 NSUserDefaults支持以下类型: NSString NS编号 NSDate NSDictionary NSData 优点 相对容易存储和检索数据 非常适合存储小尺寸数据(例如:用户设置) 易于学习和实施 缺点 不适合存储大量数据 存储大量数据时性能会下降 不适合存储敏感数据 核心数据 一个允许无需实际使用数据库即可持久存储数据的框架。 该框架类似于使用SQLite中的关系数据库。 优点 可以存储大量数据(手机上的内存越多,可以存储的数据就越多) 如果关系模型设置正确,可以非常快 能够更改对象本身而不更改整个数据库 缺点 学习困难 需要有效的数据结构和架构设计 迁移数据可能很困难

如何分割字符串— Swift 3.0

当我尝试通过使用for-in循环遍历字符串来拆分字符串时,不断出现以下错误: 尽管此错误告诉我,与数组不同,无法使用for-in循环拆分字符串,但它未提供有关如何修复错误的指导。 自然,我从Stackoverflow寻求帮助。 在下面,您将找到我搜索的结果:两种分割字符串的方法……。 选项1:在要拆分的字符串的末尾添加.characters 。 在下面的示例中,循环遍历字符串,并逐个字符(包括空格)对其进行拆分。 最终结果: 正如您在左侧看到的那样,使用.characters可以拆分字符串中的单词以及每个单词中的字母。 根据最终目标,返回字符串中每个单词的每个字符可能会造成一些混乱。 但是,当您想更改字符串中的每个字符时,使用.characters拆分字符串很有用。 在下面的示例中,我使用.characters将stringOfWords中的每个字符(包括空格)替换为图像(“🦄”)。 最终结果: 选项2:使用components(separatedBy 🙂创建一个数组,其中包含要拆分的字符串中的每个单词。 在下面的示例中,字符串中的每个单词都分成一个数组,然后可以使用for-in循环进行迭代。 最终结果: 当目标是以相同方式更改字符串中的每个项目(或本例中的单词)时,此选项很有用。 例如,在下面的示例中,我使用components(separatedBy 🙂将stringOfWordsArray中的每个单词更改为Pig Latin。 我不希望每个字符都发生变化,而是希望每个单词在每次迭代过程中都以相同的方式进行更改(将原始单词的第一个字母移动到单词的末尾并添加“ ay”)。 最终结果: 在决定使用.characters还是component(separatedBy :)时 ,问自己“为什么拆分字符串? 我的最终目标是要更改/使用字符串中的每个字符 ,还是要更改/使用字符串中的每个单词 ?”如果答案是前者,则应使用.characters 。 相反,如果是后者,则可以使用components(separatedBy 🙂 。 以下有用的链接…。 components(separatedBy 🙂 — Stackoverflow 获取字符串的第n个字符-Stackoverflow 字符串和字符概述-Apple的Swift编程语言(Swift 3)

具有Cocoa键值观察器的简单iOS MVVM

为什么使用MVVM 与使用MVC相比,使用MVVM体系结构构建iOS应用程序具有许多优势。 优势之一是通过将模型和视图分离到单独的MVVM对象来减少Massive View Controller问题,View Controller的职责是仅在ViewModel中 观察与视图相关的值,然后在值更改时更新视图。 这导致View Controller与模型之间的耦合较少 。 单元测试变得更加容易,因为我们可以将ViewModel与View Controller分开进行测试。 iOS应用中MVVM的当前状态 许多使用MVVM架构构建的iOS应用程序都使用第三方库(例如RxSwift和RxCocoa)来观察视图模型对视图控制器的更改。 RxSwift是一个非常强大的库,我们可以将其转换观察器与组合,合并,zip和许多其他强大的转换一起使用。 尽管RxSwift功能非常强大,但有时我们只想使用本机Cocoa Foundation框架构建没有第三方依赖性的简单小型应用程序。 使用不依赖第三方的MVVM Apple Foundation Framework提供了任何可用于在iOS体系结构中构建MVVM应用程序的内置解决方案吗? 是的,答案是Cocoa Key Value Observing 。 KVO是观察者模式 ,可用于观察以NSObject作为其超类的对象中的属性更改的值。 可可KVO是一种非常强大的机制,可用于在iOS中构建基于MVVM的体系结构。 缺点是语法使用起来非常冗长,我们必须手动保留和删除观察者, RxSwift提供了addToDisposeBag方法,该方法可用于自动删除观察者 。 实施KVO以构建基于iOS MVVM的应用 这是示例iOS应用程序,当用户在TextField中键入内容时,该应用程序实现了KVO以构建简单的电子邮件验证。 该应用程序分为3个主要组成部分: ViewController是一个UITableViewController ,它显示UITextField来输入电子邮件,而UILabel来显示电子邮件是否有效。 EmailModel是一个普通的Swift类 ,用于存储电子邮件的字符串和表示电子邮件是否有效的布尔值。 EmailViewModel是一个Cocoa NSObject超类,它提供了将显示电子邮件文本以及它是否为有效电子邮件格式的属性。 电子邮件模型 EmailModel存储电子邮件的值文本和表示电子邮件是否有效的isValid布尔值。 值更改时使用Swift属性观察器,使用包含有具有新值的userInfo的NotificationCenter来发布带有EmailModel.TextDidChange的Notification ,它还通过调用validateEmail来 设置isValid的值 ,并将电子邮件文本的newValue传递为使用RegEx表达式评估。 isValid布尔值中的更改也通过NotificationCenter发布。 EmailViewModel EmailViewModel是基于NSObject超类的MVVM , 该类接受EmailModel作为其构造函数。 它提供了使用objc动态关键字的 emailTextValue和isValidValue, […]