Tag: macos

清除macOS上的硬盘空间

所有计算机都必须管理硬盘空间。 最好的方法是通过文件夹和文件夹结构来组织内容,并在我们积累大量内容之前尽早清除不需要的内容。 但是,如果为时已晚,请继续阅读。 在macOS上,有一个实用程序可以确定在何处以及使用了多少空间。 该实用程序的一个缺点是它没有披露与系统相关的空间消耗,因为Apple工程师可能认为人们访问和删除这些区域中的内容是不安全的。 但是,对操作系统有所了解的专业人员也可以在这些区域执行一些清理任务。 这是通过使该实用程序可以访问“系统”区域下的内容。 要了解磁盘利用率,macOS有一个实用程序,可将空间消耗分类为系统,应用程序,文档等类别,这有助于确定造成空间消耗的主要来源。 单击菜单栏上的>>> 关于本机 ,然后单击存储选项卡 至 访问此。 下面的屏幕截图显示了以对比色显示的分类。 当我们单击上面的屏幕快照中的“ Manage…”按钮时,我们得到以下屏幕,该屏幕使我们可以选择部分并优化存储。 在这里,选择侧栏上的任何部分,例如“文档”或“应用程序”,将显示文件,应用程序或文件夹及其已消耗的磁盘空间量。 然后,我们可以使用此信息来决定是删除还是保留该文件。 要浏览所有文件和文件夹,请单击侧栏上的“文档”,然后单击“文件浏览器”选项卡,如下所示: 针对巨大文件夹显示的大小可能不会立即显示,因此请等待几秒钟或几分钟,直到操作系统确定大小为止。 macOS的主要卷是Macintosh HD。 如果我们通过相同的实用程序进行访问,则可以知道其下每个文件或文件夹占用的磁盘空间。 因此,我们通过在终端上执行以下命令,在我们的桌面文件夹上创建指向它的符号链接: ln -s /卷/ Macintosh \ HD〜/桌面/ 请记住,从终端的主文件夹或符号链接源(本例中为Macintosh HD)的符号链接源以外的任何其他文件夹执行上述命令。 如果您不在终端上的主文件夹中,则可以通过执行以下操作转到主文件夹: cd〜或只是cd 现在,使用与上述相同的实用程序,并从“桌面”文件夹中浏览Macintosh HD,以查找包含有害数据的区域。 您还可以通过以下实用程序查看隐藏的文件夹和文件,以保持以下状态检查其大小: Command + Shift +。 此快捷方式也可以在Finder上使用。 要隐藏要再次隐藏的文件夹,请再次按住相同的键。 知道文件和文件夹占用的空间后,我们可以决定要删除的空间。 最后一步,清除“废纸””以重新获得磁盘空间。 主文件夹下隐藏的“库”文件夹是一个值得寻找的地方,特别是对于应用程序开发人员而言。 系统下方显示的用法的主要部分包括zip文件,一些安装程序文件等,它们已存储在硬盘中的任何位置。 这可以在“文档”,“桌面”或任何其他目录下。 最后,如果清理活动完成,我们可以安全地从桌面删除符号链接,因为它们只是原始文件夹的快捷方式。 这样,可以清除Mac中大量不需要的数据。 唯一要考虑的是在将文件或文件夹发送到永恒之前,请先了解它们的用途。

SQLPro —年度回顾2017

我看到其他一些开发人员在评论中发表了一年的评论,发现它们很有趣。 以下是有关SQLPro的运行情况的一些统计信息。 收入 2017年是有记录以来最好的一年,网站销售领先。 网站 在2017年的大部分时间里,SQLPro一直在使用Fastspring作为其销售提供商。一些产品由于具有一些有趣的功能,已经过渡到Paddle。 Fastspring和Paddle都使在线销售产品变得非常容易。 Setapp SQLPro Studio于2017年3月加入Setapp。收入逐月增加,并且IMO没有从其他来源获得任何收入。 Setapp通过两种方式提供收入。 首先是应用使用情况,这是SQLPro大部分收入的产生方式。 其次是推荐收入(我很自豪地获得了一笔注册收入)。 如果您有兴趣尝试Setapp,请尝试一下我的推荐。 https://go.setapp.com/stp146 Windows App Store 我在2016年末,2017年初将脚趾浸入Windows应用程序商店。这些图表中的数字非常小,因此没有包含在内。 就是说,Windows平台是我开始开发的地方,我一直对观察它的发展一直很感兴趣。 将来会有更多SQLPro产品投放Windows。 的iOS SQLPro产品最近已在iOS上发布。 作为台式机开发人员,我很难集中精力开发基于较小触摸的UI。 幸运的是,应用程序中的大多数核心逻辑在iOS和macOS之间共享。 这使我可以花更多时间专注于UI。 我相信SQLPro即将成为iOS上最好的数据库客户端之一。 结论 许多人说macOS独立开发人员无法做到这一点,iOS是前进的道路。 我还不能完全谈谈iOS市场,但是我可以说,有了合适的产品,macOS仍然可以成为成功的平台。 谢谢阅读!

改进的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诊断日志更不那么冗长,更易于使用。

您好,Safari 11上的WebRTC

WebRTC终于来到Safari 今天早上,我醒了,我们所知道的网络已经发生了巨大的变化。 WebRTC的梦想是实现开放Web的无处不在的p2p实时通信。 作为今年Apple出色的WWDC盛宴的一部分,他们在Safari 11中提供了对WebRTC的支持。 是。 现在毫无疑问,在未来的几天,几周和几个月里,将会有很多关于该主题的优秀文章,但是我只想分享我编写的演示应用程序。 眼见为实。 如果您已升级到iOS 11开发人员beta或macOS开发人员beta,则只需转到此处并允许像其他任何WebRTC演示一样访问您的相机即可。 这在移动设备上尤其令人惊奇。 如果您通过移动设备访问,请单击视频以从面向用户的摄像头切换到面向环境的摄像头。 如果您以前使用过WebRTC,则不会有很多重大更改,但是我个人之前没有处理过摄像机的选择,因此,这是我为该演示编写的代码的细分。 首先创建一个 dom元素,并为其提供以下属性。 var video = document.createElement(’video’); video.style.width = document.width +’px’; video.style.height = document.height +’px’; video.setAttribute(’autoplay’,”); video.setAttribute(’muted’,”); video.setAttribute(’playsinline’,”); 下一步,设置您的WebRTC约束,包括视频将面对的方式。 在这种情况下,我希望它面向用户。 var FaceingMode =“用户”; var约束= { 音频:错误, 视频: { faceingMode:faceingMode } } 然后通过传递约束并侦听成功回调来启动getUserMedia 。 如果一切顺利,请将该流作为视频dom元素上的src传递。 navigator.mediaDevices.getUserMedia(constraints).then(function success(stream){ video.srcObject =流; }); 最后,将视频dom元素附加到您的身体上。 document.body.appendChild(video); 只是为了好玩……这是一段代码片段,可通过单击视频在手机上从正面和背面的摄像头翻转。 video.addEventListener(’click’,function(){ […]

WWDC 2017

WWDC的核心,Apple的но,похоже LLVM,Xcode等 苹果,похоже,решили,чтонеплохобылобыподдерживатьC ++。 Вэтомгоду的Xcodeполучилподдержкурефакторингавплюсах,причемто,чтопоказали,выглядитдостаточновкусно – умный重命名,которыйможетвшаблоны,генерациятелметодовподекларации,экстракты – вобщем,то,чтовнормальныхязыкахнормальныеIDEумеютужеочень давно,теперьможетзаработатьивплюсах。 Аможетинезаработать,этожеXcode。 Крометого,вродекактеперьможнозапускатьнесколькосимуляторовсразу,равнокакистартоватьbot’овдляCIпрямонамашинеразработчика,неустанавливаяMacOS的服务器。 苹果LLVMполучилускоренныйLTO,пакновыхпроверок,未定义的行为消毒剂(возможно,онаужеесть,нотеперьможнобудетвключатьитрогатьеёизUI’чикаXcode中),поддержкунесколькихC ++ 17конструкций。 Существующиеуже线程и地址сUI的санитайзерынаучилисьнесколькимновымтрюкамсотображениемихвUI-е。 Dyldполучилграндиозноеобновлениедотретьейверсии(с2005-гопримерногодабылаверсия2)。 Теперьонразделеннатричасти,одна – демон,анализирующийзависимостимеждубинарникамиидинамическимибиблиотекамиикеширующаяихвтакназываемые“倒闭潮”,другая – небольшаячасть,запускаемаяпередстартомприложения,изагружающаяэтисамые关闭,и,наконец,кешдля关闭。 关闭теперьявляетсяихцентральнойконцепцией,посути,этозакешированноезнаниеотом,какиединамическибиблиотекиикакнеобходимозагрузитьдлякаждогоприложения。 苹果обещают,чтостартприложенийдолженускориться。 Крометого,винструментахдобавилиспециальныйтиппроверкидляпрофилировкивременистартаприложения – тогостарта,чтопроисходитпередвызовомнепосредственноmain’а。 Интересныеtalk’и: LLVM中的新功能(тольковтораяполовина)(https://developer.apple.com/videos/play/wwdc2017/411/) 应用启动时间:过去,现在和将来(https://developer.apple.com/videos/play/wwdc2017/413/) 使用Xcode运行时工具查找错误(https://developer.apple.com/videos/play/wwdc2017/406/) 大中央派遣 ВНЕЗАПНОполучилобновление。 ДобавилсяновыйвкусныйAPI,即使用отслеживанияфайловсподписываниемнасобытия。 Крометого,многоговорятотом,насколькоэффективноегоисполозоватьдлямногопотоносто/к Вцелом,разработчикампод的iOSсмотретьобязательно,остальным-толькоеслихочетсяувидетьприятныйинтерфейсдлятаскдиспатчера,ането,чтообычновидите。 现代化大中央调度的使用(https://developer.apple.com/videos/play/wwdc2017/706/) SiriKit Небольшоеэволюционноеобновление。 Улучшилидомен付款(вообщеговорили,чтоегодобавили,но,по-моему,онитакбыл),добавилидомен。 Иеслипоследнийвыглядиткакигрушка(сканированиекодов,какобщепринятых,вродеQR,такикастомных,вродетех,чтоиспользуютсяFacebook的Messenger’ом),то列表和注释смотритсякакнечтодействительнополезное – теперьлюбоеприложениеможетсоздаватьчек-листыили ноуткиспомощьюSiri。 SiriKit的新增功能(https://developer.apple.com/videos/play/wwdc2017/214/) 核心ML То,чтополностьюоправдываетсуществованиеWWDC 2017主题。 Новыйфреймворк,созданныйдляоблегченияработыс机器学习。 И,похоже,этоемуудается。 Приложениючерез的Xcodeскармливаетсяфайлстакназываемоймоделью,вкоторойможетбытьнасамомделеоченьмногоразныхвещей – обученнаянейроннаясеть,кпримеру,хотяподдерживаютсянетолькосети。 关于Xcode,请使用Swift’еилиObjective-C,这是которыйможнотутиетотелиили的完整版本。 Придеплоеприложениясамамодельуезжаетнаустройствоввидебандларесурсов。 […]

CAPluginLayer和CABackdropLayer

最初发表在我的(新的)杂物房中。 私有标头中隐藏着很多很酷的CoreAnimation好吃的东西,但是确实吸引了我的三个私有CALayer类: CAProxyLayer , CALayerHost , CABackdropLayer和CAPluginLayer 。 CALayerHost设计与CARemoteLayerClient/Server相似,因此我将在以后的文章中介绍这两个类。 我对CAProxyLayer了一些实验,因为它用于视觉效果(想想NS/UIVisualEffectView ),或者我不知道正确的常量或没有正确使用它,但是我无法使它可靠地工作而没有麻烦windowserver 。 我将使用代码示例来讨论其余两个。 这个名字很怪异,但是看起来它是为支持windowserver插件而设计的-甚至还有一个vtable,但是到目前为止,仅支持com.apple.WindowServer.CGSWindow 。 这是一个代码示例: let layer = CAPluginLayer() layer.frame = CGRect(x: 50, y: 50, width: 200, height: 200) layer.pluginType = “com.apple.WindowServer.CGSWindow” layer.pluginId = UInt64(self.window.windowNumber) layer.pluginGravity = kCAGravityResizeAspect //layer.pluginFlags = 0x4 // display without a shadow 因此,最大的CAPluginLayer是,现在您只能使用CAPluginLayer实时镜像窗口(其所有UI更改和交互都反映在图层内容中)。 您可以像设置pluginGravity一样设置pluginGravity ,并且唯一已知的pluginFlags值为0x4 ,Dock使用pluginFlags值来显示没有阴影的窗口。 pluginId实际上是指windowNumber (或_realWindowNumber具体取决于您的窗口类型,但这通常不必担心),并且实际上可以是*屏幕上可用的任何窗口! 没错–您可以镜像任何窗口,而不仅仅是自己应用程序的窗口。 为了娱乐,我使用CGWindowListCopyWindowInfo来获取最前面的窗口(不是我自己的应用程序),并使用该ID将其镜像到我的应用程序层中。 […]

框架如何在macOS上工作

即使约束几乎是在macOS / iOS和tvOS上构建UI的默认设置,在某些情况下,框架仍是首选。 macOS上的帧操作与其对应的帧操作非常相似。 与CGRect一起使用时,您会看到对NSRect的引用,但实际上这只是CGRect的类型别名。 但是,存在一个根本区别,就是坐标系被翻转,或者更确切地说,它在iOS和tvOS上被翻转。 这意味着值为零的x坐标始于其超级视图的底部,而不是其顶部。 值得注意的是,这只会影响x坐标,y坐标的工作方式与您期望的一样。 如果您习惯于在iOS和tvOS上计算帧,那么反过来做所有事情都会是一个挑战。 幸运的是,Apple为我们引入了一个属性,以便在我们想要翻转坐标系时覆盖它,以便x坐标或零表示子视图的顶部。 让我们快速看一下一个非常简单的NSView示例中的外观。 从图像中可以看到,子视图位于左下角。 仅需一行代码,我们就可以反转容器视图以获得所需的行为。 如您所见,我们仅添加了isFlipped的覆盖并将其设置为返回true 。 让我们看看文档中关于isFlipped属性的说法。 此属性的默认值为false,这将导致坐标系不翻转。 在非翻转坐标系中,原点位于视图的左下角,并且正y值向上延伸。 在翻转的坐标系中,原点位于视图的左上角,y值向下延伸。 X值始终向右延伸。 如果希望视图使用翻转的坐标系,请覆盖此属性并返回true。 https://developer.apple.com/documentation/appkit/nsview/1483532-isflipped 因此,通过覆盖该属性,该视图坐标系内的所有内容都将被翻转。 请确保注意,将其他子视图添加到基础子视图将不会继承此子视图,并且如果您还希望翻转那些子视图,则必须重写相同的方法。 为了说明我的意思,让我们看一个最后的例子。 就是这样,在macOS上进行基于帧的计算时,不再麻烦。

基于合同的软件架构模式

再次简化软件架构 营销中最重要的规则之一就是倾听其客户需求。 让我们考虑MVVM架构中View客户端的真实需求,注册模型变更通知,以便为他们提供最佳的编码体验,并定义一个架构合同,该合同将满足他们的需求,以严格遵守合同规则。 定义这组需求是为了通过减少此通知调用的外部可变性来减少软件的复杂性:为了获得流畅的体验,当上下文完全由以下内容确定时,只有一种可能的方法可以调用目标函数数据和线程的观点。 此外,该合同应完整并考虑与模型的所有交互:这样,合同就保护了目标功能背后的代码不受应用程序其余部分的影响。 与其编写复杂的代码来管理所有意外的可能情况以解决所有可能的执行情况,不如通过设计减少到唯一的情况并通过合同来强制执行,来减少可能的情况数量。 实施名义上的方案就足够了。 确定每个客户的需求 从市场细分的角度来看,有几种类型的客户: 1)查看内容客户端: 视图内容客户端是视图控制器的功能,负责基于某些模型属性渲染视图。 客户端需要通过其视图模型从模型中读取一组属性:因此,当这些读取属性发生更改时,必须通知客户端。 当所有读取属性都稳定时,客户端要求该通知仅在主线程事件循环中一次 同步发生。 稳定意味着这些读取属性在事件循环结束之前不会更改。 这样可以保证所显示的内容与模型的当前状态完全匹配,而不是其先前状态的过时副本。 客户端可能还需要编写一些模型属性,其他View Content客户端将使用这些模型属性。 在属性写入后,这些订阅的View Content客户应收到其通知。 书面财产应作为合同的一部分。 不允许客户读取或写入不属于合同一部分的任何财产,因为这可能会破坏其他客户的“财产稳定”规则。 在渲染视图时,所有这些都发生在主线程中。 客户端还要求在事件循环结束之前不得删除其视图控制器,这意味着将在接收到此通知之前执行视图层次结构渲染。 该客户端还需要独立于模型对象的存在而注册模型属性,以便与模型对象创建/删除分离:每个模型属性均由源自根模型对象的唯一键路径标识。 这组需求是通知合同的基础: “当这组现在稳定的READ属性中的至少一个发生更改时,我只希望同步地被通知一次,并且我可以读/写其中一些WRITE属性。” 因此,通知调度程序应基于这些联系来计算模型属性之间的依赖关系:如果合同读取A并写入B,则B依赖于A,这将创建模型属性顺序。 因此,通知调度程序应将合同级别计算为读取集的最高属性级别,并按此顺序进行调度。 2)查看层次结构客户端: 视图层次结构客户端是一种视图控制器功能,负责基于一组模型“视图层次结构”属性,通过创建/删除子视图层次结构来修改其子视图层次结构。 该客户端不应向其子视图控制器提供模型属性,而应仅向子视图控制器用于从模型中获取其模型属性的不可变配置数据。 由于视图层次结构更新将从根到叶发生,因此每个视图层次结构客户端均应提供与其层次结构级别相同的优先级编号: 根视图控制器=优先级1 其子级=优先级2 它的子孙=优先级3 等等… 通知调度程序将首先按优先级顺序发送基于优先级的通知,然后再发送与数据相关的通知(例如:查看内容)。 视图层次结构客户端可以写入任何不稳定的视图内容或视图层次结构属性,即不属于优先级相等或较低的优先级合同。 因此,合同如下: “当该组现在稳定的READ(视图层次结构)属性中的至少一个发生更改时,我希望仅在此优先级级别上仅被同步通知一次,并且我可以读/写任何非稳定属性。” 3)标准化,协调,计算数据客户端: 规范化客户端负责解决跟随模型写事务的模型中的任何不一致问题。 协调客户端负责在高层确定应用程序/文档的视图层次结构和上下文,并设置视图层次结构属性。 计算数据客户端负责计算一组属性,这些属性可以由多个视图模型共享,并且应在呈现视图层次结构之前进行计算。 这些客户端具有基于优先级的合同,带有硬编码的负优先级,可以在View Hierarchy客户端之前安排它们。 归一化=优先级-3 协调=优先级-2 计算数据客户端=优先级-1 查看层次结构…优先级为正 查看内容…无优先级/数据驱动 我们可以为客户提供优质服务吗? 当前有许多架构模式被大肆宣传,很明显,它们都试图满足其中一些需求。 据我所知,最接近上述需求的是单向Elm […]

RememBear会为您记住所有密码

记得。 熊。 隧道熊。 得到它? 多年以来,我尝试了很多密码管理器-LastPass,Dashlane,1Password,Bitwarden,但是,我始终不虔诚地使用其中的任何一个。 但是,有了RememBear,我可以看到自己终于使用密码管理器作为习惯。 对于那些想知道是什么促使我写出积极构架的密码管理器评论的人,不,这不是付费评论。 RememBear是由TunnelBear(著名的已建立的VPN服务)的人员构建的。 该产品是跨平台的,适用于Android,Windows,macOS和iOS。 尽管目前不允许在应用程序内部(在Android上)截取屏幕截图,但我会尽全力在文字帮助下向您传达我的经验。 创建新帐户后,RememBear会要求您提供指纹印象(如果您的手机配备了指纹读取器/如果您使用的是带有指纹读取器的MacBookPro)以及自动填充密码的权限。 进入应用程序后,您会看到一个FAB按钮,可让您添加信用卡或登录详细信息。 您可以在此处添加所有用户名,密码和/或卡信息。 尽管该应用程序配备了专用的浏览器,恰当地命名为“ RememBear浏览器”,但是只要您在外部浏览器(例如Chrome Dev)上打开“登录”页面,就会显示一个浮动的RememBear按钮,您可以使用该按钮添加密码或自动填充密码。 通过RememBear应用程序中存在的设置,可以选择退出浏览器,选择退出使用“指纹登录”,更改电子邮件,甚至更改主密码。 在此阶段,该应用程序没有像某些已经建立的付费密码管理器那样的精美功能,例如,可以从密码管理器内部更改专用站点的密码的功能,但是嘿,这是一项绝对免费的服务。

滚动视图如何在macOS上工作

如果您曾经开发过iOS应用程序,那么我猜您已经构建了一次或两次表视图或集合视图。 您可能还熟悉两个UI元素都具有的继承。 它们都继承自UIScrollView以获得滚动行为。 您可能已经猜到了,macOS并非如此。 要为用户增加滚动体验,您将必须实现NSScrollView 。 这不是一项艰巨的任务,但要使其顺畅运行,您必须了解NSScrollView的核心概念,或者更确切地说,是如何将iOS思维方式转换到macOS域。 如果您排除滚动视图本身,则NSScrollView由两部分组成: NSClipView和文档视图。 文档视图是您需要提供的唯一东西才能使它起作用。 由于苹果在提供所有活动部件如何组合方面做得非常出色,因此我不会赘述。 对于我们的示例,文档视图将是一个简单的NSView ,但它可能是表视图或集合视图。 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/NSScrollViewGuide/Articles/Basics.html 对于这些示例,我决定通过使它们易于在操场上使用来提高其档次,只需将代码复制到操场上即可,您应该可以随意修改代码。 我们要做的第一件事是设置要用作滚动视图的文档视图的自定义视图。 我们给它一个比滚动视图更突出的高度,以使其滚动。 文档视图的大小用作滚动视图的内容大小。 因此,如果要水平滚动,则文档视图应比滚动视图宽。 为了给游乐场提供一个很好的例子,我们在自定义视图中添加了渐变,以使滚动更加明显。 因为我们希望滚动视图的初始位置位于顶部,所以我们需要将此信息提供给内容视图,即滚动视图的剪辑视图。 或者,我们也可以在文档视图本身上调用相同的方法,但是我倾向于总是在内容视图上调用它,因为它是非可选的,而文档视图则不是。 将内容偏移设置为子视图框架的整个高度似乎很奇怪。 有关框架如何在macOS中工作的更多信息,您可以阅读我以前的文章之一。 在那篇文章中,我们介绍了一个翻转视图坐标系的小技巧,让我们在此处应用相同的技巧,以了解如何更改实现以使以iOS为中心的框架查看方式更有意义。 现在,我们创建NSView的子类 ,并将属性isFlipped设置为返回true 。 现在我们可以简单地将内容偏移量设置为从零开始,这很容易推断。 就是这样,在操场上射击并旋转一下,最简单的实验方法就是亲眼看看。 有关NSScrollView必须提供的所有内容的更深入的信息,建议您查阅Apple的文档。