Tag: ios

运行时– Sam Wuu –中

为什么需要运行时: Objective-C是⼀门动态语言⾔,它替换⼀一些⼯作放在代码运⾏时才处理⽽并⾮编译时。也就是说,有很多类和成员变量在我们编译的时是不知道的,⽽在运⾏时,我们所编写的代码会转换成完整的确定的代码运⾏。 因此,编译器是不够的,我们还需要⼀个运⾏时系统(运行时系统)来处理编译后的代码。 苹果和GNU各⾃维护⼀个开源的运行时版本,这两个版本之间都在努⼒保持⼀致。 运行时常用接口方法 NSObject类定义的方法 运行时库函数的直接调用 运行时相关术语的数据结构 SEL ID IMP 运行时消息发送和消息转发 消息发送: [people writebook:@”156″];会被编译成: objc_msgSend(people, @selector(writebook:), @”156″); objc_msgSend的具体流程如下: 通过isa指针找到所属类 发现类的缓存列表 ,如果没有则下一步 发现类的“ 方法列表 ”(class_method_list) 如果能找到与选择子名称相符的方法,就跳至其实现代码 找不到,就逐步继承体系继续向上查找 如果能找到与选择子名称相符的方法,就跳至其实现代码 找不到,执行“ 消息转发 ”。 消息转发 : 动态方法解析:先问接收者所属的类 ,你看能不能动态添加个方法来处理这个“未知的消息”? 如果能,则消息转发结束。 + (BOOL)resolveInstanceMethod:(SEL)selector // selector : 那个未知的选择子 // 返回YES则结束消息转发 // 返回NO则进入备胎 后备接收者:动态方法解析失败,则调用这个方法 – (id)forwardingTargetForSelector:(SEL)selector // selector : 那个未知的消息 // 返回一个能响应该未知选择子的备胎对象 […]

iOS版Painnt简介

欢迎! 感谢您安装Painnt。 我们做了很多工作,为您提供了功能强大且易于使用的工具,可将您的照片真正变成精美的艺术品。 以下是一些基本步骤,可帮助您逐步成为一名高级数字艺术家。 对于我们有任何本文未解决的问题吗? 请联系feedback@moonlighting.io ,我们很高兴收到您的来信! 使用Painnt基本上需要4个步骤: 选择您要使用的样式 选择您的输入照片 预览和调整样式 保存并分享您的结果 警告 ! 使用Painnt可能会上瘾,并且您可能会被困几个小时! :)。 让我们详细介绍这些步骤。 1.选择一种风格 在主屏幕中,您可以浏览可用的不同样式。 任务是选择您喜欢的一个! 新样式将首先显示在主屏幕上,如果向下滚动,则会在类别(马赛克,经典,三重奏等)中找到它们。 注意:某些样式仅供订阅,并带有Gem图标标记。 对于本文,我们选择了“葡萄酒”样式。 2.选择您的输入 屏幕中间会出现一个弹出框,您可以在其中选择导入照片的来源: 照片库:从相机胶卷中选择照片 拍照:打开相机并拍摄照片以进行造型 画布:对任何绘图进行涂鸦或草绘,然后对其应用样式(仅限订阅) 选择后即可裁剪照片 拖动白色选择角以裁剪图像。 选择第三个图标(“完成”之前)以更改裁剪比例(正方形,原始,16:9等),或点击圆圈箭头以更改图像。 3.预览和调整样式 在下一个屏幕中,Painnt允许您自定义每种样式的设置并观察照片的变化。 专家提示:如果您只想跳过此步骤,只需点击右上角的“保存/共享”图标即可继续保存和共享您的结果。 Painnt是一个PRO工具,并提供许多设置来调整照片的外观! 您可以通过向下滑动并滚动预览照片下方的白色区域来查看所有设置。 在此处找到备忘单,以了解每种设置如何修改您的照片。 专家提示:您可以在预览照片和设置之间调整分隔线,以调整更多或更少的空间。 所做的更改需要一点时间才能应用,因此,如果您移动滑块,则需要一到两秒钟来进行更新。 输出将确定最终艺术品的尺寸。 这始终取决于原始图像的大小和设备的处理能力-但通常输出的大小将是: 中:700像素 高清:1200像素 FHD:1920像素( 仅限订阅 )。 4K:4000像素( 仅限订阅 )。 来源:输入的原始大小( 仅 订阅 )。 专家提示:我们有输出尺寸/高清指南,供您参考。 当您准备好查看最终结果时,请点击屏幕右上方的“保存/共享”图标以创建您的杰作。 […]

代客击败OS X钥匙串访问控制列表零日漏洞

我们如何使用测试驱动的开发来复制攻击向量并针对它加强代码 抬起头,我们已经搬家了! 如果您想继续了解Square的最新技术内容,请访问我们的新家https://developer.squareup.com/blog 由 Dan Federman 撰写 。 世界着火了 6月17日,The Register报告说,iOS和OS X钥匙串中存在一个零日漏洞,该漏洞破坏了钥匙串中存储的安全数据。 该文章声称,写入到钥匙串的数据可以被恶意应用程序读取。 在Square,我们编写可转移资金的iOS代码。 安全始终是我们的头等大事,我们非常重视这些要求。 如果这篇文章的主张是正确的,那么世界就着火了。 在太平洋标准时间上午8点过后,当我们意识到该漏洞时,我们立即打开了描述该攻击的文件。 我们发现该攻击的工作方式如下: 恶意应用会在钥匙串中搜索良性应用编写的密钥。 恶意应用程序可以看到密钥存在,但无法读取关联的秘密值。 恶意应用会删除良性应用编写的密钥。 然后,恶意应用将密钥重新添加到不包含值的钥匙串中,并将自身和良性应用添加到密钥的访问控制列表(ACL)中,从而允许恶意应用读取良性应用随后写入这些密钥的所有机密信息。 在这一点上,我们可以松一口气:访问控制列表仅存在于Mac OS X上,而不存在于iOS上,因此尽管出现了头条新闻,但我们的应用程序并不容易受到攻击。 但是,两周前,我们刚刚开放了开源的Valet,这是一个跨平台的钥匙链包装器,其OS X组件很容易受到攻击。 这是我们无法接受的,因此我们加强了代客抵御这种攻击的能力。 有毒的工具 Apple的钥匙串仅提供三种用于更新钥匙串的工具:添加,更新和删除。 但是我们现在知道在OS X上,更新本质上是不安全的。 我们不能相信钥匙串中的现有钥匙没有受损的访问控制列表。 因此,我们仅需添加和删除即可。 解决方案似乎很明显。 更改钥匙串中某项的值时,与其更新现有的钥匙串条目,不如删除现有的项然后添加一个新项。 但是Apple的文档非常清楚:请勿删除然后添加-始终更新。 为什么? 因为“ [删除钥匙串项目时,您将丢失用户或其他应用程序添加的所有访问控制和信任设置。”虽然听起来不祥,但这正是我们想要的效果。 更好的是,此警告不适用于Valet,后者使用安全的共享访问组而不是ACL在OS X和iOS上共享钥匙串值。 检验假设 我们的第一步是编写一个单元测试来检验我们的假设。 我们希望测试尽可能地模仿攻击。 因此,我们首先在ACL中具有多个应用程序的钥匙串中插入一个钥匙。 使用与测试VALValet相同的基本查询来添加此泄露密钥,以便我们的代客能够读取和写入该泄露密钥。 VALValet * valet = [[VALValet分配] initWithIdentifier:@“ MacOSVulnTest”可访问性:VALAccessibilityWhenUnlocked]; NSString […]

如何从iPhone空投到Mac和从Mac空投到iPhone?

在谈论空投之前,您需要了解空投。 什么是空投? 空投是Apple设备之间的共享功能。 Airdrop在iPhone和iPad中将蓝牙与Wi-Fi结合使用,而在Mac中仅使用Wi-Fi。 在本文中,我将指导您如何设置Airdrop以将文件从Mac共享到iPhone,反之亦然。 在进行任何操作之前,请检查以下要求。 Mac和iPhone之间的空投功能要求 Airdrop不适用于所有MacBook。 因此,您必须具有Airdrop支持的Apple MacBook和其他Mac计算机。 我在此处列出了按年份列出的Airdrop支持的MacBook和其他Mac计算机型号。 MacBook Air(至少2012年或更高) MacBook Pro(至少2012年或更高) iMac(至少2012年或更高版本) Mac mini(至少2012年或更高版本) Mac Pro(2013或更高版本) iPhone 5或更高版本 iPad Pro iPad(第4代及更高版本) 小型平板电脑 在Mac上准备空投 在Mac上打开一个Finder窗口。 点击“空投”。 单击“允许我被发现”,然后选择“所有人”。 4.打开Wi-Fi和蓝牙。 在iOs设备上准备空投 打开控制中心。 确保您已经打开“空投”并将其发现给所有人。 在iPhone和Mac之间共享文件,反之亦然 如果您完成了上述所有设置,请返回Mac计算机并单击“空投”。 然后,您将看到附近的空投用户。 现在,您可以共享文件,并将要共享的文件拖到窗口中的收件人的图像上,然后单击“发送”。 如果您不想接收共享文件,只需点击“取消”即可。 从iPhone到Mac的共享过程也相同,反之亦然。 现在,您可以使用Airdrop在iPhone和Mac之间共享文件。 但是有时候,您可能会遇到连接问题。 例如,找不到或搜索任何收件人。 如果您遇到此问题,请检查以下提示。 防火墙设定 如果您在Mac的防火墙设置中阻止了所有传入通信,则无法共享文件。 因此,您需要关闭防火墙设置。 转到Apple图标菜单,然后单击“系统偏好设置”。 转到“安全和隐私”。 在“安全和隐私”窗口中有四个菜单,然后单击“防火墙”选项。 取消选中“阻止所有传入通信”,然后应用“确定”。 现在,您可以在Mac计算机中查看所有可共享收件人的iOs设备。 结论 尽管Internet上提供了Airdrop替代软件,但这是在iOs设备和Mac计算机之间共享文件的官方方式。 我建议您使用Apple提供的官方方式。 […]

24小时内的应用程序:我的React Native体验

对于最终版,我删去了一些功能,而略过了其他功能,例如菜单栏,上/下投票动画以及最重要的是语音搜索。 这是一个有趣的小项目,I̶̶a̶m̶̶c̶u̶r̶r̶e̶n̶t̶l̶y̶̶d̶e̶b̶a̶t̶i̶n̶g̶̶o̶n̶̶w̶e̶t̶h̶e̶r̶̶t̶o̶̶o̶p̶e̶nlisht̶i̶n̶t̶l̶y̶n̶-̶ React Native是一个很棒的JS框架,用于构建应用程序,我已经利用该框架构建跨平台应用程序的功能开发了我的第一个功能齐全的android应用程序。 RN非常适合真正的基本应用程序,这些应用程序在应用程序商店中占很大比例。 对于游戏或其他广泛交互和自定义应用程序等其他热门游戏,坚持使用Swift / Objective-c或Java等本地语言将是您的最佳选择。 我肯定会越来越多地使用RN,看看在2017年将带给我什么。 ✌🏾 该项目现已在Github上开源 Apple拒绝了Urban Dictionary应用程序,因为它与现有应用程序过于相似。 🤷🏽‍

CocoaPods的本地开发

CocoaPods使您的应用程序模块化和集成外部库或框架变得非常容易。 但是,对于更特定的应用程序,该工具会很快达到其极限。 问题如下:我的库是通过我的回购的master分支克隆的。 要测试更改,必须将它们合并到master分支中,并提供一个version标记。 解决方案:本地podfile,该文件不吸引版本,但直接从目录获取源。 创建本地Podfile 首先,您必须创建一个名为“ Podfile.local”的新文件。 现在,您可以在此处覆盖依赖关系。 内部Pod的定义应在Podfile中覆盖。 我们可以通过简单添加以下红宝石线来做到这一点: 修改后的podfile现在应该看起来像这样: 忽略本地文件 在.gitignore中包含本地文件很重要。 否则可能会意外检查文件。 如果应用是通过Jenkins和/或Fastlane构建的,则本地文件也会被吸引,而不是master分支的文件。 我总是在.gitignore上有Podfile.lock和Podfile.local 。

ARKit和SceneKit入门

尽管增强现实技术已经存在了很多年,并且基于目标的体验的准确性不断提高,但是诸如PokémonGO等游戏的普及以及Apple发行的ARKit和Google的Android的AR Core的推出AR掌握在大多数消费者手中。 凭借能够了解您周围世界的无目标AR的能力,我们有机会打造出引人入胜的新AR体验。 随着新能力的出现,我们在创造这些体验的工作中将面临新的挑战。 在接下来的几篇文章中,我们将逐步建立各种流程,获取3D模型,对其进行处理并将其用于我们自己的AR体验中。 可以在https://github.com/AbovegroundDan/ARTutorial_Part1上找到此文章的项目。 基本 我们的ARKit应用程序将使用SceneKit进行渲染。 SceneKit是适用于iOS的本机3D渲染引擎,可直接与ARKit挂钩。 3D模型格式 SceneKit中有一些可用的本机格式可用于加载3D模型,但我们将专注于Collada Digital Asset Exchange或DAE格式。 DAE格式使我们可以在场景文件中包含多个对象,包括相机和灯光以及任何几何图形。 SceneKit具有用于加载场景文件的例程,我们将编写一些扩展程序以简化加载。 要编辑3D模型,我们将使用Blender,因为它是免费的并且可以满足我们的需求。 尺寸和单位 SceneKit使用仪表作为尺寸调整和物理模拟的度量单位。 因此,当我们看到任何涉及尺寸的内容时,包括Xcode中的“场景编辑器”,它始终是指米。 在Blender中,我们还需要确保以米为单位工作。 Blender的默认值是米单位,但是检查总比处理场景中的巨型或微小模型要安全得多。 在Blender的右侧面板中,选择“场景”选项卡,并确保将“单位”设置为“默认”或“仪表”。 坐标系 SceneKit在“ Y向上”系统中运行,这意味着Y轴朝上,而Blender的Z轴朝上。 在导出场景并将其加载到SceneKit时,我们需要意识到这一点。 通常这不是问题,因为出口商通常会负责转换。 根据您使用的是自定义导出器还是在不同的坐标系中工作,可能需要在建模应用程序内部旋转模型。 管道 从艺术家那里获得模型或自己完成所有工作时能够快速工作的秘诀是拥有良好的工作流程。 在这种情况下,我们需要一个良好的管道来以尽可能少的按摩和处理将模型带入我们的经验。 搅拌机加工和出口 我们首先要考虑的是我们是否要使用AR世界中文件中的模型来源。 在此示例中,我们将直接从3D模型文件创建AR场景,因此我们不会做太多更改。 确保稍后进行更简单的导入的一件事是确保文件路径是相对的,以便以后稍后导入或必须将文件传输到另一台计算机时,纹理的路径将继续指向有效文件。 归一化 我建议将每个模型的当前位置,旋转和比例标准化为基准值。 例如,如果在建模过程中将模式缩放为(0.87,0.92,0.87)以更好地适合场景,则应用该缩放将使当前缩放为(1.0,1.0,1.0),但将模型保持在该大小你有过。 这可能会干扰设置为特定值的动画,但是对于静态模型而言,它可以很好地工作,并且如果我们要设置比例或旋转值的动画,可以让我们在代码中进行某些假设。 为了规范当前值,我们必须使用Blender的Apply选项应用于对象。 通过单击场景层次面板旁边的+按钮,打开属性面板。 选择模型将向我们显示以下属性。 在这里我们可以看到对象具有旋转和比例。 我们将删除对象上的旋转,但将比例保持在它们所处的值(这是我们的美术师打算如何显示对象),但是我们要做的是将这些值设为默认值或身份值。 选择对象后,我们从底部菜单栏中选择“ 对象”->“应用”->“旋转和缩放”菜单项。 完成此操作后,我们可以看到旋转值分别为(0,0,0),缩放比例为(1.0,1.0,1.0),正是我们想要的值。 在这种特殊情况下,这些对象是单独的网格对象,我们现在要做的是将它们组合在一起,以便我们可以整体上操纵这些对象。 让我们创建一个父转换并将所有这些对象作为其子对象。 从3D视图底部的“添加”菜单中,选择“ 添加”->“空”->“平轴” 。 在“层次结构”视图中,将“ Empty”对象重命名为“ […]

App Store 2018提示和清单

Apple的App Store在2017年9月启动iOS 11时进行了重大修改。多年来,移动设备上的App Store看起来相同,并提供功能和顶部图表部分,但现在所有这些都已更改。 苹果公司解释说,更改是为了使应用程序在App Store中更容易被发现。 用户可见的主要变化是: 1)没有收益图表。 2)应用程式和游戏有不同的热门排行榜。 3)新的“今日”部分与编辑人员故事一起手动策划。 4)在应用内购买的应用,作为单独的产品在App Store中进行。 UI的更改也着重于为用户提供更好的体验。 这些更改包括: 1)较短的应用名称和新的字幕字段。 2)自动播放视频预览。 3)用户在搜索中看到三个垂直屏幕截图(之前两个)或一个水平屏幕截图(之前一个半)。 4)由于评论已移至顶部,因此更加重视评论。 5)还有更多查看顶部图表的步骤,它会影响该部分的受欢迎程度。 在主要部分,免费和付费图表仅显示三个应用程序/游戏。 6)开发人员现在可以显示多达10个屏幕截图(以前只有5个),以向客户展示更多的应用程序体验。 那么如何从App Store 2018中获得最大收益呢? 从App Store Optimization(ASO)的角度来看,App开发人员应确保: 1)他们的应用标题受新应用名称限制(最多30个字符)。 现在无需使用关键字向应用标题发送垃圾邮件。 使其简洁明了。 2)应用程序元数据中使用了新的字幕字段。 使用应用字幕来吸引用户的号召性用语(例如,立即下载应用)。 它可以导致20%的下载量。 (来源,splitmetrics.com) 3)对于垂直屏幕截图文本,请使用较大的字体。 以前使用的任何字体大小都应该增加,因为即使在较大的iPhone X熨平板上也很难阅读文本。 4)添加新的Apple API来收集应用程序中的评论。 它将大大增加评论量(根据Apptentive最多可提高30%)。 现在,用户每年仅需3次即可进行应用审核,因此请明智地要求进行审核。 最好的时机是让用户体验到积极的情绪后再查看您的应用。 用户可能会在您的应用中获得任何形式的奖励或赢得级别之后。 当用户赢得胜利时,他们更有可能对您的应用进行正面评价。 5)填写新的促销文本字段。 它没有建立索引,但是是在应用程序中宣布交易或销售的好地方。 目前,应用程序描述页面在通过审核过程后不可编辑。 促销文字字段应用于以后可能发布的所有公告。 促销文字显示在应用程序描述文字的顶部,从用户角度看,它就像一个字段。 6)将所有丢失的元数据添加到应用内购买中,以使它们符合Apple的功能。 推广的应用程序内可见,可以通过App Store搜索或在应用程序页面上购买。 7)与以前的仅限屏幕截图版本相比,制作出色的预览视频并评估应用程序页面性能(通过iTunes Analytics)。 自动播放的视频可以为您的应用(尤其是游戏)获得更多下载。 […]

我在React-Native和iOS之间集成的经验

好吧,这是我第一次使用React Native,但不仅是第一次与本地iOS应用程序集成。 项目配置 通常,我从Facebook官方文档开始: 与现有应用程序集成·React Native 从头开始新的移动应用程序时,React Native很棒。 但是,它对于添加… facebook.github.io 也很好。 必备的先决条件是已安装npm ,即JavaScript的软件包管理器。 一切都非常简单: https://nodejs.org/en/download/ 最后我执行: $ npm -v 我看到我已经安装了版本5.6.0 除此之外,建议安装: CocoaPods ,用于Objective-C,Swift和在Objective-C运行时上运行的任何其他语言的依赖项管理器。 为了便于安装,我使用Homebrew (macOS缺少的软件包管理器)进行安装: $ brew安装cocoapods 好的,您可以开始设置项目了。 在iOS项目中,我创建了一个“ js ”文件夹,其中包含React-Native项目。 首先,在此文件夹中,创建具有以下结构的文件“ package.json ”。 请注意,我的应用程序称为“ StoryReact” 该应用无法生成,“ Yoga-internal.h”文件似乎存在错误。 经过一些在线研究之后,我决定在GitHub上创建一个问题,但是我得到了负面的反馈,我将不得不手动更改框架的代码。 但是我不喜欢它作为解决方案,因此我尝试切换到另一个版本 。 然后我删除: “豆荚” “ Podfile.lock” “ js / node_modules” 在阅读到从0.54到最新版本的版本都给出了相同的问题之后,我回到终端并安装了React-Native的版本0.51.0 。 因此,我将执行与之前相同的命令,以使用pod在项目上安装react-native和依赖项,相反,包括对Podfile的更改: $ yarn add […]

使用无构建测试,xctestrun和Fastlane加速iOS CI

PS:这篇文章最初发表在我的个人博客上; XCBlog 在这里 在WWDC 2016上,有一个关于“高级测试和持续集成”的精彩演讲,其中提到了XCTest Framework,Xcode-Sever和xcodebuild命令行工具中的许多新功能。 我们可以使用这些功能来加快iOS持续集成过程。 当前的iOS CI限制 在Xcode 8之前,我们必须在CI上运行单元测试和UI测试之前构建,编译和应用程序,这是正在运行的任务的重复。 分布式测试非常耗时,而且我们已经在每台机器上构建和编译源代码。 实际上,在CI Server上进行构建和编译需要花费大量的构建时间。 Xcode 8和xcodebuild功能 Xcode 8版本在“ xcodebuild”中购买了几个新功能,可以为iOS开发和测试过程增加很多价值。 “ xcodebuild”是用于从命令行构建,运行和执行我们的应用程序的命令行工具。 在Xcode服务器中使用。 Xcode 8现在在xcodebuild命令行工具中进行了一些改进。 测试构建 xcodebuild现在具有“ build-for-testing”选项,它像往常一样采用工作区方案和目标,但是最重要的是它将创建“ XCTESTRUN”文件。 我们只需要执行“测试构建”操作 $ xcodebuild -workspace -scheme -sdk iphonesimulator -destination’platform = iOS Simulator,name = ,OS = 10.2’构建测试 这应该构建用于测试的应用程序,并在DerivedData中创建xctestrun文件。 无需构建即可测试 xcodebuid还具有另一个名为“ test-without-building”的选项,在这里我们不需要提供工作区,而是指定XCTESTRUN文件,该文件将注入该文件并运行所有测试。 此功能对于分布式测试非常有用,因为我们可以在一台计算机上创建XCTESTRUN文件并分发到其他特定于测试的计算机。 为了使用它,我们可以在不构建的情况下将此选项指定为ru测试 $ xcodebuild -workspace -scheme -sdk iphonesimulator […]