Tag: 移动

移动安全性:攻击来自何处?

如今,我们的智能手机包含着我们日常生活中的大量信息,因此保护它们免受恶意人员攻击变得至关重要。 智能手机可以视为一把双刃剑。 一方面,我们得益于其易于使用的方式来与家人保持联系,检查我们的银行帐户,邮件等。另一方面,恶意人员很容易通过窃取您的钱来实现自己的目标,凭证,私人生活等。因此,每个智能手机用户都必须意识到自己可能会遇到的危险,以保护自己。 本文旨在通过展示一些攻击或安全漏洞的示例,使智能手机用户对其安全敏感。 目的不是要吓the读者​​,而是要进行教育,以便他采取更好的预防措施。 让我们先退后一步,分析移动应用程序的生命周期。 开发人员下载SDK 开发人员开发的应用程序可以完成出色的工作 开发人员打包应用程序并将其提交到商店 用户解锁手机 用户在智能手机上下载应用程序 用户使用该应用程序 简化的生命周期的每个步骤都可能受到恶意攻击,如下图所示。 开发人员使用的SDK会影响问题根源的私有数据,这似乎很不可思议。 但不幸的是,这确实发生了。 实际上,有一个名为“ Xcode Ghost”的Xcode修改器版本,它在生成的程序包中添加了间谍软件代码。 修改后的程序包甚至通过了Apple认证! 这里是其他生命周期步骤的更多攻击示例。 攻击和漏洞的一些例子 开发人员开发执行出色功能的应用程序 攻击者可以侦听移动应用程序与服务器之间的网络通信,以拦截敏感信息。 以下是一些攻击示例: 网络欺骗 中间人袭击 对网络交换的其他攻击:https://www.youtube.com/watch?v=8oI_laHhGjE&list=PLSKUhDnoJjYn0TV9V84C4Wr2DjKPc492c&feature=player_embedded 使用不受信任的或公共的Wi-Fi接入点 攻击者可以以表格形式输入恶意数据,以获取对服务器数据库的更高访问权限(SQL注入) http://artechtalks.blogspot.fr/2013/10/sql-injection-in-android-applications.html 开发人员打包应用程序并生成IPA 从iTunes下载IPA并提取plist文件以搜索密码和开发URL 反编译IPA以访问源代码http://reverseengineering.stackexchange.com/questions/1594/possibilities-for-reverse-engineering-an-ipa-file-to-its-source Xcode幽灵:https://en.wikipedia.org/wiki/XcodeGhost 用户解锁手机 即使设备被锁定,对设备具有物理访问权限的恶意人员有时也可以访问该应用程序的禁止访问部分。 http://www.telegraph.co.uk/technology/apple/iphone/11887252/iOS-9-hack-allows-strangers-to-access-photos-and-contacts-from-a-locked-iPhone。 -how-to-protect-yourself.html 用户在智能手机上下载应用程序 恶意软件可以通过下载链接或第三方商店提供经过修改的应用程序。 http://www.cnet.com/how-to/how-to-avoid-pokemon-go-malware/ 用户使用该应用程序:用户使用其智能手机和应用程序的方式容易受到多种攻击。 攻击者甚至可以伪造触摸ID传感器来强行使用用户密码 网络钓鱼:攻击者可以说服用户向其提供密码 该工具会在不知不觉中允许恶意应用访问私有数据 攻击者可以在另一个用户中找到用户的密码 恶意人员可以在有限或无限的时间内物理访问用户的设备。 这使攻击者几乎可以访问设备上的所有信息。 即使使用指纹锁定的设备也不会保存。 这是可以在物理设备上执行的攻击的另外两个示例: 越狱:它允许访问操作系统的许多或所有锁定部分,例如RAM,文件系统等。 有些攻击甚至不需要越狱或解锁设备http://www.techtimes.com/articles/88939/20150929/ios-9-security-flaw-hackers-can-access-your-messages-photos-and-与siri.htm的帮助联系 我们可以注意到,攻击的可能性非常广泛。 根据攻击的类型,所有这些攻击或缺陷都可能以不同的方式伤害用户。 下一节简要给出一些示例。 […]

为什么编码很重要:位和字节入门

那是编码的黑暗时代。 交流很容易中断,普通用户很难弄清楚到底出了什么问题。 此问题是由于使用不同的编码来读取字节序列而导致的。 要了解此问题的症结,我们来看两个关键术语: 位 :信息的基本单位,通常表示为0或1 字节 :固定长度的位序列,通常由8位组成 因此,一个字节将被表示为2⁸= 256个数字,范围从0到255(或以位为00000000到11111111)。 字节中的位被赋予索引。 最右边的位(也称为最低有效位 )的索引为0,最左边的位(也称为最高有效位 )的索引为7。 今天,情况仍然如此,顺便说一句! 至少可以说,使用二进制(或十六进制)表示法麻烦且效率低下。 需要某种编码标准。 这就是奇怪的地方,因为您可能已经猜到,原始位序列的含义根据所使用的编码而改变。 输入ASCII码 ASCII是一种字符编码标准,它使用7位表示基于英文字母的128个指定字符。 0到32之间的数字保留给控制字符,这些控制字符指示如何解释和表示数据。 它们被设计用于打印控制,数据结构和传输控制。 所有未重音的英文字符都使用32到127之间的数字。 这里的关键是ASCII是为不重音的英语字符设计的。 尽管该编码仅使用7位(不使用整个位),但是ASCII不能轻松地用于许多其他语言。 例如,亚洲字母有成千上万个字母,这些字母再也不会适合8位。 许多其他字母都使用重音,例如ˆ ´ , ¨等。 因此,就像美国开发ASCII ,其他国家也创建了自己的编码。 这导致了基于不同语言的需求和细微差别以及需要进行转码的各种代码标准的不一致混合。 实质上,不同的国家/地区具有不同的编码标准。 当计算机问世时,就不可能在为不同标准量身定制的软件之间有效地交换信息。 然后是ISO/IEC 8859 —一种与8位 ASCII向后兼容的编码,由来自拉丁文字的191个字符组成。 它包含各种口音 ,可以完全覆盖南非语,科西嘉语,法罗语,挪威语和许多其他内容。 但是, ISO/IEC 8859仅使用单字节固定长度编码对前256个Unicode字符进行编码,这意味着某些语言仍然不兼容。 例如,考虑为西里尔字母设计的ISO/IEC 8859–5 : 以及GB 18030中华人民共和国的官方字符集: 尽管西里尔字母已集成在ISO/IEC 8859 ,但它不支持中文书写系统。 输入Unicode Unicode是一种计算行业标准,用于对世界上大多数书写系统中表示的文本进行一致的编码,表示和处理。 最新版本的Unicode(9.0)包含超过128,000个字符的库,涵盖135个现代和历史性脚本以及多个符号集。 […]

为什么2018年是移动应用程序终结的开始

今天,我们正迅速接近移动应用的十岁生日。 在2008年夏季,移动领域的两家巨头推出了各自的移动应用程序商店,从那时起,移动应用程序就主导了组织的数字优先级,并成为吸引客户的关键。 在过去的十年中,两家应用商店的用户安装量和每家商店的应用数量均呈指数增长。 移动应用程序提供了快速,便捷,量身定制的体验,使用户可以在旅途中与品牌或组织进行交互,因此这都不是真正的惊喜。 在过去的十年中,移动应用在移动设备上一直没有受到挑战,电子商务的转换率相当高,约90%的用户在移动应用上花费的时间都花在了移动应用程序中(仅约10%的美国用户使用了网络浏览)。 那么,2018年将带来哪些竞争者呢? 好吧…没什么新的。 第一个主要竞争者是移动网络。 是的,我刚才所说的同一网站仅占用移动用户的大约10%的时间。 那我为什么这么说呢? 首先,我想细分该统计数据,因为与浏览网络相比,在移动应用程序上花费的时间确实是不成比例的,但重要的是要考虑使用哪些应用程序。 电子营销商的一项研究谈到了2017年每天移动用户平均在网络上花费50分钟的时间,而在移动应用中平均花费3小时23分钟。 不过,一定要将其置于上下文中,因为MediaKix报告称,我们仅在前五名社交应用中平均每天花费1小时56分钟,从而使其他所有人的实际使用情况在Web和移动应用之间得到了更为公平的分配(50分钟与1小时27分钟)。 Web也是一种功能强大的媒介,Web应用程序和移动应用程序的性能和功能之间不再存在明显的差距。 现在,网络可以离线运行,提供全屏(浏览器外)体验,提供推送通知,处理摄像头和麦克风输入,地理位置等等。 这些技术全部打包在一起,形成一个渐进式Web应用程序(PWA) 。 PWA定义为一种Web体验,它利用现代Web技术的集合来执行与移动应用类似的UX。 遗憾的是,Apple仍不支持iOS上PWA的所有功能,但是iOS 11.3即将推出这种功能。 此外,Web具有许多关键优势,可以弥补移动应用程序的不足。 关键在于Web的可发现功能,搜索是深度搜索 。 网络上的搜索引擎不仅可以像在App Store上搜索应用程序那样简单地搜索品牌,还可以搜索您的内容 ,从而使正在寻找与您一样的内容的用户发现品牌,无论他们对您的了解如何。牌。 除了可发现性之外,幅材还具有完全无摩擦的优点。 无需安装任何东西即可与特定品牌互动,无论是在移动设备还是台式机上。 Google进行的一项关于用户与强制安装应用的互动的研究表明,安装移动应用过程中的摩擦导致69%的访问被放弃。 用户已经发现了您的网站,当他们用来查找您的平台功能强大时,为什么还要增加额外的障碍以使他们能够获得所需的内容。 建立PWA还可以帮助降低开发成本和复杂性。 为什么我们要构建两个(或更多个)具有相同体验的克隆,以处理iOS,Android和Web实施之间的实施差异? 通过PWA,您可以巩固代码库和数字状态,从而减少维护和继续发展数字状态所需的工作量。 PWA旨在跨越移动平台强加的边界。 有大量有力的品牌证据表明,引入PWA可以带来成功。 PWAStats.com致力于强调将现代渐进式Web应用程序视为传统移动应用程序的替代方案的用户体验和业务优势。 例如,FlipKart的PWA吸引了50%的新客户,而60%的PWA用户以前已经卸载了移动应用程序以释放设备空间。 此外,福布斯(Forbes)进行的PWA测试导致平均用户会话时长增加了2倍。 Twitter Lite提供了出色的用户体验,并且在访问Web时的推文数量也增加了75%。 因此,网络是一个严峻的竞争者。 但是,还有另一个新来者为客户参与带来了全新的方法。 在定义我们如何与品牌进行数字交互时,Chatbot类型的界面越来越受到关注。 在2017年至2018年期间,拥有专用语音助手设备(例如Google Home或Amazon Echo)的人口比例增长了两倍,而美国人口的37%打算在2018年底之前拥有这种语音助手设备。 如果我们前面提到过,我们每天花在智能手机上的4个小时左右的时间中,有2个小时位居前五名社交应用程序中,为什么我们不将其用作推动诸如商务等关键品牌互动的手段? 许多组织将社交媒体用于客户服务,但是许多客户希望做更多。 37%的消费者更愿意通过公司的Facebook页面而非网站购买商品。 (HubSpot,2017年)。 对话界面的使用只会随着共享Web和移动应用程序提供的发现和个性化的好处而增长,同时也超越了我们传统的客户参与思想。 对话交互以其他媒介只能梦想的方式使组织变得人性化,从而使客户以全新的方式感知与品牌的关系。 这种对话关系的管理非常重要,并且在接下来的一年中,更多的组织必须专注于将设计问题从简单的“我的品牌外观?”更改为“我的品牌听起来如何?”。 好吧,是的,不是。 移动应用程序当然仍然会存在,但是我认为组织的优先级正在变化。 […]

查看Swift中的装饰

本文适用于开发人员,iOS爱好者以及在确保移动应用程序中的视觉连贯性方面遇到挑战的任何人。 让我解释。 有时,您的移动应用程序中不同类型的元素具有相同的外观,对吗? 他们是连贯的。 通常,实现此目标是有代价的:您最终编写了许多行重复的代码,希望这样做不会使所有内容的可维护性降低,并且在需要时也很难进行更改。 一种可能的解决方案: 常量 。 正确分组并正确使用常量可以解决不一致问题,但是可维护性和代码简单性不会显着提高。 一定有另一种方式…… 在尝试找到一个简单,优雅的解决方案时,我想到了一个接口,该接口定义了一个入口点,用于在整个应用程序中自定义UIKit元素。 这个概念称为ViewDecorator 。 模式的核心是通过以下协议定义的,描述了装饰器对象的行为: 通过将外观包含在这些分隔符对象中,可维护性和可读性得到提高,重复代码行减少了。 想象一下,在更名的情况下修改组件的样式有多么容易。 😄 访问UIView子类的属性 由于协议采用特定的UIView类型,因此在尝试自定义特定的UIView子类属性时可能会遇到问题。 一种可能的解决方案可能是将视图实例转换为decorate(_ view: UIView)内的预期类型,但这会搞乱单一职责原则,并使其在不同种类的实例上的行为有所不同。 相关类型进行救援! 让我们看看装饰器对象如何变化: 很整洁吧? 我很高兴听到您对这个解决方案以及我可能没有想到的有趣用例的看法。 您也可以转到我的博客以获取更多文章。

MapKit的新功能

在WWDC 2017上,Apple宣布了MapKit(其应用程序映射框架)的一些令人讨厌的新功能。 在Trade Me上使用iOS Property应用程序时,地图几乎贴近我的心,所以我仔细研究了WWDC中MapKit的一些更相关的部分。 除了将图钉的外观更新为更适合现代iOS的外观外,气泡内的字形还可以设置为自定义图片或文字,这对于待售物业搜索非常有效: 这导致我们(我认为)是MapKit中最酷的功能-聚类和使用的动画。 看一下这个: 很有希望看到苹果将这些功能添加到MapKit中,因为它们使它们越来越接近竞争对手(即Google Maps SDK,Mapbox等)。 尽管Trade Me Property在搜索结果和Property Insights地图上都使用Google Maps,但在所有客户端(Web,Android和iOS)上,随着Apple增加了更多功能,iOS上的本机地图框架变得越来越有吸引力。 此外,随着WWDC 2018宣布MapKitJS,有一天可能是Android仍在使用Google Maps的奇怪一幕! 该应用程序中使用的表情符号和此帖子是iOS 11的标准配置。该应用程序中使用的图标和此帖子均为其各自创建者的荣誉: 名词项目的Gregor Cresnar进行的谈判 来自Noun Project的Gregor Cresnar拍卖 来自Noun Project的Gregor Cresnar的价格 来自Noun项目的Arafat Uddin的沙漏

使用迭代方法构建活动标签

您是否曾经与一位朋友进行过一项活动,但忘了记录下来? 如果您可以倒转时钟并记得进行录音,那岂不是很棒吗? 或者,也许您与一个没有录音的朋友一起跑步,并且想向Strava介绍。 你不是一个人! Strava社区的成员向我们提交了解决此问题的方法。 此功能请求有200多个注释和300个投票。 在成长团队中, 每项新功能均始于实验,而每项实验均以假设为前提,然后编写一行代码 。 任何新功能的主要假设之一就是人们将实际使用它。 有了来自社区的强烈信号,我们有能力以合理的信心投资于活动标签,以解决我们真正的运动员需求。 2017年底,成长团队开始研究活动标签。 此功能允许运动员将活动发送给忘记记录的朋友。 接收朋友可以接受邀请并将该活动保存到自己的个人资料中。 在此期间,我们的团队专注于增加运动员发送的邀请数量,活动标记是邀请朋友加入Strava的一种非常自然的方式。 活动标记并不是在今天运动员看到的情况下才首次启动的。 我们通过一系列仍在进行的迭代来获得当前版本。 我们构建此功能所采用的过程是我们如何在Strava的Growth Team进行迭代产品开发的完美示例。 通过将A / B测试和用户研究与较短的开发周期相结合,我们能够不断验证我们的假设,并确保我们构建的功能令人愉悦并能满足运动员和业务需求。 这篇博客文章将解释我们如何构建活动标记-我们最喜欢的功能之一,从而对成长团队的开发过程提供一些见解! 在花费较长的开发周期来构建理想功能之前,我们需要在现实世界中快速验证我们的假设。 在进行定于10月底开始的更大项目之前,我们只有两个星期的开发时间来构建和发布MVP(最小可行产品)。 第一步是设计一种可以在这些时间限制内建立的简单体验。 此功能有两个受众:有活动标签的发送者(我们称为邀请者)和有活动标签的接收者(我们称为邀请者)。 邀请者有两种基本体验:在您的活动中标记其他Strava运动员,或将活动标签发送给尚未在Strava上的人,以鼓励他们加入您在Strava上的活动。 作为一个团队,我们决定简化邀请者的体验,并将Strava网络内部和外部的标记体验结合起来,这样我们就只需要构建一个邀请者体验即可。 为了使所有这些工作正常进行,我们利用了“分支指标”链接技术,并依赖于生成映射到有关活动标签信息的URL链接。 当运动员想要标记他们的朋友时,我们创建了这些魔术URL之一,然后该运动员将该链接发送给他们的朋友,并带有诸如“嘿,我们一起进行了此活动,这是一个链接,因此您可以将活动复制到自己的轮廓”。 这些链接会将被邀请者在手机上与他们朋友的活动进行深层链接,他们将能够接受标签并将该活动复制到自己的个人资料中。 如果被邀请者还不是Strava运动员,他们将被带到应用商店,然后在下载时,看到欢迎屏幕,鼓励他们签名并接受活动标签。 我们建立的邀请者体验不是很理想。 我们利用iOS和Android共享托盘,允许运动员发送包含其活动标签的简单链接。 在被邀请方,当运动员点击链接并希望接受活动标签和新用户的简单欢迎屏幕时,我们会在活动页面上建立一个非常简单的横幅。 构建最复杂的软件是当有人接受活动标签时在服务器端创建新活动。 此外,我们保留了时间来围绕该功能构建安全性,因此不会被滥用。 尽管我们相当确定Strava运动员会使用此功能来标记其他Strava运动员,但我们确实希望了解该功能是否会推动新的注册。 我们的假设是,活动标记将比常规邀请吸引更多的邀请。 我们向90%的运动员发起了比赛,有10%的支持者参加了比赛,以确保我们了解此新功能的效果(例如是否会损害通过其他方法发出的邀请等其他指标)。 由于可以在我们的应用程序中非常流行的屏幕(活动屏幕)上访问该功能,因此我们很快吸引了很多运动员使用它。 最初的结果令人鼓舞:运动员发送的活动标签数量是常规邀请的五倍 ,并且我们的核心指标都没有受到此新功能的伤害。 由于我们的目标是构建一个性能比常规邀请更好的功能,因此我们认为这是一次胜利。 在着手构建更好的活动标记版本之前,我们寻找了优化当前邀请者体验的方法。 因为第一个版本相当基础,所以我们坚持进行两个简单的测试。 首先,我们将活动页面上的按钮从带有橙色边框的白色按钮更改为纯橙色按钮。 我们假设更突出的按钮将导致在“添加朋友”上的点击次数增加,结果将发送更多邀请。 在iOS上进行的测试结果显示,有7.6%的运动员在其活动页面上点击“添加朋友”,而同期这一比例为6.5%。 结果,发送的邀请数量增加了11%。 我们还测试了活动页面上按钮旁边的副本。 由于活动页面中包含很多内容,因此我们只能使用一小行作为活动标记功能的入口。 因此,为了快速向运动员传达此功能的价值主张,复制非常重要。 我们的原始副本为“添加尚未录制或尚未在Strava上的朋友”。 […]

iOS可更新订阅概述:条带与应用程序内购买

在iOS应用程序中实现购买的两种常见方法是使用Stripe或Apple的应用程序内购买(IAP)。 这既适用于自动续订订阅,也适用于一次性购买,本文将重点介绍可续订订阅。 条纹:每成功刷卡一次,费用为2.9%+ $ 0.30 IAP:每笔费用的30.0% (每位订户成功进行一年定期付款后降低到每笔费用的15.0% ) 两者的最佳选择是显而易见的。 但是,仅因为您可以使用Stripe或IAP并不意味着您的应用程序将超过Apple的审查程序。 我们正在与换手的钱打交道,因此,如果苹果想要减薪,请不要感到惊讶。 考虑到他们已经构建了可以进行这些购买的生态系统,他们对此有强烈的感觉。 问题是,何时允许您偏离IAP? 您何时必须偏离IAP? 这里的一般规则是,如果您在“应用程序外”出售商品或服务,则必须使用IAP以外的其他支付服务(例如Stripe)。 如果您在应用程序/设备本身(也称为“数字商品”)中提供了出售给用户的所有商品,则您必须使用IAP。 IAP示例 您正在建立运动和卡路里追踪器。 您有一个简单的免费版本,但有一个更为复杂的高级版本。 您打算让您的用户订阅自动续订的每月付款,以使用高级版本。 由于您的应用程序正在提供“数字商品”(也许您使用了HealthKit框架和一些新颖的机器学习技术来分析用户数据并提出建议),因此您必须使用IAP。 条纹示例 您正在构建一个时尚/服装应用程序,您的用户可以在其中订阅一项服务,该服务每月都会根据其大小和喜好为他们量身定制一件新衣服。 由于您出售的是应用程序/设备之外的真实商品和服务,因此您必须使用IAP以外的其他东西(Stripe是一个很好的解决方案)。 灰色地带 总有辩论的余地,但是请记住,苹果拥有最终决定权。 无论您是否相信可以避免使用IAP,都无法决定您的应用程序是否会到达Appstore。 如果您不喜欢它,可以带上您的产品,然后去找自己的另一个Appstore。 可以通过Spotify找到一个很好的例子来尝试降低IAP的高昂成本。 即使Spotify为您提供了真实艺术家的音频内容,但从技术上讲,它仍然是通过应用程序/设备提供的数字内容。 如果您曾经订阅过高级服务,则可能已经注意到规则的这个简化。 还记得尝试获得该订阅的任何磨擦吗? 如果您查看该应用程序,将会发现您无法在iOS应用程序上注册高级服务,您必须访问其网站(我想是免费的)……甚至没有链接。应用中的相应页面。 为了避免30%的高额费用,Spotify愿意在付款流程中遇到一些严重的摩擦。 我敢打赌,Spotify必须做一些严肃的法律体操活动,并且一直在与苹果进行过无数次谈判,以确保确实如此。 您可能会发现自己处在使用“现实世界”商品和服务的应用案例值得商 。的情况下。 假设您有一个应用程序,如果用户订阅了该应用程序,他们将每月从他们所选择的名人那里接到电话,以进行简短的对话(与我一起在这里生活,这个例子只是为了论证)。 这个应用程式有涉及产品的真实人物,但商品仍然是数字化的。 在这种情况下,您应该联系Apple。 以我的经验,他们可能无法给您一个简单的答案,您可能需要等到Appstore审查。 在这种情况下,我认为最好在应用程序的不同版本中同时实现IAP和Stripe,以便您对他们的游戏时间决定做出反应。 我将假设任何尝试实现自动更新订阅的iOS应用都有一定程度的优势 强大的服务器组件 ,可能是多平台应用程序 (Web应用程序,Android应用程序等)。 我还将假设您的应用程序具有一些用户和身份验证的概念。 如果您要为不具有服务器组件的应用程序进行自动可续订(所有内容均已在应用程序本身中解锁),则您肯定会使用IAP,属于少数群体,并且可能希望考虑其他收款方式(付费应用,不可续订的订阅等)。 您仍然可以使用IAP自动续订(我个人不会),但是我接下来要说的大部分内容都不适用于您。 以下是在不同关注领域中使用Stripe和IAP进行可更新订阅的区别。 UI / UX Stripe:您可以混合使用Stripe UI元素(例如付款信息集合ViewControllers)和所需的任何自定义UI。 […]

Swift的最佳图像下载,处理和缓存库

大家好! 我想介绍一下我最新的下载,处理和缓存管理器库选择。 更新:2017年12月1日。 PINRemoteImage PINRemoteImageManager使用下载和处理任务的概念来确保即使多次调用下载或处理图像,也只会发生一次 安装 使用CocoaPods将PINRemoteImageManager添加到您的项目中。 只需将以下行添加到您的Podfile中即可。 pod’PINRemoteImage’,’〜> 3.0.0-beta’ 然后运行: pod install SDWebImage 该库提供了具有缓存支持的异步图像下载器。 UI元素有类别,例如UIImageView , UIButton , MKAnnotationView 。 安装 使用CocoaPods将SDWebImage添加到您的项目。 只需将以下行添加到您的Podfile中即可。 pod ‘SDWebImage’, ‘~> 4.0’ 莫阿 Moa是使用Swift编写的图像下载库。 通过设置其moa.url属性,它允许下载图像并在图像视图中显示图像。 安装 使用CocoaPods将Moa添加到您的项目中。 只需将以下行添加到您的Podfile中即可。 pod ‘moa’, ‘~> 8.0’ 然后运行: pod install 文森特 一个小型图书馆,可以轻松下载和显示远程图像。 安装 使用CocoaPods将Vincent添加到您的项目中。 只需将以下行添加到您的Podfile中即可。 pod ‘Vincent’, ‘~> 1.5.4’ 然后运行: pod install 翠鸟 Kingfisher是一个轻量级的纯Swift库,用于从Web下载和缓存图像。 […]

SwiftNIO的协议缓冲区

总览 您可以在.proto文件中定义消息模式,然后使用protobuf编译器为您的语言生成数据结构,从而减少编写样板分析和数据访问代码的过程。 然后,您可以与系统的其他部分共享此.proto文件,并为这些语言生成数据访问类。 例如,您可能有一个Java后端以及一个iOS,Android和Web前端,它们都共享此.proto文件来定义共享模式。 优点 Protobuf设计为快速而紧凑。 根据Google的说法,协议缓冲区比XML 小3至10倍,并且快20至100倍 。 Protobuf与语言无关,并提供向后兼容性。 您可以使用完全不同的语言,用新的高性能系统组件替换旧的缓慢系统组件,并确信只要您使用相同的.proto模式,系统就可以继续工作。 实际上,您甚至可以在.proto文件中的消息格式中添加新字段,并且系统将继续运行。 具有旧.proto系统在解析时将仅忽略新字段。 缺点 Protobuf并不适合所有人,尽管它们支持多种语言,但可能不支持您的语言。 XML和JSON比Protobuf更具可读性。 由于它们的设计紧凑,因此当它们通过网络发送时,protobuf会删除字段名称。 仅当您具有.proto文件时,protobuf才有用。 Google设计了用于应用程序间通信的协议缓冲区。 如果您正在构建供外部消费者使用的公共API,则您确实不希望服务器的客户端使用您定义的.proto文件,为其服务生成数据访问类并以这种方式与您的服务进行通信。 入门 您将需要protobuf编译器来生成特定于语言的文件。 这里有安装说明:https://github.com/apple/swift-protobuf。 由于已经安装了Homebrew,因此选择了Homebrew选项。 $ brew install swift-protobuf 注意:此安装可能需要一些时间… 要检查其是否正确安装,可以键入: $ protoc-版本 //我的输出是libprotoc 3.5.1 .proto Protobuf使用扩展名.proto作为其文件格式。 您创建.proto文件来定义您的消息传递模式,然后运行protobuf编译器生成您的Swift代码。 您可以使用任何IDE或文本编辑器来创建.proto文件,包括Xcode。 但是,我不喜欢使用Xcode的原因是缺少适当的缩进和语法突出显示。 我最终在他们的市场中使用了VS Code以及免费的vscode-proto3 protobuf扩展。 现在,我们已经安装了protobuf编译器,让我们创建一个将通过网络发送的Movie类型。 创建一个名为movie.proto的新文件。 .proto文件的第一行是要使用的协议缓冲区版本。 在撰写本文时,我们将使用最新版本proto3。 语法=“ proto3” 接下来,我们使用message关键字声明消息类型。 对于我们来说,这将是Movie类型的消息。 消息电影{ } 接下来,为电影类型声明一个枚举。 您可以在全局范围内的message外部声明一个枚举,但是对于我们的示例,由于流派正在描述电影,因此我们将在Movie内部声明它。 消息电影{ […]

升级到Swift 3

它在这里! XCode 8已经发布,未来就在眼前! 好的,所以也许我反应过度,但是我们对此版本感到非常兴奋! 因此,大约三周前,我们面临着将iOS应用程序升级到Swift 3的早期挑战。 这就是我们所看到的。 通常,XCode会尽最大努力为您提供帮助。 但是,与任何升级/迁移一样,它无法解决所有问题-并且会在开始之前警告您有关此问题的详细信息(因为它与您的独特系统有关)。 首先-当然,在执行此步骤或任何与此相关的升级之前,请确保已完成所有其他更改,以便在出现问题时可以轻松地从中恢复。 尽管您必须在此过程中密切注意,但许多步骤还是非常重复或相似的。 一旦有了正确的心态,您甚至可以在其中找到一些快乐。 更不用说您可以进行的所有重构! 告诉你我们很兴奋。 因此,Apple为您提供了一个很好的参考资料,以使此过渡尽可能顺利。 但是从我们的试验中,这里有更多技巧。 确保您正在使用的所有库都支持Swift 3.0。 即使大多数流行的都进行了过渡,但仍有可能仍在进行中。 在Chromatic FM中,我们正在使用CocoaPods,并且要尽早进行迁移,我们需要修改Podfile使其指向未发布的分支。 您可以转到库的GitHub页面并检查那里的分支swift-3分支很可能在那里。 如果没有,那么-如果可能的话,就应该开始-为开源社区做出贡献是一件很棒的事! 无论如何,这里是指向不同分支的重要资源。 您的Podfile如下所示: pod ‘Alamofire’, :git => ‘https://github.com/Alamofire/Alamofire.git’, :branch => ‘dev’ 分支发布后,您应该切换到更新的版本。 迁移之前,请确保已提交与您无关的更改,并且项目状态为干净。 如果您的项目不受源代码管理,则至少需要在本地启动存储库。 Git是免费的,可以在这里找到。 在迁移期间,请尝试注意项目中的所有功能。 有时,迁移器不会自动尝试为您修复它们,但是存在的风险是,仍可以更改命名。 Swift为第一个参数添加了一致的标签,因此您可以更改方法名称,使其更短,更精确。 例: func foo(bar: Int) => func foo(_ bar: Int) 默认情况下,闭包现在不转义。 这是发生什么情况以及原因的详细说明。 如果您的封口@escaping了身体,请确保已将其称为@escaping 。 酷,对!! 并祝大家好运! […]