Tag: iOS应用开发

快速浏览类型擦除

如果您正在编写Swift,那么您可能已经听说过类型擦除。 也许您甚至在使用它。 但是,即使您属于这两个阵营中的一个,也有可能实际上不知道为什么类型擦除有效。 ♂️ 与其给您提供有关如何擦除类型的方法,不如让我们实际研究问题所在并逐步解决。 问题 假设我们正在制作一个通用网络会话类,该类必须支持各种JSON反序列化器,这些反序列化器返回的对象与网络会话的关联类型匹配。 像这样: 这很烦人,但确实有道理。 我们的协议JsonDeserializer是抽象类型,因此Swift编译器无法推断其引用的具体类型,也不能假设其在编译时由其associatedtype提供的类型。 Hector Matos在他的博客KrakenDev : 简短的答案是:Swift希望是类型安全的。 再加上它是一种提前编译的语言,并且您有一种需要NEEDS能够在编译期间随时推断具体类型的语言。 我不能太强调。 在编译时,不是函数/类约束的每个类型都需要具体。 协议中的关联类型是抽象的。 这意味着它们不是具体的。 他们是假的。 没有人喜欢假货。 因此,尽管此错误令人不快,但确实有道理-并且该错误告诉我们一些重要的信息。 指出,该协议只能用作通用约束 ,即在尖括号之间。 尝试1 我们知道,将JsonDeserializer用作类型约束的唯一方法是在使用它,但是出于参数的考虑,我们决定使用协议约束来指定一种类型,就像我们对泛型类的处理方式一样。 结果如何? Cannot specialize non-generic type ‘JsonDeserializer’ ❌ 虽然这是预期的。 正如我们前面所讨论的,该协议是一种抽象类型,尽管它可能具有通用要求,但它本身并不是通用类型。 不是class SomeType { … }方式。 尝试2 好吧,让我们尝试使用JsonDeserializer作为一般约束,并将反序列化器放入一个代理对象,我们将其称为DeserializerBox (此处使用Box是为了与以后的类型擦除命名约定保持一致)。 这个错误告诉我们我们需要提供一种类型来满足DeserializerBox的通用类型要求。 不幸的是,这意味着要指定一个JsonDeserializer 。 但是,我们想使用任何为我们提供Payload类型对象的JsonDeserializer ,因此指定特定的反序列化器具体类型将无法达到目的。 这与仅将具体类型用作Session的deserializer属性的类型约束没有什么不同。 令人沮丧的是,这是进步。 尝试3和3.5ish 为了弥补我们缺乏必要的类型争论,我们还需要DeserializerBox成为JsonDeserializer的真正代理对象,这意味着它应与JsonDeserializer 。 这意味着我们应该能够将代理与JsonDeserializer一样对待,并且它应该公开相同的接口。 为此,我们必须坚持使用JsonDeserializer […]

构建像Uber这样的出租车预订应用程序

首先,由于其出色的服务,Uber是数百万人使用的出租车预订应用程序。 点击电话即可预订私人司机。 最近的汽车将在几分钟之内接您。 一定要考虑使像Uber这样的出租车预订应用程序吗? 可能会出现问题,费用是多少? 请记住,没有人能估计开发像Uber这样的出租车应用程序的确切成本。 这一切都取决于各种各样的事情:应用程序体系结构和开发速度,功能,国家和行业以及数百种其他情况。 后端编程语言:对于android,我们使用Kotlin / Java;对于iOS,我们使用Swift编程语言。 除此之外,我们使用Laravel,Node.js,Socket和Google Firebase。 一些特定于平台的工具适用于Android的Google Map API和适用于iOS的MapKit / CoreLocation。 对于支付网关,我们使用PayPal Mobile SDK。 成本估算完全取决于我们的开发过程。 后端开发 Web开发 本机应用程序开发(适用于Android / iOS) 应用程式设计 质量保证 好吧,您可以从我们这里聘请专门的应用程序开发人员来定制您的应用程序开发解决方案。 与我们明确讨论您的项目,我们将满足您的业务需求。 期待您的回音。 技术指数 春谷路5001号 东400套房 达拉斯 TX 75244 (321)806–2936 (星期一-星期五,上午8:30-下午5:30 EST)

第3部分:安装自定义日志管理器

欢迎使用第3部分:安装自定义日志管理器 如果需要检查第2部分,请继续 。 首先,什么是SwiftyBeaver? SwiftyBeaver是基于Swift的iOS和macOS日志记录框架。 SwiftyBeaver具有不同类型的日志消息,我们还可以过滤日志以使错误检查更加轻松。 它有一个免费的许可计划。 那不是全部。 出站日志信息保存在云中。 SwiftyBeaver带有一个macOS应用程序,可让我们实时查看日志。 SwiftyBeaver日志记录框架可以使用您选择的安装工具安装在每台Apple设备以及Swift 2和Swift 3上 。 对于Swift 3,请安装最新的SwiftyBeaver版本 对于Swift 2,安装SwiftyBeaver 0.7 在第3部分中,我们将为项目配置SwiftyBeaver。 云设置 完成注册SwiftyBeaver首选项菜单后,您将需要生成新的凭据。 File> New SwiftyBeaver保存本地日志文件。 但是我没有必要的信息。 保存的位置并不重要,但是请不要忘记此位置。 单击“ 生成新的应用程序凭据”按钮时,您应该看到我们应用程序的应用程序ID , 应用程序秘密和加密密钥 。 让我们使用AppDelegate定义这些信息。 安装SwiftyBeaver Logging Framework之后,只需在AppDelegate.swift的顶部添加以下3行: 导入SwiftyBeaver 让日志= SwiftyBeaver.self AppDelegate:didFinishLaunchingWithOptions()添加您要在整个应用程序中使用的SwiftyBeaver日志目标(控制台,文件等): //添加日志目标。 至少需要一个! let console = ConsoleDestination()//登录到Xcode控制台 let file = FileDestination()//登录到默认的swiftybeaver.log文件 log.addDestination(控制台) log.addDestination(文件) 要开始记录到平台,您只需要使用您的凭据启动SBPlatformDestination() ,可以选择调整属性,然后将该实例添加到SwiftyBeaver本身。 让平台= […]

为什么我写家庭框架

在Apple平台上构建应用程序时,开箱即用的是模型视图控制器模式。 尽管多年来引起了很多争议,但这种体系结构本身并没有什么坏处。 主要的抱怨是可怕的“ Massive View Controller”,这些年来,它还获得了许多其他同义词,例如哥斯拉控制器,View ConTROLLer,我可以继续说下去。 我分享了很长时间的观点,在其他几个模式中寻找一个穿着闪亮盔甲的骑士。 但是,他们全都走同一条路。 与系统作斗争,直到我迷路了,发现自己回到了Apple为您提供的服务。 看起来一切希望都已荡然无存,Dave DeLong发表了自己的四部分文章系列“更好的MVC”。 更好的MVC,第1部分:问题 “修复”模型视图控制器系列文章的第1部分:修复封装问题修复大规模视图控制器… davedelong.com 使灯泡发光的是第3部分。 我是一个常见的误解的受害者,因为误解是视图控制器需要负责整个屏幕。 一旦我学会了这种“反模式”,生活就变得像一千个太阳的火焰一样明亮。 我开始以不同的方式考虑控制器,并且我接受了子视图控制器。 作为iOS开发人员的生活开始重新变得有意义。 在继续之前,我只想弄清楚本文的目的。 这与流量控制器模式无关。 使用该模式仅暴露了我认为需要修复的情况。 我不认为流量控制器模式是最终的答案。 这是构建模块化,可扩展且可测试的控制器的一种好方法,甚至是一种很好的模式,对于我和我的同事来说,这都是很好的选择。 如果您想更多地了解该模式,则不是本文。 我建议您阅读戴夫的文章。 他解释得比以往任何时候都好。 继续前进,在使用了子视图控制器一段时间之后,我开始看到我的时间花在了哪里,主要是在必须快速适应变化的时候。 更精确地说,构建流量控制器比将多个控制器粘合在一起要麻烦得多。 我想使用Apple提供的所有可用的UI元素来构成我的用户界面,但是当任何需要出队的问题出现时,我很快就感到失望。 必须有更好的方法。 一种不涉及链式约束并且适应变化的方法。 就像过去的爆炸一样,我想到了Spots框架的核心实现,即SpotsScrollView 。 在该类中,我们使用了基于OLEContainerScrollView的Ole Begemanns实现的布局算法。 该算法开放用于在滚动视图内部使用滚动视图,从而为用户创建一致的滚动体验。 我以Spots算法为基础,重新审视了代码,并逐渐对其进行了改进,直到它可以与您喜欢的任何UI元素按预期方式工作,而无需配置单个约束。 在为框架破解公共API时,我希望它尽可能精简。 我的目标是成为一个嵌入式解决方案,使设置子视图控制器变得像馅饼一样容易。 “公共API简洁明了,应该节省很多您想花在其他地方的时间……” 我想出了三种方法,一种用于添加常规子视图控制器,该子视图控制器处理内部调用所有适当的子视图控制器相关方法。 对于需要将控制器(或更确切地说,其视图)限制为特定高度的情况,我又添加了一个。 最后但并非最不重要的一点是,我添加了一个带有闭包的方法来选择与标准UIViewController的视图不同的视图。 这些是当今存在的公共API方法,以与添加视图时相同的线性垂直顺序排列视图,而子视图控制器由框架内部掩盖和处理。 如果视图在任何时间点都应更改,则算法将相应地对视图进行布局。 另外,我实现了对动画的支持,如果通过使用动画将视图的高度设置为零来删除视图,则框架将确定动画的持续时间,并在布置视图的新位置时采用动画。 这样,它尊重用户的意愿,而无需他们做任何额外的工作。 那么关于出队的事情呢,因为该实现植根于Spots框架,该算法已经考虑到了这一点,这意味着您可以自由地混合和匹配集合视图,表视图,堆栈视图,分段控件和常规UIView ‘ s。 Family框架仍处于起步阶段,但是我看到它的前途光明,因为它的责任很轻,公共API简洁明了,应该可以节省很多您想花在其他地方的时间,最好是与人类家庭在一起。 因此,事不宜迟,我给你一个家庭友好的儿童视图控制器框架:家庭。 希望您能像我一样喜欢它! […]

iOS 11上HEVC编码器的文件大小问题

有关此问题的原因,请参见下面的更新5! … iOS 11备受期待的功能之一是对HEVC(或H.265)编码视频的支持。 HEVC使文件大小从H.264减少了约50%,而不会降低质量。 新的编码器的初始印象在随附的相机应用程序中表现良好,但将视频编解码器设置为HEVC时,AVASsetWriter使用的编码器似乎存在问题。 要查看该问题,请在此处克隆或下载我的Git存储库。 另外,如果您有一个已经使用其他编解码器将帧写入视频的项目,只需将使用的AVVideoCodecKey替换为AVVideoCodecType.hevc(在较早版本的Swift上为AVVideoCodecHEVC),如下所示: 在比较使用HEVC编解码器与H.264进行输出的文件时,我已经看到,使用HEVC进行输出的文件的大小大约是使用H.264进行编码的文件的三倍,而质量似乎是相同的。 我已经向Apple提交了错误,并且在收到他们的来信后会更新此帖子,但是与此同时,如果您需要使用AVFoundation逐帧编写,我建议不要跳入使用HEVC。 更新:此问题在iOS 11.0.1中仍然存在-HEVC编码文件的文件大小仅是H.264编码文件的三倍多。 更新2:在iOS 11.0.2中仍未修复 更新3:在iOS 11.0.3中仍未修复 更新4:在iOS 11.2中仍未修复 更新5:根据Brad Ford的说法,问题是HEVC编码器的默认比特率(30兆位)比H.264编码器的默认高得多(5mit)。 尚不清楚这是为什么,并且从文档中看不出来,但是需要更多细节才能了解哪种比特率可以提供两种不同编码器可比的质量。

成功的iOS应用中常见的5种功能

苹果的App Store是仅次于Google Play商店的第二大移动应用市场。 目前,iOS设备用户可使用220万个应用程序,无论您是销售产品还是服务,商业应用程序市场都在蓬勃发展。 与任何技术产品一样,为了脱颖而出并产生持久影响,新泽西州的任何iOS应用开发公司都经常与企业主紧密合作以整合某些功能。 我们来看一下Apple App Store上成功的移动应用背后的哪些共同因素。 独特身份 当今的移动设备可以达到与其他移动设备相同的目的(例如,在线销售T恤),但之所以会比其他移动设备更受青睐是因为该应用程序为其用户提供了独特的功能。 这可以提供自定义功能,个性化体验,或者简单来说,可以提供更好的用户体验。 促成独特性的一些因素是针对目标受众,应用程序平台和硬件性能的方法。 锐利的设计 在考虑iOS移动应用程序时,您根本无法忽略设计元素。 如今,大多数iPhone和iPad具有出色的分辨率和清晰的显示屏,可增强用户体验。 在这样的目标市场中,设计薄弱,外观不美观的缺陷是一个很大的缺点! 设计很重要,因为它可以给用户留下第一印象,并且通常是导致用户保持对应用程序忠诚度的决定因素。 安全开发 众所周知,与Play商店不同,App Store是一个封闭的市场。 这对于企业主来说意味着什么,只有完全安全且具有最佳开发能力的应用程序才能被接受。 适当的优化,数据安全性,用户权限是确定应用程序开发良好程度时要考虑的一些关键因素。 综合分析 作为想要启动iOS应用程序的企业主,应该意识到可以帮助企业发展和使应用程序在市场上推出后变得更好的功能。 后端分析就是其中一项功能,可以帮助进行商业智能和决策。 当用户与该应用进行交互时,一旦生成模式,它便可以揭示很多内容,因此,分析成为任何成功的移动应用的关键基础。 不断改进 该应用程序在iOS市场上发布后,仍然需要在后端不断进行很多工作。 例如:如果企业主雇用了iOS应用程序开发公司来进行开发工作,则双方都知道,即​​使应用程序上线后,维护,重大修复,新的安全措施等也可能会不时出现!

Xcode 8.2 Simulator中的新功能

在Xcode 8.2的发行说明中,Apple为其新版本的Xcode引入了功能。 在此博客中,我将解释如何使用这些新功能。 这是Xcode 8.2 Simulator的两个新功能: 您可以使用xcrun Xcode命令行实用工具xcrun Simulator的视频和屏幕截图。 📷要截屏,请运行命令xcrun simctl io booted screenshot 。 📹要拍摄视频,请运行命令xcrun simctl io booted recordVideo . (9887264) 将应用程序拖到“模拟器”窗口中即可安装该应用程序。 (23387069) 捕获 第一个功能是录制视频并拍摄屏幕截图,非常简单。 您可以启动模拟器,在其上运行您的应用,然后可以截屏或开始/停止视频。 此功能非常方便从您的应用程序发送演示视频。 尽管该命令很长,但是却很容易执行! 拖放 第二个功能是将应用程序拖动到“模拟器”窗口中,但并不是那么简单。 至少不适合我😉 我的想法是,当我拥有.ipa格式的应用程序时,只需将其拖到将安装该应用程序的Simulator窗口中即可。 太糟糕了,事实并非如此。 但是苹果的意思是什么? “ 将应用程序拖到模拟器上” ? 因此,我在大型互联网上进行了搜索,并在Twitter上做了一些研究,在那里我收到了Brandon的这条推文。 提出的问题是; 为什么.app在模拟器中可以工作而.ipa不能工作? 这是因为.ipa格式的iOS应用是针对不同于模拟器可在其上运行的架构(ARM)构建的(x86)。 因此,.ipa格式的iOS应用只能安装在物理设备上,而不能在模拟器上运行! 附加:从DerivedData获取应用程序包 现在我们知道了如何将应用程序捆绑包拖放到Simulator上,我也想提供有关该应用程序捆绑包的一些详细信息。 该应用程序包位于DerivedData文件夹中,并在为设备构建项目时进行编译。 此DerivedData文件夹包含所有中间构建信息,调试和发布构建目标以及项目的索引。 模拟器应用程序捆绑包的特定位置可以在这里找到: 〜/库/开发人员/ Xcode / DerivedData / / Build […]

重新使用Xcode模拟位置

早在2013年,我写了一篇有关使用Xcode模拟位置的文章。 在2016年,Apple改进了这些工具,以使模拟位置变得更加容易且不易出错。 让我们看一下Apple对开发工具的增强功能以​​及已解决的问题。 GPX文件和Xcode Xcode使用标准化的文件类型来模拟位置。 GPX规范概述了定义路径或地理定位坐标集的许多不同方法。 Xcode仅使用标记,因此,如果找到一个生成基于或的GPX文件的工具,Xcode将无法正确模拟您的位置。 Xcode将像通过一条路线一样通过一系列标签运行,但是它没有提供任何机制来控制航路点列表中每个条目的速度或时间量。 可以在以下示例中找到GPX文件的示例,该文件模拟WWDC与会者朝库比蒂诺的朝圣(我希望他们会游泳): Moscone Cupertino 采购GPX文件 除非您希望将多个航路点串在一起以模拟用户驾驶,否则Xcode可以为您提供模拟位置的大部分方法。 在“ 新建文件”表中,“资源”部分下现在提供了创建GPX文件的选项。 生成的默认GPX文件自动设置为Cupertino。 将lat和lon属性修改为新的静态位置,即可开始使用。 配置项目 配置项目以模拟位置非常简单。 将GPX文件添加到项目后,可以在项目的方案编辑器或Xcode的调试区域中启用位置模拟。 通过导航到菜单栏中的产品->方案->编辑方案,打开项目的方案编辑器。 在方案的“运行”操作中,选择“选项”选项卡。 您应该看到类似以下内容: 另一个选择是在应用程序运行时对其进行调整。 在应用程序运行时,通过导航至菜单栏中的“视图”->“调试区域”->“显示调试区域”,打开“调试区域”(如果尚未打开)。 在“调试跳转栏”中,您将在“调试视图层次结构”按钮旁边看到导航图标。 单击它会显示类似于以下的视图: 最后一种模拟位置的方法仅适用于iOS Simulator。 导航至iOS Simulator菜单栏中的Debug-> Location会弹出一些选项,用于模拟静态位置(Apple或Custom Location)或模拟用户骑自行车,跑步或驾驶。 通过“自定义位置”选项,您可以输入静态的纬度和经度: 移动设备的模拟都在Cupertino区域中,因此,如果您需要模拟其他内容,则可以对多个标签进行拍摄。 最后说明 Apple修复的最大错误是模拟设备上的位置。 仅在调试器运行时模拟位置。 停止调试器会将位置服务的控制权返回给iOS设备上的相应无线电和传感器。

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。 桥接愉快☺

如何计算社交网络应用开发预算?

计算社交媒体项目预算的问题对于项目开发至关重要。 毕竟,您将需要知道要分配多少钱。 确实,您需要考虑创建社交媒体应用(例如Instagram)所需的大概价格。 参照Clutch的图表调查来自即将到来的领先移动应用程序开发公司的12家公司的代表,以计算出构建iPhone的成本,更重要的是,与此成本相关的关键变量。 正如我们在这里看到的那样,大多数社交媒体开发成本与开发应用程序基础结构,功能,界面和设计以及测试以及应用程序开发的高端和低端成本(38,000美元至171,000美元)有关。 开发社交媒体应用程序通常意味着由后端,数据库和移动客户端组成的三层架构,这对于在开发移动应用程序时进行思考非常重要。 您还必须考虑应用程序的各种目标(即,您是在吸引新客户,娱乐现有客户,收集数据,获利还是提高品牌知名度)。 这些功能决定了社交媒体的开发成本,因为它们揭示了您以后将要开发的特定功能服务,当然还有您要雇用的专家团队。 在将成本和工时分解成预算计算之前,请认真考虑采用5W方法(谁,什么,什么地方,什么时候以及为什么)来确定您的应用正在试图实现的目标。 用户真正想要的是什么? 了解您的用户将帮助您确定他们的需求,因此您可以根据这些需求和功能更好地确定开发准确的社交网络应用程序的成本。 特征和功能的成本 要计算准确的估算值,您需要清楚社交媒体应用程序的两个功能: 功能和功能 。 从一开始就考虑到这些功能通常价格较高: 第三方API集成。 计费集成。 数据库加密。 具有强大分析功能和众多功能的高级管理面板。 用户之间的自定义交互机制(社交网络的确切情况)。 您的关键社交媒体应用程序通常具有以下功能: 帐户授权(通过电子邮件,Facebook或电话号码进行) 设置授权是移动社交媒体应用程序开发的重要组成部分。 您可以通过以下两种方法之一授权用户:通过注册新帐户(包括登录名,密码,电子邮件和电话号码)或通过现有的社交媒体帐户登录。 设置授权可能需要160个小时来进行后端和移动iOS开发,需要40个小时来通过电子邮件进行注册/授权,需要40个小时来开发登录/注销功能,需要40个小时来设置社交媒体登录和签名,以及大约30小时通过电话号码进行授权。 创建/编辑配置文件 您的社交媒体应用程序应允许用户通过更改个人数据来修改其个人资料,这些数据包括有关他们的联系方式,姓名,性别,电话号码,网站等的信息。 这大约需要80个小时,iOS移动开发大约需要60个小时,后端开发大约需要20个小时。 信息交流 您的用户应该能够通过您的应用进行实时交流。 这最多需要1200个小时:iOS移动开发需要700个小时,后端开发需要500个小时。 调整设定 您的应用程序应具有各种可调整的功能,使您的社交媒体应用程序更易于使用。 这包括设置界面的适当语言,启用或禁用推送通知的能力,将用户帐户设置为私人帐户等。开发和设置这些可调整功能所花费的时间可能在96到126小时之间。 推送通知大约需要64小时,iOS开发大约需要24小时,后端最多需要40小时。 “其他设置取决于它们的数量和复杂性32–64小时(iOS开发24–40;后端8–24)”。 使用数字滤镜和其他功能上传和自定义照片 此功能将允许您的用户通过文件管理器的应用,旋转,锐化,拉直图像等功能以不同方式更改和修改照片。此功能在iOS开发中最多需要320个小时,包括应用滤镜(120小时),创建自定义滤镜(120小时)以及裁剪和旋转照片(80小时)。 用户将进一步拍照,上传视频,发表评论并在照片中添加其他标签。 实施这些功能大约需要160-340个小时,其中40个小时用于开发上传照片的必要技术,另外80-300个小时用于任何其他选项(标记,评论,活动提要等)。 关联不同的社交媒体帐户 用户应该能够通过在所有社交媒体平台上共享照片和视频来进行交互。 开发用于链接不同社交媒体帐户的技术,iOS和后端开发最多需要80个小时。 地理位置特征 用户可以共享视频或照片的拍摄位置。 优质准确的地理位置技术最多需要120个小时,iOS移动应用程序开发需要80个小时,后端开发需要40个小时。 最后,搜索不同参数的功能 这是用户可以在您的应用程序中搜索某些内容的能力,并且需要120个小时才能进行开发(iOS开发需要80个小时,后端开发最多需要40个小时)。 地理位置进一步决定了您的应用定价和设计成本,因为不同国家/地区的开发团队的可变费率不同。 您的团队将由两名中/高级iOS / Android开发人员,一名高级UX / UI设计人员,一个使您的移动应用程序开发项目保持正确轨道的项目经理,一个问答忍者以及前端和后端组成开发人员。 […]