Tag: macos

使用Swift-NIO开发基本的Swift Echo Server

我不是Java或JVM类型的开发人员。 这可能是我从未感到需要尝试Netty框架的原因之一。 我一直在用Erlang,Elixir或Go开发所有高性能服务器代码,并对工具感到满意。 但是,Apple最近发布了Swift-NIO,这是一个用于开发跨平台服务器和客户端应用程序的新库和框架。 我不是前端开发人员,而是更具可伸缩性的后端开发人员。 就是说,我喜欢Swift编程语言,并且自从Apple在2014年发布它以来就一直关注着它的进步。这就是为什么这个新框架引起了我的注意。 编写服务器端软件有多好? 由于Swift-NIO是Netty的一个端口,它是由Netty杰出贡献者Norman Maurer领导的团队开发的,因此我首先研究了Netty设计,以更好地了解Swift-NIO的工作方式。 我喜欢我所读到的东西。 Netty的概念提供了很好的通用抽象,这是好的网络应用程序所共有的。 它是一个参考框架,在Java世界中用于构建许多非常高级的服务器和客户端工具。 这些概念与Swift编程语言非常吻合。 很好的契合度让我认为这确实可以加速Swift服务器端开发和跨平台推广。 我敢打赌它可能会产生很大的影响,并帮助Swift继续迅速崛起为顶级编程语言之一。 Swift-NIO依赖于非阻塞IO。 这意味着您可以通过使中间层分派准备好处理到工作线程的网络操作的方式,来管理相对数量的线程,从而管理大量的网络连接。 因此,从处理线程的角度来看,网络操作是无阻塞的。 他们可以完全使用CPU,因为它们可以共享大量套接字的网络操作,而无需等待。 在Swift-NIO措辞中,阻塞操作被委派给通道。 通道将网络操作上的事件触发到负责管理通道的事件循环。 开发人员将服务器或客户端的逻辑作为处理程序提供给事件循环。 处理程序是实现触发网络事件时执行的操作的代码段。 可以将它们组合在处理程序管道中以提供额外的灵活性。 这为去耦增加了一层,并使处理程序更可重用。 在客户端服务器环境中,“ Hello World”应用程序通常是“ Echo”服务器。 服务器接收客户端发送的内容,并将其发送回客户端。 使用Swift-NIO非常容易实现。 让我们看看如何做到。 请注意,以下步骤已在MacOS上进行了测试,但是如果您已安装Swift,则它们也应该在Linux上也可以使用。 您可以使用Swift命令行引导项目: $ mkdir EchoServer $ cd EchoServer / $ swift package init —键入可执行文件 创建可执行程序包:EchoServer 创建Package.swift 创建README.md 创建.gitignore 创建源/ 创建Sources / EchoServer / […]

用于多平台开发的模块化体系结构:第1部分

这是3部分系列的第1部分。 您可以在这里找到其他部分: 第2部分:接口和框架开发 第3部分:演示和UI 配套项目: Github 驯服海妖 截至2019年1月,苹果在全球范围内拥有14亿台有源设备。 我们中的许多人至少拥有2或3。我们会在一整天在Mac电脑上工作,在iPhone上浏览以及在Apple Watch上浏览之间切换。 我们希望连续性经验是无缝的。 跨平台存在巨大的机会。 但是,很多时候我们将开发工作仅集中在一个平台上。 我们担心会增加复杂性,增加预算和不合时宜的时间表。 我们害怕神话人物- 海妖 。 本文试图驯服怪物。 但是,它不是“快速致富”教程。 为多个平台构建应用程序意味着需要额外的维护,编码,测试,设计/ UX资源,以及将您的应用程序作为系统的全面综合的高级思考。 但是,通过正确的方法,应用一些最佳实践方法和技术,肯定可以以实际有效的方式实现。 下面的示例代表了一个更极端的情况,我们将为iPhone , Apple TV , Apple Watch和Apple TV构建一个幻灯片应用程序。 苹果硬件生态系统的四个触角可供开发。 下一次我们将离开第五台iPad 。 并希望将来HomePod , VR / AR眼镜甚至Apple Car能够完成Kraken缺少的触角。 您的海妖可能会有所不同。 它可能只是一个触手可及的一个iPhone应用程序。 这里讨论的许多原理(例如模块化)仍然适用并且非常有帮助。 继续阅读。 所有伟大的项目都始于良好的架构 建筑 幻灯片应用程序很简单:它将每隔几秒钟显示一次来自Unsplash的随机照片。 根据平台的不同,它还将显示摄影师的姓名,图像描述和喜欢的图像。 我们要做的第一件事是决定如何将所需的功能分解为各个组件以分离关注点。 在我们的案例中,有明确的界限。 将与Unsplash API通信的业务逻辑分离到其自己的模块中是有意义的。 我们将其称为ShowEngine 。 我们还可以将负责按一定时间间隔加载每个映像的运行循环代码分离到其自己的模块/类中,以更接近于单一职责原则。 但是对于这个简单的示例,我们将其放在一起。 […]

Swift / Objective-C桥接中的循环引用

任何拥有两年以上历史的iOS / MacOS项目都必须处理Swift和Objective-C的混搭 ,在这种环境中,不同的语言会试图共存。 但是,这种和平可能会受到某些特殊条件的威胁,在某些特殊条件下,由于歧义性,无法正确建立两种语言之间的桥梁,例如在循环引用的情况下。 以这种情况为例: ObjcMainClass由符合Swift编写的ComponentProtocol的对象组成,因此需要导入ProjectName-Swift.h生成的文件 ObjcMainClassTests是用于测试ObjcMainClass组件的Objective-C单元测试类。 它将使用符合ComponentProtocol的StubComponent对象,以控制要测试的公共方法的执行流程。 StubComponent是在单元测试目标中定义的,并且需要包含@testable import ProjectName代码才能找到协议定义。 由于StubComponent位于单元目标中,并且是用Swift编写的,因此ObjcMainClassTests必须导入ProjectNameTests-Swift.h生成的文件。 尝试运行单元测试,您得到的是“在ProjectNameTests-Swift.h中找不到模块ProjectName”错误: 在采用模拟单元测试方法的项目中,这种情况可能很常见,其中将新Swift接口的具体存根传递到现有的Objective-C实体。 最好的解决方案是减少Objective-C和Swift代码之间所需的桥梁数量。 尝试将模块或对象图迁移到Swift,或在计划迁移本身之前在Objective-C中临时编写协议和存根。 第二种方法显示在Github上的演示项目中,您可以在此处找到失败和通过的场景:https://github.com/matsoftware/TestObjcSwiftCircularReference。 桥接愉快☺

与NSCollectionViewItem纠缠

如果我此时尝试运行该项目,将显示错误。 我最终进行了搜索,很多人以前都遇到过这个问题。 自2014年以来,它发生在大型API更新之前。 到目前为止,没有解决方案,只能删除它。 覆盖内容大小并不容易 我来自iOS开发背景,并且一直在使用UICollectionView。 一个常见的技巧是更改contentSize,以便获得更大的可滚动区域。 将偏移量设置为特定区域以进行显示很有用。 与UICollectionView不同,NSCollectionView中没有’contentSize’属性。 相反,可以使用NSCollectionViewLayout中的属性“ collectionViewContentSize”来更改contentSize。 这也存在于iOS的对应版本中。 这也意味着,该使用2015年更新中可用的新API了。 然后,假设我更喜欢流布局,我将创建NSCollectionViewFlowLayout的子类。 我现在可以覆盖该属性以允许更大的内容大小。 在替换布局时,我还将在代码中设置项目大小。 harryworld / NSCollectionViewItem 通过在GitHub上创建一个帐户为NSCollectionViewItem开发做出贡献。 github.com 创建项目的占位符可能会导致问题 每个项目都有一个大小。 有时,我不想使用数据源制作商品,而是想将其创建为占位符。 这是根据项目的内容执行一些尺寸计算的。 如果仅创建项目,则不会链接其中的UI组件。 通常,我们从对象连接那些组件。 当NSCollectionView制作项目时,它将正确链接它们。 但是,如果我使用构造函数初始化该项目,则这些组件不会连接。 有时,我什至会收到“视图未加载”的错误。 解决方案分为两部分。 第1部分:为了确保NSView在创建时可用,您应该将视图同时连接到文件的所有者和对象。 在这种情况下,我们将依靠文件的所有者连接来初始化视图。 第2部分:对于其他UI组件,它们充当Interface Builder中的子视图。 我们需要手动连接它们。 只需循环浏览所有子视图,并将它们与预定义的标识符进行匹配。 harryworld / NSCollectionViewItem 通过在GitHub上创建一个帐户为NSCollectionViewItem开发做出贡献。 github.com 我已经创建了解决所有这些问题的示例项目,您可以在此处找到源代码。

现代可可观点中的一项习题

最初发布在这里: https : //avaidyam.github.io/2018/03/22/Exercise-Modern-Cocoa-Views.html 就像我在上一个“片段”中所说的那样,最近,我想开始为Parrot添加“热键”支持,并且意识到我不喜欢任何现有解决方案: 使用MASShortcut尝试并证明可在ObjC-land工作的MASShortcut或ShortcutRecorder 。 使用新的但未经验证的Swift热键记录器(那里有一些)。 自己动手(可能以某种方式使用危险的专用SPI)而不进行任何测试! 显然,我选择了#3。 在这里,我们进入了激动人心的传奇的第二部分,您在其中见证了我打破AppKit和WindowServer并引起从事上述组件工作的工程师的愤怒和愤怒。 我希望你带了爆米花。 我想澄清一下,我们将只构建一个管理单个快捷方式的独立控件。 我希望Parrot与大多数应用程序一样,将不需要像Final Cut Pro这样的命令编辑器,该命令编辑器是专门为视频编辑器而专门设计的,该视频编辑器具有两个以上的键盘和两个以上的两只手可以匹配。 我们的最终结果将是看起来,听起来和感觉像这样,而不是: 在进入精妙的手工对编程之前,如果您想直接跳转到带注释的最终源代码,我将在此处提供一个快照。 这是整个最终产品,精确到1500 LOC,包括之前“ episode”中的代码-相应的键盘快捷键功能! 如果您认为这应该是正式的存储库而已,请通过Twitter或Github @avaidyam与我联系! 现代观点原理 子类化View或ViewController 我们应该回答的第一个问题是,我们要构建什么样的组件? 这个问题的答案是什么决定了我们是什么样的子类,以及我们与应用程序中其他组件的交互模型。 当您构建一个采用程序输入并向用户显示内容的分立组件时,对于控件而言,当您接收用户输入并显示程序输出时,您应该将View子类化。 除此之外的任何东西都应该是ViewController的子类,介导其他组件之间的交互的组件,或处理模型/数据库对象的组件,或者实际上只是其他任何东西。 View应该可以在您要立即构建的环境之外的其他环境中轻松重用,但是ViewController不一定能够履行此合同。 例如,联系人头像最好是View子类,但是联系人头像选择器应该是ViewController ,因为它不仅显示头像图像,而且还允许用户选择图像,并且可以处理与头像的同步。联系人存储(可能是JSON文件,可能是远程API,或者可能是CNContact )。 在macOS上,如果要构建的组件既包含其他组件(例如ViewController )又包含在Window ,则还应考虑将WindowController子类化-联系人头像选择器可能不符合此条件,但需要联系人编辑器面板联系人头像选择器将是一个ViewController嵌套在姓名,电话,电子邮件和其他可编辑字段旁边。 层数 虽然与年轻的兄弟姐妹UIKit相比, AppKit通常被视为恐龙,但重要的是要知道, UIKit所使用的几乎所有设计模式几乎都来自AppKit ,如果不是,它们最终会回到AppKit ,除了极少数。 例如,由底层CALayer类型支持的UIView的概念与由NSCell支持(而是过去?)的NSControl非常相似。 不同之处在于CALayer实际上是驱动显示内容的呈现而不是UIView的呈现,并且NSCell充当特定事件处理和绘制的“橡皮图章”。 当涉及到层支持的视图时, AppKit实际上有几种模式可以实现此目的: 层托管: self.layer = CALayer(); self.wantsLayer = true NSView拥有CALayer ,并负责创建和管理它。 […]

使用网络链接调节器实用程序

通过iOS和macOS上的Network Link Conditioner,您可以在网络条件下测试应用程序,例如用户在使用应用程序时可能遇到的情况。 它允许您模拟网络条件,例如3G,边缘或高延迟DNS。 在iOS上使用网络链接调节器 您可以在iOS的“设置”应用程序的开发人员页面中找到“网络”部分。 除了启用多路径网络,您还可以导航到默认情况下禁用的网络链接调节器。 您可以在此处阅读有关多路径网络的更多信息。 可以在“网络链接调节器”页面上找到默认预设的列表。 您可以通过点击其中之一来选择预设。 启用该开关,以在所选预设上测试您的应用。 可以通过导航到“ Add a profile页面来定义适合您需求的自定义预设。 在MacOS上使用网络链接调节器 在MacOS上使用该实用程序之前,您需要为当前Xcode版本安装其他工具。 通过导航到Xcode Main Menu > Open Developer Tool > More Developers Tools您可以在登录后下载这些工具。 在下载的.dmg内,您可以找到许多有趣的实用程序。 可以在“ Hardware文件夹中找到“网络链接调节器”。 通过双击该应用程序,您可以在“系统偏好设置”中安装该实用程序。 该应用程序与iOS版本非常相似,还包含一系列自定义预设。 这些可用于模拟一系列网络条件。 除此之外,您还可以在“ Manage Profiles页面中定义自己的预设。 选择预设并启用开关后,您可以在仿真网络预设的同时开始在模拟器中测试Mac OS应用或iOS应用。 这个故事最初发布在: https://www.avanderlee.com/debugging/network-link-conditioner-utility/

您是否在采取正确的步骤来保护自己的在线状态?

最近,我看到许多大学生在笔记本电脑上遮盖相机。 我仍在决定是否在阅读电子邮件以及开发网站和应用程序时是否在担心黑客或政府在监视我。 坐在咖啡店对面或班上我旁边的人也在看着我。 有人真的在看着我吗? 我了解人们为何为此感到担忧,尤其是因为他们并不真正了解所使用的技术是如何工作的。 人们似乎不了解的是,Apple试图通过每个macOS版本及其后的安全更新来保护您免受恶意软件和安全漏洞的侵害。 正如该Mashable文章所述,从理论上讲,恶意软件可以接管计算机的摄像头。 黑客可以通过恶意软件访问…摄像机。 如果您不小心单击了错误的链接或下载了错误的文件,则该恶意软件可能包含可执行代码以打开网络摄像头并将该视频提要发送到网站或将其保存在其他位置。 这意味着您应该非常小心从Internet上随机站点下载和安装的内容。 我见过几位大学生带有恶意的Chrome扩展程序或他们不经意下载的软件中的其他恶意软件。 软件更新 苹果明确指出,您应该始终更新Mac和iPhone: 使软件保持最新是维护Apple产品安全的最重要的事情之一。 我已经开始问我的朋友和同学们他们正在运行哪个版本的macOS。 大多数计算机运行的是2到3年前购买计算机时所用的相同版本。 我已经看到许多人仍在运行10.9或10.10,即使macOS当前在10.12上也是如此。 您可以通过菜单下的“关于本机”轻松查看正在运行的版本。 我在Facebook上进行了一次非正式的Twitter调查和一个Google Forms调查,以查看谁的Mac确实存在恶意软件问题: 答案在民意测验中是一致的。 大多数人不会感染恶意软件,而回答我的民意调查的人中只有4–6%曾经在运行最新的操作系统时感染过恶意软件。 我还进行了两次民意测验,以了解人们在其主要计算机上运行的macOS版本: 只要您掌握最新的安全更新,运行两个最新的macOS版本(Sierra和El Capitan)可能就可以了。 如果您的运行低于10.11.6,建议您更新计算机。 同样,如果您使用的iOS版本低于9.3.5,则可能应更新设备。 密码 我没有看到别人考虑的另一件事是密码的强度和变化性。 我见过许多大学生(和其他人)使用容易猜到的密码,例如他们的街道或城镇的名称。 通过强密码保护计算机和电话非常重要。 此外,保护您无数的在线帐户(如Gmail,Dropbox,Facebook等)也同样重要。 如果您的一个帐户被盗,您可能会丢失甚至不知道的有价值的数据。 我强烈建议您使用密码管理器来存储您的安全密码,这样您就不必为使用的所有内容记住其他强密码。 我在Mac和iPhone上使用1Password,我喜欢它。 iMore在审查不同的密码管理选项时很好地说明了这一点: 容易记住,广泛重复的密码适用于傻瓜。 写下来重新输入,或者每次都复制/粘贴它们不仅麻烦,而且是等待发生的灾难。 那么如何更好地保护自己呢? 将Mac和iOS设备更新为最新的操作系统版本。 这不必是第一天,但​​应该在前几个月。 将您的网络浏览器更新到最新版本。 Chrome通常会自动执行此操作,而Safari更新包含在macOS中。 注意下载的内容。 它来自什么URL? 尝试打开Apple时,Apple是否警告您未由经过批准的开发人员签名? 使用强大而多样的密码。 您的密码不应该与您的生活有关,并且您的安全性问题的答案也不能让人猜到。 如果您不做这些事情,遮盖网络摄像头可能会有所帮助,但是它不会保护您免受其他任何事情的侵害,例如有人用您的麦克风为您录音。

AppFollow 3.8多汁的夏季更新🍉🍓

关于“今日精选”页面,有什么很棒的? 历史记录 我们默认显示最近4天的特色应用程序,自2017年11月以来可以获取历史数据。您可以在一个地方分析趋势,国家和应用程序。 带故事的卡片 卡有4种类型:每日应用,每日游戏,故事和收藏。 您可以轻松共享任何卡,并让您的朋友羡慕您。 明天的精选应用 有点神奇,格林尼治标准时间下午2:00,我们展示了明天的精选应用程序。 成为第一个认识并与您的朋友分享的人😎并且不要忘记准备服务器和支持团队。 搜索应用 如果您跟踪自己的应用程序或竞争对手,请了解全年和所有国家/地区有关特色应用程序的数据。 只需在搜索栏中输入应用名称,然后追踪所有推荐结果即可。 统计 我们在“今日”标签中收集获得最多关注的应用和游戏。 默认情况下,我们将向您显示所有国家/地区的领导人,您将可以按任何国家/地区或特定时间段对其进行分类。 松弛通知 关于特色应用程序,最方便的事情是Slack通知。 成为第一个发现您或您的竞争对手何时成为Today的人物。 如何配置Slack通知。 此功能仅适用于高级帐户。 如果您想免费试用试用版,请与我们联系。 梦想着让您的应用具有特色? 我们很快会告诉您如何实现的。 2.对Mac应用程序评论的回应 在WWDC会议期间,Mac App Store将变得更加流行,因为Apple宣布进行了重新设计并提高了可发现性。 我们已决定帮助您处理Mac应用程序的反馈-以与iOS和Android相同的方式答复它们。 设置与Mac App Store的集成。 您是否需要Mac App Store的更多选择? 请与我们联系help@appfollow.io。 3.亚马逊产品支持 对于许多客户而言,移动应用程序只是业务的一部分。 例如,您正在亚马逊上出售智能吸尘器,并且已经连接了该应用程序以将吸尘器控制到AppFollow并监视评论,评分和请求。 现在,您可以获取有关产品本身的分析信息! 追踪亚马逊的商品。 4.测试人员的反馈支持 Android开发人员很幸运能够在该应用上线之前进行封闭的Beta测试。 此时收到的反馈非常重要-它可以帮助在发布之前进行修改并最终确定应用程序。 通过AppFollow平台与Alpha和Beta测试人员联系。 他们的反馈和回复不会在Google Play中发布。 有关Beta反馈的更多信息。 5. API中的现成请求 如果您使用我们的API来接收和编辑应用程序上的数据,我们将为您带来一些好消息! 现在,我们的用户可以使用现成的方法,签名和参数。 只需复制它们即可继续工作。 此处有更多详细信息。 使用我们的帮助中心设置API。 如果您经常每天更新数据,请与我们联系。 […]

Windows上的Unity iOS:使用VMWare从Windows机器上的Unity编辑器中部署到iPhone

这是在Windows计算机上开发Unity iOS应用程序的帮助。 使用VMWare,可以在本地虚拟机上运行Shell脚本,以自动完成通过USB将Unity应用程序从编辑器部署到iPhone的整个过程。 该过程是单击等待的过程,每个构建大约需要5分钟。 本文提出了一些组件来管理自动化。 注意 :这是“穷人”的方法,如果您一开始只能购买Macbook,从长远来看可能会浪费您的资源。 另外,在完全提交之前,请通读并做您自己的研究,因为可能存在一些硬件要求。 免责声明 :在非Apple硬件上运行任何macOS均违反Apple EULA。 请确认风险,并自行承担责任。 系统总览 Shell脚本在Windows和VM macOS都具有读/写访问权限的目录中监视非常简单的时间戳文件。 每当Unity Editor将项目组合到文件夹中时,C#后处理脚本都会在文件中设置标志。 然后在VM中,shell脚本将检测该标志,构建/部署项目并折叠该标志。 因此,只要脚本在VM上运行,用户就可以在Unity Editor中按下“构建”按钮,并免提等待,直到iPhone自动打开应用程序。 设置共享文件夹 共享文件夹是VMWare用来访问主机文件系统的功能。 该文件夹将容纳并启用Unity Editor和Shell脚本之间的通信。 使用共享文件夹 https://www.vmware.com/support/ws5/doc/ws_running_shared_folders.html 设置xcodebuild 要通过shell脚本构建XCode项目,有一个名为xcodebuild的命令行工具。 这应该与XCode应用捆绑在一起。 设置ios部署 xcodebuild没有可以部署到设备上的功能,但是还有另一个名为ios-deploy工具可以这样做。 此外,iPhone还需要通过USB连接到计算机并路由到VM。 ios部署 https://github.com/ios-control/ios-deploy 连接USB设备 https://www.vmware.com/support/ws55/doc/ws_devices_usb_connect.html 设置Unity C#后处理脚本 构建完成后,将调用带有[PostProcessBuild]属性标记的静态方法。 对于时间戳文件的格式,脚本可以是这样的: 每当用户单击“生成”按钮时,Unity编辑器都会将项目编译为XCode项目,然后此脚本将更新时间戳。 构建路径必须设置为共享文件夹内部。 设置Shell脚本 这是整个脚本,随后是一些重要内容的深入介绍。 该脚本可以设置为登录项,以便它自动开始运行。 可以通过关闭终端窗口来中止该过程。 在脚本中可以更改的共享文件夹名为__transfer_ ,以及项目名称( MyProject )和应用程序名称( foo.app )。 这些名称必须与Unity Editor中的构建设置匹配。 默认情况下,诸如cd和cp类的命令无法在“共享文件夹”(“无此文件或目录”)内部访问。 […]

WWDC 2018’在Ardından

Merhabalar, Apple苹果4战车大战2018年WWDC比赛在derledim举行。 主题演讲视频izlemekiçin:https://www.apple.com/apple-events/june-2018/ EtkinliklepaylaşılanIstatistikler: 20m uygulamageliştirici。 Haftalık500 milyon应用程序商店ziyaretçisi。 Yazılımcılaraödenen100 milarar美元。 iOS 11版本:%81 iOS 12 —更快,响应速度更快—给您带来更多动力。 iOS 11升级到iOS 12版本。 表演者: Uygulamalarınaçılışhızında%40,klavyegörüntülemehızında%50,kamerauygulamasındaise%70oranındabirhızartışıolacak。 Ayrıca股票表%50’ye kadar birhızartışıyaşanacak。 Bu oranlara bakarsak,ciddi bir performansartışıbekleniyor。 CPU是uygulamaaksiyonların表演,并且是art,düşüreceği,innerjikullanımında,tasarrufsağlanacak。 AR: Apple ve Pixar格式和USD格式的USDZ duyuruldu。 SahneyeçıkanAdobe CTO’su Abhay Parasn​​is,保留所有格式。 度量衡,ARkapsamındayeni bir uygulama duyuruldu。 Bu uygulama ile herhangi bir objeninboyutlarınıölçebiliyorsunuz。 ARKit 2 duyuruldu veçokluoyuncudesteğiaçıklandı。 Buna birörnekuygulamagösterildi。 Uygulama […]