改进的ATS日志

当明文HTTP负载潜入您的应用程序时(您不允许进行繁重的负载吗?),iOS和macOS上的网络库CFNetwork会为您提供以下良好的控制台消息: 2017–08–27 14:08:11.589 MyApp [24489:5654631]应用传输安全性由于不安全,因此阻止了明文HTTP(http://)资源加载。 可以通过应用程序的Info.plist文件配置临时异常。 有用,但仅显示一次,并且不会告诉您该URL是什么。 我们可以通过使用未记录的UserDefaults键: com.apple.cfnetwork.ats.loglevel到2来使它更有用。 2017-08-27 14:09:31.125 MyApp [24508:5688634] ATS政策阻止了http://www.google.com/的加载。 现在,它会在每次阻止负载时记录日志,其中包括URL。 设置此键的最简单方法是编辑方案(⌘<),并将一个项目添加到“运行时在启动时传递的参数”中。 请记住,作为参数传递的UserDefaults的语法是-key -key value 。 输入-com.apple.cfnetwork.ats.loglevel 2如下所示: 请记住,此密钥未记录。 我发现它比默认的日志消息更有用,而比完整的CFNetwork诊断日志更不那么冗长,更易于使用。

Yap数据库简介

如果语法一开始看起来很奇怪,请不要紧张,我们将逐一逐一讨论。 让我们一次分解每个块。 首先,有一个分组块,确定要在视图中包括哪些对象。 需要注意的重要一点是,在初始化视图时,将对数据库中的每个对象以及由写入事务添加或修改的每个对象运行此方法。 从图书馆的例子来看,这类似于W太太第一次编译书籍清单时以及她检查图书馆中每个新添加的内容以查看其是否满足任何现有清单的标准时。 现在我们有了分组块背后的想法,让我们看一下代码本身。 首先,注意参数列表中省略的参数(即参数名称的“ _”空格)。 这些省略的参数提供了有关传递到块中的对象的更多信息,例如其集合和键值。 但是,我们通常只检查对象以确定是否应将其包括在视图中。 (更多信息可以在这里找到) 一旦确定对象是否应包含在视图中,我们将以字符串形式返回要为其分配对象的组的名称 。 在这种情况下,guard语句会验证我们的输入。 在将对象添加到组之前,我们需要确保它是一本书。 如果验证失败,我们将返回nil并且该对象将不会分配给任何列表。 如果通过,则返回title的第一个字符 。 为什么要这个值? 请记住,我们正在返回要将对象分配给的组的名称,因此我们将在“ 两个城市的故事 ”中返回“ A”。 排序块是创建视图的第二个组件。 在图书馆的例子中,这相当于W夫人问如何对已编译的书籍清单进行排序。 排序方法与典型的比较方法非常相似:参数是组中的两个任意对象,返回类型是NSComparisonResult,表明我们希望如何对它们进行排序。 再一次,在最初编译列表时以及在每次向数据库进行新的写入事务时都将运行此逻辑,因此可以确保始终对列表进行正确排序。 我们创建的视图如何将数据转换为tableView? 简单:我们使用了一个漂亮的工具,称为mappings 。 如果您考虑上面的图像,我们的视图已经被填充和排序,因此tableView已经为我们构造了很多。 现在,我们只需要将每个组映射到其关联的UITableView部分。 (注意:这对于collectionViews同样适用。) 我们可以使用两种策略将每个组映射到其关联的tableView部分。 首先,我们可以静态声明映射及其顺序。 但是,这种策略非常脆弱,特别是因为如果没有任何以该字母开头的书,我们可能无法查看字母表中的每个字母。 相反,有一种更好的策略,即动态声明映射。 本质上,我们希望找到一种方法来告诉Yap映射中包括哪些组以及应如何对映射进行排序。 听起来有点熟? 这正是我们在早先需要确定应包含在视图中的内容时使用的分组和排序块。 我们在这里使用相同的策略来确定如何将组映射到tableView节。

现代MVC

当iPhone仅是第三部时,我在Apple Developer门户上有关iOS编程的第一篇教程的开头看到了此图: (仍然存在类似的文章,并且图表在那里:Cocoa核心能力。模型-视图-控制器) 该图展示了基本的iOS体系结构模式MVC 。 10年前,我以一种非常简单的方式理解了该图: UIView,UIScrollView或UITableView是该图上的视图 。 作为开发人员,我将它们安排在Interface Builder中的一个场景上,并将它们与我的源代码(在视图控制器中定义的出口和动作)绑定在一起。 最后一个正是MVC图中的控制器 。 我的应用程序将用户数据存储在例如文本文件中,或者在更复杂的情况下通过Core Data存储。 图表中的模型是允许访问此数据的类。 要添加的另一件事: 模型中没有业务逻辑代码,该模型不与视图通信。 视图控制器负责创建所有视图和模型,并在它们之间进行通信。 这样简单的系统的行为很明显:用户与视图进行交互,并且他的动作被传递给视图控制器。 最后一个执行计算,更改其自己的状态,并且此状态反映在视图中。 如果用户操作需要更改模型 ,则视图控制器会调用该模型进行更改。 如果模型发生更改,则会将该更改通知给视图控制器 。 视图控制器就是其中之一,它可以更新视图 。 这是对这种基本模式的简化甚至天真的理解。 但是它允许开发简单的应用程序,例如计算器或绘画工具。 我想展示一种开发和维护更复杂的应用程序的方法。 首先,让我们变换上面的图并以分层样式绘制它。 它使人想起大学时代熟悉的常见应用程序架构图: 该层是一个非常时髦的术语。 分层样式无处不在,包括应用程序体系结构。 我当时的所有项目都从该图开始,具有三个应用程序层:用户界面,业务逻辑和数据。 所有应用程序对象都属于这些层之一。 数据层和用户界面不进行通信,而是通过业务逻辑进行通信。 让我们复杂化该分层MVC图。 View-controller创建模型并在发生更改时调用它,并在图中显示为箭头。 箭头从视图控制器到视图 — 视图控制器创建所有视图 ,并在其状态或模型发生更改时对其进行更新。 该模型对视图控制器一无所知,如果模型发生更改,它会发布有关该视图的通知,或者更常见的是, 视图控制器会观察到模型更改。 它在运行时发生,我更喜欢使用虚线从模型到视图控制器绘制此箭头。 虚线箭头还应该显示从视图到视图控制器的连接 :用户在运行时与视图进行交互,但是视图不直接调用视图控制器 , 视图不知道视图控制器界面并通过Target-Action Design模式将用户操作传递给视图控制器 。 这是MVC的最简单或理想形式,适用于仅由一个视图控制器构造的小型应用程序。 让我们再添加一个view-controller 。 例如,单击视图控制器中的按钮(上面带有一个视图 […]

WWDC 2016聚焦:Swift 3

Swift在2014年发布后很快就被我们的开发人员和许多其他开发人员所采用。但是,随着Swift在WWDC 2016上宣布的第一个重大更新,苹果可以期望其编程语言在社区中得到比以往任何时候都更多的使用和优化。 苹果去年12月发布了Swift作为开源项目。 从那时起,开发人员一直在努力使语言无缝化。 此外,Apple的内部团队已在更多自己的应用程序中使用Swift,包括新的Music应用程序,Console应用程序以及Agents和Daemon画中画功能。 Xcode 8中的新文档查看器以及iOS的新Swift Playgrounds完全用Swift编写。 Swift 3是Apple开发人员和应用程序创建者广泛社区中的开发人员辛勤工作的产物。 Black Pixel开发人员Kai Schaller和我想分享一些有关该语言最近的更改以及这些更新将如何影响开发人员的初步想法。 对图书馆发表意见 直到Swift 3为止,感觉Swift的主要关注点是发展观点并维护与旧式Objective-C代码库的互操作性。 Swift 3是说“我们认为我们找到了声音”的版本。Swift3是Swift开始将其意见强加到现有库上的时候,其中的表现就是对系统提供的类进行了重命名,并删除了NS前缀。我们已经知道了几十年了。 这种变化进一步扩大,因为数十年来我们一直使用的许多C API都将进行面向对象的改造,如“ Swift API设计指南” WWDC会话中所详述。 代码迁移中的障碍 由于Swift 3是非源兼容的更改,因此Apple在Xcode中提供了迁移助手。 在一些现有的Swift代码上运行此迁移工具表明,转换几乎是无痛苦的,但是如果不更改某些类引用并修复一些不再有效的方法调用就无法完成。 当然,必须要提到的是,这些问题与迁移器的第一个beta版本有关,并且随着该工具越来越接近发行版而可能会得到修复或更改。 无法自动翻译的一些不完整的代码示例包括: Swift 3希望枚举值以小写字母开头,并且通常会自动对其进行修复。 但是,如果以完全指定的方式引用枚举值,例如“ DataError.Unknown ”,它将不会小写该值的第一个字母(在这种情况下为“ u ”)。 NSMutableURLRequest不再存在。 它已被替换为“ URLRequest ”,现在是一个结构而不是一个类。 存在的对NSMutableURLRequest的任何引用都需要手动更改。 另外,由于URLRequest是一个结构,因此如果调用任何修改请求的方法,则需要将其存储在变量( var )中而不是常量( let )中。 现在,如果方法返回值并且没有分配任何值,即使忽略返回值不是错误,这也是警告。 要使警告静音,方法调用的结果需要手动分配给“ _ ”。 转换过程中的异常 尽管有新的约定默认情况下按名称引用所有参数(而不是自动省略第一个参数名称),但是Swift 3转换过程会将“ _ ”添加到函数的第一个参数,而不是在代码中添加参数名称调用该函数。 […]

关于设置的一点

1个 我将深入探讨Swift编译器内部。 我认为最好做一点笔记并描述整个旅程的步骤。 目前,我对Swift或LLVM的内部知识一无所知,但对我在大学期间学到的编译器有一些常识。 因此,这些说明对将要跟随我并了解快速编译器实际工作原理的每个人都是有用的。 我将在每个步骤之后写一个简短的摘要。 而且,我认为从公开准备步骤开始非常重要,以便在我的机器或OS发生问题时能够重现环境。 步骤1.获取源代码并进行一些调整 我从探索swift.org开始。 有一个名为“编译器和标准库”的页面,其中包含编译器体系结构的简要概述以及指向主存储库的链接。 可通过github获得源代码。 README.md包含使用Ninja和CMake设置和构建编译器以及创建.xcodeproj的所有信息。 我选择了后者。 〜$ utils / build-script -x 它可能会运行很长时间。 在构建过程中,我试图准备自己阅读swift.org上的所有可用文档。 它指出编译器由几个模块组成,每个模块代表下一个抽象级别:解析,语义分析,SIL生成,优化,最后是LLVM IR生成阶段。 我将重点介绍官方文档中缺少的内容。 生成的Swift.xcodeproj可以在build / Xcode-DebugAssert / swift-macosx-x86_64 /子目录中找到。 当我第一次打开它时,Xcode用一个模式提示向我打招呼: 但是我可以完成任务,并通过一个简单的步骤解决了该问题: 我做了什么? 我为尚未存在的目标BUILD_ALL添加了构建方案,并设置了可执行文件以使用lldb进行调试: 太容易了。 因此,是时候启动并尝试调试可执行文件了,不是吗? 设置断点,按Cmd + R并… 程序以退出代码结束:0 执行并没有在我的断点处停止。 嗯当然了 我尚未将源文件传递给进程。 使用/path/to/working/dir/A.swift和…调整启动时传递的参数 。 程序以退出代码结束:0 在这里我卡住了。 步骤2.探索执行流程 在继续之前,让我们深入了解swiftc的工作原理。 我的意思是,当您通过命令行调用swiftc并将其传递给源文件时,它会做什么。 你知道吗? 我也不。 我认为这非常简单:迅速的编译器读取输入参数,实例化环境,然后启动lexer,解析器,AST分析器等 。 它的工作方式是这样,但前提是您传递了命令行参数的特定顺序。 通常,它只是设置并启动其他程序来编译,分析和链接可执行文件。 […]

为什么我要从越南搬到墨西哥

胡志明市Wizeline的iOS工程师Thien Liu,将在墨西哥瓜达拉哈拉六个月与团队合作! 是什么把你带到Wizeline? 去年,我在Dreamplex的合作空间工作,并有机会参加Wizeline主持的活动。 我一直在寻找公司的文化和愿景,几个月后我申请了Wizeline! 您喜欢成为Wizeline工程师吗? 自加入Wizeline以来,我已经从其他工程师那里学到了很多东西。 此外,我们举办了许多研讨会,技术讲座和内部活动,以分享工程知识。 Wizeline还提供诸如CodeSchool,Plural Sight等学术课程,以鼓励工程师提高其技术水平。 随时都可以享用美味佳肴和小吃也是我在这里最喜欢的地方之一! 到目前为止,您在Wizeline上最喜欢的项目是什么? 我最近参与的最喜欢的项目之一是为数字媒体客户端提供内容。 我将与瓜达拉哈拉办事处的工程师合作,为澳大利亚的这个客户提供服务。 这是一个挑战,非常有趣! 您最想知道墨西哥什么? 新朋友,当然! 我迫不及待地想见一个在一个崭新的国家里从未见过的人。 帮助架设Wizeline的办公室也是一项重要责任。 我会想念我在越南的队友,但我希望能体验并将瓜达拉哈拉最好的地方带回我们在越南的办公室。 如果您想体验越南的硅谷文化,请立即申请Wizeline! 我们有许多工程职位,而且更加开放。

第一周:7/14 / 17–7 / 28/17

大家好! 欢迎来到我们Codeon博客上的第一篇文章! 我们此博客的主要目标是记录在Zionsville的公司发展状况,以证明我们随着时间的推移而发展和发展,就像杂志或日记一样。 话虽这么说,我永远不会像日记一样写这本书,因为我想它看起来像这样: 2017年7月14日: 我们今天工作了。 那是工作的好日子。 2017年7月15日: 该应用程序的更多工作今天完成。 好极了。 2017年7月16日: 该应用看起来更像一个应用… 您可能会想像到,要通过它非常无聊! 因此,我将按照与我们的开发过程相对应的方式,将该博客分为两个星期的周期(希望不会落后),如下所述! 组建团队 从一开始,我们就以Zionsville社区高中的6名学生(包括我自己)为核心: 首席执行官兼经验丰富的iOS开发人员Jeremy Chiang Derian Cowser,我们的网络开发人员和Android编码器 我们的Android编码器Will Schrepferman 我们的iOS开发人员Charlie Chiang Bobby Corridon,我们的网络开发人员 还有我林德(Edward Lin),我们的营销/销售专家 我们是一群对发展,创造力和为社区服务充满热情的核心朋友,我们决定携手共进,对我们的社区产生影响。 杰里米(Jeremy)担任我们的领导者兼首席执行官,因为他之前曾在印第安那州卡梅尔的Apperun Tech担任iOS开发人员。 我们希望随着我们公司的发展壮大并产生更大的影响! 学习期间 从一开始,我们就进入了第一个2周的阶段,即“冲刺”。我们的方法是使用冲刺时间表(敏捷开发过程的一部分在开发中很常见)。 冲刺时间表可为我们希望服务的应用程序缩短开发应用程序的周转时间,而2周的学习期是第一次尝试的好地方! 我们每个人都有自己特定的任务和学习路径,其中包括许多在线教程和课程(感谢Codecademy!)。 此外,我们在每个星期二和星期五举行团队会议,以组织自己并保持自己的步伐! 随着两周的结束,很明显我们很多人学到了很多东西,但是还有很多改进的余地……在接下来的两周冲刺中我们需要一些东西! 感谢您阅读这篇冗长的文章。 下次见

为什么缩短应用程序审查时间很重要

昨天,我们为旗舰店提交了三个重要的应用程序更新,并且与往常一样,我正计划在下周发布大量应用程序! 然后我看到了彭博社的这份报告,其中提到在App Store上的审查时间较短。 一开始我很怀疑,但是今天改变了, 我们所有的应用程序都在24小时内获得批准! 哇! 因此,如果我们看到应用程序审查时间缩短到一天,那么对于App Store来说将是一个巨大的改变。 仅此一项并不会改变生态系统,但肯定会对用户和开发人员产生影响。 怎么样? 对于用户: 更多每日应用程序更新 /更多浪费的蜂窝数据(确保您使用Wi-Fi从App Store中进行自动应用程序更新) 总体上更好的体验 。 这些应用程序的bug可能更少,或者可以更快地修复和批准这些bug。 对于开发人员: 释放周期更短 。 我们现在必须做出相应的计划! 这些天,营销团队必须采取更快的行动,以准备好的产品发布。 不等7至8天就是一种喜悦! 能够A / B测试App Store媒体资产。 有一些服务可让您在App Store上测试应用名称,视频预览和屏幕截图,以获得更好的转换结果-好吧,现在您可以更快地更新它们。 没关系,每次更新应用程序时,评分都会消失,从而导致销售减少。 有时,对于尚未评级的付费应用,我们会看到30%至40%的下降。 这就是为什么所有更新都需要付出一定代价的原因。 及时更新。 每当开发人员想要修复错误或使用最新的第三方API时,较短的批准时间将使最终用户获得应用程序体验。 更好的体验->更高的客户满意度->更多的推荐->更多的下载。 新的App Store 菲尔·席勒(Phil Schiller)的目标似乎是复兴App Store,并使它再次变得酷炫。 它对开发人员变得更加友好(App Store团队与许多开发人员进行了交流,收集了他们的反馈,可以早期访问未发布的设备等),并且与用户更加相关(正在进行的App Store编辑更新)。 我很确定,今年WWDC期间我们将见证更大的变化! 我确实希望App Store变得更加个性化,与用户更加相关,以便人们再次开始下载应用程序。 我错过了什么? 请随时为故事添加内容。 另外,我们今年将访问WWDC 。 让我们知道您是否在附近!

仅iPad,gamedev-第一周-为什么?

这是该实验的第一周,该实验旨在仅使用iPad制作网络游戏。 是的,这意味着仅iOS应用(工具),从游戏设计到Sprites,Tilesset(如果有),声音合成,市场营销艺术,当然还有代码。 首先,我必须解释为什么要这么做。 自从我的第一台iPad(第1代)以来,我一直在尝试将其用作主要设备,但它并没有获得实现自己想要的一切方法。 我想要的是一种使我的工作更简单,更快,更专注的方法。 我使用具有* BSD风格的其他设备,Linux,BeOS / Haiku甚至鲜为人知的操作系统来做很多工作,更改用户界面,甚至创建了自己的几次。 操作系统从来都不是问题,在这种情况下也不是工具。 Mac OS X(现在为macOS)很棒,并且是我自2010年以来的主要操作系统。(Macbook)Air机器的便携性也很好,但是最近几年,我对管理文件,软件和硬件的简单方法的搜索发生了变化。 我仍然喜欢o通过手工,硬件和软件配置来构建自己的服务器,但是每天我希望它摆脱我的方式来专注于我的代码。 自从iPad Pro发行以来,许多人开始将iPad用作其主机(如果您愿意,可以使用主计算机或主工作站),并且iPad变得越来越明显,甚至自iPad的早期版本起,人们就一直在使用iPad。 然后,许多人说它不能放置机器,其他人说是……但这并不重要,因为对某些人有用的东西可能对其他人没有好处,您必须搜索合适的设备,应用程序和满足您需求的工作流程。 看到各种成功的案例,其中(任何)iPad取代了作家,企业,艺术家的主计算机,并且看到很少有程序员在谈论它,所以我决定只使用iPad(Air)在一个完整的游戏中制作一个简单的游戏。系列文章,详细介绍了在此任务中(我)能最好地利用工具,流程,技术和工作流程的工具,包括可能出错的所有内容,原因以及解决方法。 选择网页游戏也将避免Mac编译代码或构建应用的必要。 如有必要,我可以通过SSH或其他方式登录到Mac,然后开始构建和编译代码。 在下周,我将讨论所选的工具并解释是什么促使我选择它们。 再见!

iOS 9.3 MDM企业功能

主屏幕布局 此功能使管理员可以根据用户角色自定义设备的主屏幕。 管理员可以强制某些图标位置并使它们无法删除。 凭借固定的主屏幕布局和限制应用程序使用的能力,解决方案变得更易于部署到技术欠佳或容易分心的个人。 用例 :这可以帮助公司在所有设备上创建一致的用户体验。 在有监督设备的情况下可能会派上用场,尤其是在Kiosk模式下。 锁屏信息 可以在iOS 9.3设备的锁定屏幕上显示自定义消息。 IT管​​理员将能够配置来自MDM的消息。 用例 :此文本可用于打印公司的品牌信息。 此功能的另一个简单用例是定位丢失/放错位置的设备。 在MDM丢失的设备上显示锁屏消息,如“如果找到,请致电xxxx”。 迷失模式 使用此功能,可以锁定和禁用iOS设备。 在设备上调用丢失模式后,即使在设备上禁用了位置服务,它也会开始向其MDM服务器报告其地理位置。 用例 :设备丢失或失窃是每个企业的重要问题。 此功能可以帮助管理员轻松找到设备。 另外,使用“锁定屏幕”消息,管理员可以在设备上显示消息以及有关如何返回消息的说明。 应用白名单和黑名单 此功能使列入黑名单的应用程序无法显示或启动。 这甚至适用于内置应用程序。 另外,您可以指定应用白名单,这是用户只能启动的应用。 用例 :这些功能针对需要对应用程序进行严格控制的任何组织用例。 像这样,公司可以使用它来阻止其雇员将公司设备用于个人用途。 它可以用于教育中,以禁止在学生的设备上使用不合适的应用程序。 iPad的多用户支持 这将允许多个用户(或Apple ID)共享一个iPad。 每当用户登录时,他的所有个人信息和应用程序都会显示在该iPad上。 这是通过缓存功能实现的,该功能使所有用户环境立即可用,而无需再次重新下载所有内容。 用例 :此功能对医疗保健,零售和教育等众多行业有用。 设备共享将为组织节省资源。 通知功能 通过此更改,管理员现在可以对通知进行精细控制。 他们可以指定哪个应用程序获取哪种类型的通知。 这个想法是为了减少注意力,提高生产力。 用例 :公司将能够根据应用的优先级或所携带的数据来控制应用的消息类型。 与可能携带敏感或机密数据的应用类似,管理员可以选择关闭通知。 限制条件 很少添加新的限制,管理员可以根据需要配置这些限制。 这些措施包括阻止用户更改通知设置,禁止受监管设备的最终用户在本地保存特定URL的密码或禁止用户使用Apple Music服务或iTunes。 用例 :公司可以节省额外的数据成本,这些成本可能被员工用于流音乐等中。 教育功能-iOS 9.3中添加了一些新功能,这将为教育工作者打开一个全新的世界。 课堂应用 这个程序是为课堂老师提供的,他们可以检查学生的进度并通过此分享学生的工作。 […]