用于多平台开发的模块化体系结构:第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 。 我们还可以将负责按一定时间间隔加载每个映像的运行循环代码分离到其自己的模块/类中,以更接近于单一职责原则。 但是对于这个简单的示例,我们将其放在一起。 […]

使用Pods重命名Xcode项目:简单方法

制作应用程序时,我们可能想在发布应用程序名称之前对其进行重命名。 但是Xcode中的过程有点复杂。 当我们的项目中有一些Podfile时,它将变得更加复杂。 在本文中,我将分享重命名项目的过程。 第1步-重命名项目 在Xcode视图左侧的“项目导航器”中选择您的项目。 在右侧选择“文件检查器” ,项目名称应位于“身份和类型”下 ,将其更改为新名称并按Enter 。 将显示一个对话框,列出项目中可以重命名的项目。 在下拉菜单中单击“重命名” 步骤2-重命名方案 在顶部栏中(“停止”按钮附近),有一个用于您的旧产品的方案,请单击它,然后转到“管理方案” 。 您也可以在此处找到“管理方案”: 菜单栏>产品>方案>管理方案的 单击方案中的OLD名称,它将变为可编辑状态,更改名称。 退出 Xcode。 步骤4 —重命名主文件夹 打开您的项目文件夹,并将OLD.xcworkspace重命名为NEW.xcworkspace。 步骤5 —处理Podfile 在终端中,cd进入项目目录并打开Podfile。 您应该看到带有OLD名称的target子句。 将其更改为新并保存。 执行“ pod deintegrate” ,Cocoapods将删除与pod相关的配置,脚本,生成的框架以及Pods /目录。 现在执行“ pod安装”。 步骤6 —现在打开您的项目 您将看到一个警告: “文件夹OLD不存在” ,请消除该警告。 在左侧的“项目导航器”中 ,您将看到红色的OLD文件夹名称。 单击标识中的文件夹图标,然后键入以打开查找程序并从NewName项目文件夹导航到NewName文件夹。 转到项目导航器-> [您的项目名称]->构建设置->打包-> Info.plist文件,然后将路径的子字符串从“ OLD”更改为“ NEW”。 对产品标识符执行相同的操作。 现在清理并构建项目。

HealthKit数据:读取/写入

该博客涉及iOS中的Health应用程序以及如何从Health应用程序读取数据/向Health应用程序写入数据。 我们将看到HealthKit框架的API。 我们将看到如何从Health应用程序读取数据/向Health应用程序写入数据。 1.在Xcode中创建项目 2.初始设置 3.创建共享管理器(HealthKitManager) 4.获取写权限 5.将数据写入健康应用程序 6.获取读取权限 7.从健康应用程序读取数据 8.注意事项。 1.在Xcode中创建项目 使用Single View Application创建新项目 设置项目详细信息 2.初始设置 一种。 添加HealthKit Framework。 选择“目标”>“构建阶段”>“使用库链接二进制文件”>单击“ +”>键入healthkit并添加。 b。 在开始编写代码之前,我们需要了解等同于读写的术语。 读取=与您的应用共享Health应用数据 写入=从您的应用程序更新Health应用程序数据 我们需要说明为什么要从Health应用程序读取数据或向Health应用程序写入数据。 因此,提供描述。 一种。 需要设置NSHealthShareUsageDescription进行数据读取。 这将在项目中自动添加权利文件 。 3.创建共享管理器(HealthKitManager) 让我们创建一个共享类作为Manager,将代码放入其中。 使用“ 连接”按钮绑定动作, 在此步骤结束时,您的应用程序现在已被授权将“ 步骤”写入“运行状况 ”应用程序。 如果您遇到任何错误/问题,请随时询问您的问题。 5.将数据写入健康应用程序 让我们创建一个函数,该函数将向Health应用程序中写入许多步骤 。 (在HealthKitManager.m中) 6.获取读取权限 请记住,我们已经拥有编写步骤的权限,这意味着我们也可以阅读它们。 因此,对于新的活动类型,我们将获得“健康状况骑车距离”应用程序的数据读取权限。 在“ 读取权限”操作下,您将能够看到权限模态,如下所示。 现在,我们有权从“健康”应用程序读取“ 骑车距离”数据。 7.从健康应用程序读取数据 我们将阅读“距健康的骑行距离”应用程序,但“健康”应用程序中尚无“骑车距离”数据。 让我们手动添加一些虚拟值, 转到健康应用程序>选择健康数据选项卡>活动>骑车距离>单击“ […]

NSTimer的秘密世界

›也可以 在此链接的我的博客上找到本文 。 计时器允许我们在一个或多个计时器间隔后执行一些代码。 有多种类型的时钟可用于创建计时器,即使所有这些时钟显然都以相同的速率运行,它们的行为仍然不同。 我们可以列出以下计时器类型列表: 实时时钟或RTC 。 它是一个计算机时钟(通常为集成电路形式),用于跟踪当前时间。 用户可以任意更改此时钟,而NTP(网络时间协议)则最好使其与外部参考保持同步。 它的值每秒增加一秒钟,但有时可能会更快/更慢或向前跳跃( 这要感谢Gavin Eadie,这使我意识到时钟永远不会向后运行.NTP同步发现时钟在运行如果运行速度快,则在尝试与外部源同步时应放慢速度,直到“实时”赶上 。 单调计时器 。 它的计数器通过使用计时器中断发送到CPU的物理信号递增。 在Apple平台上,此值由Mach内核通过mach_absolute_time()返回。 返回值取决于CPU,因此您不能只将其乘以一个常数就可以得出真实值。 相反,您应该调用系统提供的转换函数将其转换为真实值(CoreAnimation有一个方便的方法:CACurrentMediaTime())。 它在启动时被重置的事实使得获取现实世界中流逝的时间并不那么有趣,但是它是测量两个时间间隔之间差异的最精确方法。 启动计时器 。 它只是一个特殊的单调计时器 ,在系统进入睡眠状态时不会暂停。 获取其值的最常见方法是从终端调用uptime函数。 在Apple平台上,创建计时器的最常见方法是使用NSTimer类。 实际上,它只是围绕单调计时器的包装。 因此,使用NSTimer可能会以无法预料的方式结束,特别是在iOS上,在如上所述的某些极端情况下,机会性的资源使用可能会结束。 为了充分理解NSTimer,我们需要谈一些NSRunLoop; 一旦启动,每个应用程序都会创建第一个NSThread,称为Main Thread; 每个线程都有一个关联的运行循环,该循环管理输入源,例如鼠标,键盘,触摸,连接……以及显然是我们的计时器。 您可以将RunLoop视为等待新消息并将其传递给适当的收件人的邮箱 :它基本上是一种消息传递机制,用于异步或线程间通信。 一些平台(如Windows)将其称为Message Pump,但内部概念仍然相同。 实际上, 运行循环代表了命令行 应用程序 与交互式 (通常是基于UI) 应用程序 之间的主要区别 。 当第一个使用参数启动时,执行它们的内容,然后退出,一个交互式应用程序等待用户输入,对此做出反应并再次等待。 每个线程只有一个Run循环; 一个运行循环由一组要监视的输入源(键盘,触摸等)和一组要通知的观察者组成。 隐式或显式地使用特定的运行模式初始化运行循环。 在其生命周期内, 仅监视与该模式关联的源并允许其传递事件; 仅将与该模式关联的观察者通知新数据。 Cocoa / UIKit定义了几种类型的模式:在iOS上,有一种特殊的模式称为UITrackingRunLoopMode:在控件中进行跟踪时设置。 […]

仍然想知道IBDesignable和IBInspectable是做什么的?

现在是2019年,XCode 10在这里,iOS 12在这里,但我们甚至没有提供通过XCode接口构建器为UIView / UIbutton或任何其他UIView子类提供圆角/边框半径/边框宽度的规定。 啊! 有点令人沮丧,对不对? 当然,我们可以通过编程来完成所有这些工作。 但是,请思考一下,为什么您可以编写一些原始代码并想象一下它的外观,当您可以轻松地在Interface Builder中修改值并使用IBDesignable和IBInspectable查看实时更改时! 在本文中,我将说明如何使用界面生成器添加边框颜色,边框宽度和角半径。 因此,让我们开始吧。 IBDesignable和IBInspectable 将@IBInspectable添加到属性时,它将在XCode中将该属性公开给属性检查器。 您可以在属性检查器中修改值,而不用编程方式进行修改。 但是,当您尝试更改值时,界面构建器将不会实时显示更改。 为了查看更改,您需要构建并运行项目。 但是,嘿! 这是聚会的把戏。 我们可以使用@IBDesignable来处理此问题,它会告诉XCode在您修改值时呈现实时更改。 现在,让我们看看下面的示例类。 导入UIKit @IBDesignable 类CustomView:UIView { @IBInspectable var borderColor:UIColor? { 得到{ 返回UIColor(cgColor:layer.borderColor!) } 设置{ layer.borderColor = newValue?.cgColor } } @IBInspectable var borderWidth:CGFloat { 得到{ 返回layer.borderWidth } 设置{ layer.borderWidth = newValue } } @IBInspectable var cornerRadius:CGFloat { […]

使用Fastlane和Travis CI建立发行自动化

曾经有种感觉,就像您花费大量的办公时间来构建测试仪一样。 您正在构建版本,而不是对它们报告的错误进行修复。 好吧,如果您这样做了,那么您很幸运。 我们将讨论如何使用iOS开发人员可以使用的两个最简单的工具解决该问题。 快车道 特拉维斯CI 在将Swift集成到项目中(用Objective-C编写)之前,我们的构建时间非常短。 但是随着我们开始越来越多地在Swift中编写代码,这种情况发生了变化。 创建存档只需要3到5分钟的时间,而花费了15到20分钟的时间。 我们尝试了Apple建议的所有优化技术,但令我们沮丧的是,仅几分钟就对我们有所帮助。 如果您要花一些时间来上传构建版本,则很容易花费我们30-40分钟。 因此很显然,我们必须解决此问题,因为它会占用开发人员的时间及其生产力。 所以我们开始吧 如果您想直接跳到本教程,请向下滚动。 对于好奇的人,这里有一些关于我为什么选择Fastlane和Travis的见解。 快车道: 该工具使您可以非常轻松地自动化构建过程。 您的所有进程都位于这些很小的“通道”中,这些通道是可读的,因此,即使是新手,也可以通过查看代码确切地知道发生了什么。 而且,fastlane提供的输出非常有见地并且易于阅读。 管理代码签名:O !!! Fastlane提供与Fabric,HockeyApp,Testflight等第三方应用程序的完美集成。我们使用Fabric从测试人员下载构建的位置上传构建。 由于我想避免使用Fabric编写集成代码,因此Fastlane对我来说是一个显而易见的选择。 它拥有一个了不起的开发人员社区,您可以找到最常见问题的解决方案。 特拉维斯CI: 我不得不使用CI工具来分发我的构建,因此我选择在Jenkins和Travis之间进行一次小型调查。 以下是Travis与Jenkins相比的一些优势: Travis集成了GitHUB Web挂钩! 它还为您提供了一些漂亮的功能,例如在拉取请求中显示构建状态,队列管理,仅在最新提交时运行作业等。 您在Jenkins上确实有GitHUB插件,但是这一次您需要花费时间来集成它。 特拉维斯不需要任何设置。 我只需要创建一个帐户就可以了。 Travis是基于云的解决方案,因此您无需像Jenkins那样依赖于系统。 无论如何,足够了……。 让我们继续前进!!! 该工具将使我们的生成生成过程自动化。 我们将使用fastlane的两个工具: 匹配—管理不同分发方案的证书和配置文件 健身房—创建iPA 在系统上安装fastlane brew cask install fastlane 转到您的项目文件夹并运行 fastlane init 这将在项目目录中创建一个名为fastlane的文件夹,其中包含要在其中写入“ 泳道”的fastfile 。 通道遵循非常简单的结构: 车道:build do 选项 […]

面向协议的UITableViewCells

这篇博客文章展示了如何通过使用面向协议的编程 (POP)作为子类化或组合的更好替代方法来实现一组UITableViewCell变体。 准备? 我们走吧! 给我看看细胞! 在构建我的Cast Player应用程序时,我需要添加几个设置页面,以允许用户在应用程序中进行一些调整,并包括指向“发送​​反馈”表单和一些“关于”屏幕的链接。 这是最终结果: 从上面的屏幕中,我们可以识别六种不同类型的单元格: 总体而言,这些细胞具有以下特征(或行为): 单元格突出显示 显示标题 显示人类可读的字节数 我们如何去建立一组能很好地代表这六个细胞变异的类呢? 第一步是列出网格中的所有单元格类型和所需特征: 从上表可以看出: 所有细胞都没有采用这些特性。 一些特征是某些细胞所必需的,而其他细胞则不需要。 这意味着构建UITableViewCell类层次结构在这里无法正常工作。 实际上,这些单元格类型都不是基础类的理想选择。 该怎么办? 🤔 协议和扩展! 好极了! 幸运的是,这篇关于Swift 2.0中Mixins和Traits的精彩文章可以为我们指明正确的方向。 直观地讲,协议和扩展对于该用例确实可以很好地工作,但是如何在此处正确使用它们呢? 这个想法是我们可以使用协议为每个特征定义接口 ,并提供带有扩展的默认实现 。 然后,我们可以创建非常小的UITableViewCell子类,并使它们仅符合所需的协议。 在另一个名为“面向协议的MVVM简介”的精彩演讲中,探讨了一个非常类似的问题。 让我们看看它是如何工作的! 有了协议和扩展,我们可以编写第一个特征TitlePresentable : 在代码中,这表示为: 注意 : HighlightableTableViewCell是通过子类实现的唯一特征,并且可以用作三种其他单元格类型的基类。 一旦为给定类型选择了基类,则只能通过协议扩展来添加其他特征。 结论 使用Swift协议和扩展作为增加行为(特征)的一种方式,可以在我们的类的设计中取得重大胜利,并有助于保持层次结构的平坦。 🚀主要优点: class媚的阶层阶层 生成的API /类可以更轻松地扩展 与添加和删除代码相比,添加和删除协议一致性更容易 减少代码重复 欢迎反馈 这篇文章中介绍的解决方案对我和我的特定用例都非常有效-我希望这个实际示例可以帮助我比起初时更好地理解如何使用协议扩展。 如果您知道这样做的更好方法,请在评论中告诉我! 注意 :这篇文章首次出现 在 2016年6月18日发布的 […]

什么是下载查找我的JB?

由于Cydia Download的用户每天都在增加,因此越狱过程也必须更改其执行方式,以使用户比以前更加轻松,这一点至关重要。 下载“查找我的JB”是用户正在寻找的一种新的流行越狱方法。 但是,您需要知道,“下载查找我的JB”不是另一个类似于Pangu或Taig的越狱应用程序。 这是一个可用于验证设备的Cydia Download兼容性的应用程序,而不是直接在越狱过程中为您提供支持的应用程序。 换句话说,它实际上是一个辅助支持器,用户可以使用它来检查他们的当前状态,并且不会被错误的信息赶走。 Download Find My JB工具可在线使用,可在几秒钟内免费找到并获得所需的服务,从而避免任何复杂情况。一旦您确定可以越狱,该应用程序将为您提供建议。也适合您使用的工具。 分析过程已设置为自动进行。 即使已在线准备,也不必使用台式PC或MAC进行任何操作。 您需要做的就是设置Safari浏览器以执行其正式的网络表演服务并提供说明。 QR代码部分使用户可以方便地使用“下载查找我的JB”工具。 为了扫描代码,用户必须将设备的摄像头放在代码部分上方,然后再访问它。 从iOS 6.0到更高版本的所有用户(包括iOS 9.3.2或更高版本)都可以使用Download Find My JB找到Cydia下载路径。 用户友好 —有吸引力的图形界面 越狱社区 —您可以与来自世界各地的Cydia应用爱好者联系 越狱工具 -可以在一个地方找到各种越狱工具 更新 -终身免费提供所有最新更新 支持任何iOS版本 -甚至支持包括10.0.1和10.1的最新iOS版本。 全自动 —一键越狱查找器 支持任何iPad,iPhone,iPod —与任何类型的Apple设备兼容 Cydia下载指南 —提供最新和最用户友好的越狱教程 Cydia免费应用程序 —您可以从Cydia商店下载免费应用程序

200多个App评论提交网站列表

根据Google-Ipsos最近的一项调查,对应用的认知度中有52%来自朋友,家人和同事,基本上是口碑营销。 它可以帮助获得更多的下载和更好的可见性。 每个应用程序所有者和开发人员都希望了解顶级和最佳移动应用程序评论提交网站和代理商,以便在顶级应用程序提交网站上提交这些iOS和android应用程序 。 如果您对应用程序有很好的想法并寻找市场,那么提交移动应用程序是一种行之有效的营销方式。 应用程序提交网站背后的原因是其网站上的用户具有较高的质量,从而提高了应用程序在网络上的受欢迎程度。 连接应用提交站点的步骤: #1)列出网站应用提交的内容 #2)检查提交网站的列表 #3)选择您感兴趣的网站区域 #4)在指定网站上提交您的应用程序链接 列表: 适用于iOS和Android应用程序的200多个App Review网站

对接动画,例如Youtube,JioCinema iOS

DockingView由TopView和Central视图两个视图组成。 当用户停靠时,只有顶视图可见,而中央视图被隐藏。 步骤3:初始化后,将您的视图相应地添加到topview和centralview。 步骤4:然后只需调用dockingview的方法:.present() 悠悠球!!!!! 停靠将添加到您的视图中,并将开始显示其凉爽感🙂 要添加更酷的功能(如UIViewController的overridable属性),可以在子类中重写以下方法,并在进入DockingViewClass和OverRidable方法和变量时可以重写更多方法。 有3种状态:展开,对接,关闭 发生对接时,上面的最后一个可重写方法一直被调用,其范围在0to1之间变化。 当scale == 0时,视图处于停靠状态;当scale === 1时,视图处于展开状态。 您可以根据比例值更改外部参数,这就像蛋糕上的糖霜一样。 处于停靠状态并可以向左或向右滑动时,可以从Superview中删除停靠视图。 这是我的观点。 谢谢,享受很棒的功能并发表评论。