Tag: xcode

快速的构建时间重新分析和优化

表达过于复杂,无法在合理的时间内解决。 考虑将表达式分成不同的子表达式。 我认为就是这样。 解决方法 :为了缩短构建时间,只需将表达式拆分为子表达式并将其存储到变量中即可。 这将使您的编译器的工作更加轻松。 让我们继续。 三元运算符 我们再次从旧代码开始: 现在我们从实验中删除除三元运算符之外的所有内容: 编译时间 :7毫秒。 好吧,闻起来像……胜利。 结论:关于复杂表达式的一切。 经过一些研究,我发现复杂的表达只是一个基础。 但是真正的“ Evil医生”是Swift类型检查器。 我将在下一篇文章中提供更多详细信息。 大赦几 数组串联: 编译时间 :19ms 回合() //建立时间:1433.7ms 设展开= a — b — c +回合(d * 0.66)+ e 编译时间 :6 ms。 注意所有变量应该是相同的类型。 如前所述,类型检查对于Swift来说是一个痛苦。 最甜蜜的: 编译时间 :86 ms。 至少不是12小时。 它可能会更快,但我会在下一部分继续介绍它,因为它需要对编译器结构进行一些审查。 第二篇文章的最后一个惊喜是: 也可以重构为: 编译时间 :7.3 ms。 很好

如何从Appstore下载旧版本的最新iOS应用程序

通常,我们需要在Appstore上使用旧版本的现有应用程序。 这可能是出于测试目的,或者说是要从当前版本降级为更稳定,兼容且体积较小的以前版本的应用程序。 在本文中,我将向您展示如何使用Charles Proxy下载较旧版本的实时应用程序。 我已经考虑过本文中名为HMH eTextbooks的应用程序。 您可以在Appstore上找到有关此应用的更多信息。 该应用的当前版本是4.1。 我将向您展示如何检索此应用的旧版2.0 。 因此,朋友让我们开始吧: 步骤1:下载Charles 代理 ,安装它并将其移动到应用程序文件夹。 从应用程序启动Charles,根据需要授予权限。 第2步:打开iTunes→应用程序商店→搜索您的应用程序→转到说明并同时打开查尔斯窗口和iTunes窗口。 步骤3:在iTunes中单击“下载”,在Charles的“结构”部分中观看下载活动。 您应该看到一个“购买”服务器。 第4步:右键单击购买服务器, 启用S​​SL代理。选择并停止在iTunes中下载您的应用。 步骤5:在Charles中,转到“帮助”-> SSL代理->安装Charles Root证书->添加然后打开“钥匙串访问”->搜索“ Charles Proxy CA”->双击它->更改为始终信任。 步骤6:在iTunes中再次搜索该应用,然后再次下载该应用。 再次取消下载。单击“购买”服务器旁边的显示三角形,然后单击buyProduct。 步骤7:单击Content(内容)选项卡,右键单击buyProduct,然后单击Export(导出)。 选择桌面作为导出位置,选择XML格式,然后单击保存。 步骤8:使用文本编辑器打开XML文件,然后向下滚动以找到整数,如屏幕截图所示: 注意:这些是应用程序的版本号。最后一个是最新版本。我想要最旧的版本,所以我复制了第一个。您可以根据需要选择。复制文本后关闭文本编辑器。 步骤9:返回Charles,单击buyProduct并选择Charles屏幕顶部的EDIT图标。 步骤10:点击Text(文本),然后在下的页面顶部附近找到以下行: appExtVrsId 在此行下方,您将看到写在标记内的数字值。 粘贴您在步骤8中复制的值以替换显示的值。 完成后,单击屏幕底部的“执行”按钮。 步骤11:在Contents(内容)选项卡下向下滚动,您应该看到 bundleShortVersionString 在其下,您将看到所需应用程序的实际数字版本。 您可以重复此过程,直到获得所需的特定版本。 步骤12:右键单击“购买”服务器下列表中的最后一个buyProduct,然后单击Breakpoints(断点)以启用断点。 步骤13:在iTunes中,再次搜索您的应用程序以刷新页面,并再次下载您的应用程序。专注于查尔斯,单击编辑请求→XML文本并粘贴我们在步骤8中复制的版本ID,单击执行按钮作为断点启用,再次按执行按钮。 步骤14:下载应已完成所需版本的应用程序。右键单击已下载的应用程序,然后单击获取信息以验证版本。 步骤15:将您的设备连接到MAC,然后将下载的应用安装到您的设备。 注意 :确保设备未安装最新版本的应用。如果是,请删除该版本,然后安装应用的下载版本。 步骤16:关闭Charles和iTunes,并根据需要使用您的应用程序。 结论: 希望这对正在努力寻找现有应用程序旧版本的人们有所帮助。 如果您知道其他选择,请分享评论。

在五分钟内用[Space Commander]和[xcpretty]插入您的Objective-C项目

为什么您的Objective-C存储库没有统一的代码格式? 使用Space Commander,您可以: 在提交代码之前强制执行格式约定。 使用单个命令(单个文件或整个存储库)格式化代码。 如果未格式化的代码进入分支,则构建会失败(在请求请求期间)。 (* https://github.com/square/spacecommander) 将spacecommader拖放到项目文件夹中 2.运行setup-config.sh ./config/spacecommander/setup-config.sh 3.要就地格式化存储库中的所有Objective-C文件,请运行 ./config/spacecommander/format-objc-files-in-repo.sh

用四种架构创建静态库

1.在架构点开后请选择其他然后输入以下两个: $(ARCHS_STANDARD) $(ARCHSSTANDARD_INCLUDING_64_BIT) 图一 2.仅构建活动架构全部选否 图二 3.左上角选择通用iOS设备然后执行,执行后会有libFsLib.a档案 验证该档案的架构: 一种。 开启terminal(终端机) b。 用cd可以跳到libFsLib.a的所在路径下 C。 在终端机里面输入lipo -info libFsLib.a d。 会显示出有两个架构(armv7 arm64) 图三 4.左上角选择通用iOS设备然后执行,执行后会有libFsLib.a档案 验证该档案的架构: 一种。 开启terminal(终端机) b。 用cd可以跳到libFsLib.a的所在路径下 C。 在终端机里面输入lipo -info libFsLib.a d。 会显示出有两个体系结构(i386 x86_64) 图四 5.请把两个libFsLib.a档案放在一起一个资料夹下,然后6。 将terminal(终端机)重启到该资料夹 6.在终端机里面输入lipo -create libFsLib_1.a libFsLib_2.a -output libFsLib_All_architectures.a(把两个.a档案合并,特别注意档名不要一样) 7.在终端机里面输入lipo -info libFsLib_All_architectures.a(就会发现libFsLib_All_architectures.a有多种架构了) 参考文献: 在iOS App开发中创建静态库

Xcode Server 8提示和技巧

Xcode Server —苹果公司用于自动化软件静态分析,单元测试和构建归档的连续集成系统已经存在了一段时间,但它从未得到应有的重视。 从历史上看,设置Xcode Server是一个相当繁琐且耗时的过程。 这使得一些人放弃了与Xcode IDE无缝集成的所有强大功能,并可以替代现有的CI服务器。 今年在WWDC的高级测试和持续集成会议上,Apple宣布了令人兴奋的功能和Xcode Server 8的改进。这些新的增强功能使Xcode Server 8成为您应该考虑在团队中设置的重要工具。 在此博客文章中,我想分享一些在我们团队中设置Xcode Server时学到的技巧。 我希望这些技巧将帮助您使Xcode Server成为开发团队可以依赖并从中受益的强大CI服务器。 免责声明 这篇博文不是分步教程,而是我在设置Xcode Server时学到的最佳实践的全面摘要。 如果您正在寻找详细的分步教程,请查看Honza Dvorsky撰写的大量Xcode Server教程。 另外,如果您仍然不确定自行托管自己的构建服务器以及为什么要在那里使用Xcode Server而不是其他CI服务器(云服务器或自行托管),请查看我之前的文章iOS / Mac开发的自行托管CI。 。 TL; DR 专用于Xcode Server的分离机 为集成用户创建专用用户帐户 为集成用户创建专用的GitHub / Bitbucket帐户 在项目中使用Bundler安装确切的Ruby gem和版本 在Xcode Server上使用Ruby版本管理器来管理Ruby gem 始终在集成前触发器中安装和更新Ruby gems和CocoaPods 使用Buildasaur macOS应用进行拉取请求测试 使用Fastlane部署在集成前触发器中执行的应用 入门 Xcode Server是一项在macOS Server应用程序中运行的服务,其中包括FTP,Wiki,缓存等其他有用的服务。 它可以从Mac App Store下载,价格为$ 19.99。 但是,如果您已在Apple Developer […]

如何实现Swift迁移

ไม่ได้เขียนบทความเตือนความจำนานแล้ววันนี้ถือโอกาสเอาเวลาจะนจะน้อยนิดมานั่งเขียนสักหน่อยใครหลงมาอ่านก็พยายามทำความเข้าใจหน่อยก็แล้วกัน๊ะน๊ะ! 编码编码编码编码编码编码编码 พอดีงานที่ดูแลอยู่มีการ更新版本และมีการเปลี่ยนแปลงไม่สิต้องเรียกว่ามีการเพิ่มPropertiesใหม่เข้าไปเพื่อเก็บค่าบางค่าที่เพิ่มเข้าที่เพิ่มเข้ามาใหม่ Classอนแรกก็นึกว่ามันจะเพิ่มใน类ได้ปกตินได้ปัญหามันเกิดขึ้นปัญหานี้จะเกิดกับเครื่องiPhoneที่ติดตั้งแอพนี้เอาไว้อยู่แล้วดังนั้นในLocalมันก็จะมีObjectที่มันเก็บPropertiesของเก่าเอาไว้ยก ตัวอย่าง class Dog: Object { @objc dynamic var name = “” @objc dynamic var owner : “” } Objectานบนนี้เป็นตัวอย่าง类对象狗ในตอนแรกเราก็เก็บ名称,所有者เท่านั้นแต่พอเราจะออกVersionใหม่แล้วClass Objectดันมีค่าที่เพิ่มเข้าไป class Dog: Object { @objc dynamic var name = “” @objc dynamic var owner : “” @objc dynamic var color : “” } กกับาหมาตัวนี้สีอัลลัยปัญหาจะไม่เกิดเลยถ้ามีการติดตั้งแอพใหม่ไอ้ครั้นเราจะไปบอกกับUserว่าเฮ้อมึงตอน更新应用程序อะให้ลบอันเก่าออกก่อนนะว้อยย ! (ทำแบบนี้ไม่ได้) 王国王国王国 let realm = try! […]

Swift Talk:高级MVVM [第4集] | 使用ViewModel插入,更新,删除,重新加载TableView

在这个有趣的情节中,我们向您展示如何处理UITableView功能,例如从视图模型中插入,更新和删除UITableViewCell。 我们还展示了一个有趣的排序方式,其中TODO项目根据“完成状态”进行排序,就像应用商店中提供的任何流行的TODO应用一样。 观看其他TOP编程教程,网址为: 轻松编写代码 来自行业专家的真实经验的视频教程。 Laravel,AngularJS,iOS,Android,NodeJS… www.youtube.com 请关注我们: http://letscodeeasy.com www.facebook.com/letscodeeasy https://twitter.com/letscodeeasy

移动应用程序如何真正发挥作用?

介绍 设计和开发简单的应用程序并不像您想的那么复杂。 在这里,我会向您证明。 在本文中,我将向您介绍CalcColor(我最近推送到Apple App Store的一个应用程序)的设计和开发过程。 我知道这很简单,但这就是我创建它的原因的一部分(如果您只对应用程序的总体运行方式感兴趣,并且不关心我如何构建计算器,请向下滚动至“应用程序的工作方式”) 。 规划 现在,进入应用程序构建过程。 人们喜欢认为那些构建应用程序的人是天才,他们提出了构想,然后立即坐在计算机旁开始编写代码,但事实并非如此。 在大多数情况下,甚至在编写一行代码或进行任何设计之前,都需要对所有内容进行计划。 像大多数独立开发人员一样,我首先考虑了CalcColor需要做什么/必须做什么。 由于其极其简单,因此非常简单。 我想构建一个简单,实用且外观不错的计算器,从而允许用户对其外观进行一些控制。 因此,我决定允许用户更改应用程序的背景。 简单。 对于实际的计算器,我决定使其保持最基本的状态,包括四个基本运算符(+,-,/,×)以及^和√运算符。 接下来我要决定的是实际计算器的功能。 它是否类似于内置的iOS计算器应用程序,该应用程序按数字计算表达式的编号(即,您输入25,然后按+,然后25消失,从而允许您输入其他数字),或者允许用户执行以下操作:在评估之前输入整个表达式(即您输入25 + 5–7 *(25 * 4))? 我最终选择了后者,以将CalcColor与现有的iOS计算器区分开。 解决了这个问题后,我需要确定应用程序的外观。 由于渐变可以构成良好的背景,因此我决定将大多数背景提供给基于渐变的用户。 因为我希望计算器占据整个手机屏幕,所以我决定在与计算器分开的另一页上进行背景选择。 关于计算器本身,我的目标是简化设计,因此我决定省略传统的按钮边框,而是选择不包含任何行的计算器。 设计过程 在规划了计算器的布局和功能之后,我需要提供一些视觉效果,使我可以看到最终结果是什么样。 为此,我使用了Sketch(可能是有史以来最伟大的设计师工具)。 与Photoshop相似,但使用起来非常简单,Sketch允许您绘制各种形状并对其属性进行混乱,以便在开始对它们进行编码之前设计其Web或移动应用程序的外观。 因此,我开始“绘画”。 既然我已经有了想要计算器看起来像的草图,我继续添加颜色,并决定要使用什么渐变。 而且,vuala,您在那里。 继续建设吧! 应用程序(和CalcColor)如何工作 在我谈论编码CalcColor的细节之前,我将谈论您真正想了解的内容-应用程序的工作原理(这并不真正包含游戏-它们有些不同,因为它们使用一些动画并且经常是某些引擎(例如Unity)的两倍-但更多内容请参见另一篇文章)。 大多数应用程序都是由包含按钮,表格和导航栏的页面组成的(无论您浏览到哪个页面,都存在于许多应用程序底部或顶部的栏)。 例如,CalcColor的主页由二十三个不同的按钮组成。 一个与其他22个(设置按钮)略有不同,因为它具有不同的功能,并且在应用顶部还显示了一些文本,用于向用户显示其计算器输入以及之后的输出他们按下了等于按钮。 此外,背景中还有一个图像。 第二页包含二十一个按钮,一个图像和两个文本位,但是与主页上不同的是,这些文本段无需修改 -永远不会更改。 因此,现在我们知道计算器应用程序的确切组成。 但是,这并不能解释我们如何将这些按钮放置在那里,或者如何使它们执行任何操作。 因为这是一个iOS应用程序,所以XCode是使我们能够回答这些问题的软件。 在XCode中,有一个称为情节提要的东西。 这就是让我们查看应用程序页面上将包含哪些项目以及向这些页面添加更多项目的原因。 它基本上是一个拖放系统,尽管您仍然可以放弃情节提要并以编程方式进行所有操作,但仅使用情节提要会容易得多(我个人从未在没有情节提要的情况下构建过一个应用程序)。 正如您在下面看到的,您实际上可以搜索一个按钮,将其拖放到情节提要上,并根据需要更改其文本。 除其他外,您还可以添加标签和文本字段。 修改按钮和标签中的文本很容易,因为XCode允许我们简单地双击它们并更改其文本。 […]

Swift中的Singleton类

Singleton是一种在开发中非常流行的设计模式。 大多数开发人员正在使用这种设计模式。 这非常简单,通用并且易于在您的项目中使用。 它仅使用静态属性一次性初始化您的类实例,它将在全局范围内共享您的类实例。 我们已经使用了很多次Apple的Foundation API,例如– UserDefaults .standard , FileManager .default 。 类似于单例类模式。 这里是使用类的一个简单示例 类LocationManager { // MARK:-位置权限 func requestForLocation (){ //代码处理 打印 (“已授予位置”) } } //访问类 let location = LocationManager () //初始化类 位置。 requestForLocation () //在此处调用函数 这是一个没有单例模式的类,用于访问每次我们需要初始化该类的函数,以避免出现这种情况,我们将单例类与静态实例一起使用。

使用DateFormatter从API格式化日期和时间

我最近学习了如何访问API和解析JSON,从而在Swift编程中解锁了一套全新的技能,尽管它非常酷,但也可能非常令人沮丧。 除了弄清楚如何布置返回的数据外,我遇到的第一个主要问题是尝试从某个API获取日期和时间。 有关更多信息,我使用了SeatGeek API,以构建一个显示2017年纽约洋​​基日程的应用程序。 SeatGeek API有大量信息可以解析,但我主要专注于抓住对手,游戏的位置,日期和时间。 一旦找到数据所在的位置,通过它们进行解析就不会太糟糕。 但是,我遇到的最大麻烦是将日期和时间捆绑在一起,称为“ datetime_local”。我想分别设置日期和时间,以便最终将它们显示在应用程序的两个标签上。 格式如下所示: “ 2017–04–02T13:10:00” 看来,第一部分是日期(2017年4月2日),第二部分是时间(标准时间13:00:00或1:10 pm)。 好的,没问题,我将仅使用字符串实例上可用的“ components”方法。 看起来好像用“ T”分隔了它们,所以我们用它来分隔: 如果您不熟悉,则“ components”函数将采用分隔的字符串并将它们放入数组中。 因此,日期是数组中的第一项(索引0),时间是第二项(索引1),因此我们可以按以下方式访问它们: 因此,现在我有了单独的日期和时间值,但我希望最终将这些值显示给用户,但我不了解您,但是如果我在应用程序中看到这些值,则将其关闭并立即将其删除。 相反,我想将这些日期和时间转换为更易读,用户友好的格式。 而这就是混乱的源头。 让我们回顾一下上面那种奇怪的“ datetime_local”格式。 我不知道的是,这种格式实际上非常普遍,被称为ISO8601。它本质上是一种约定的日期和时间格式,因此信息可以在国际范围内发送而不会造成混乱(讽刺的是,这是造成我的原因)最混乱)。 它的格式设置是从最大的时间开始,直到下一年(月-日-日)都用连字符隔开。 之后,“ T”基本上用作分隔符,表示“好,我们正在过渡到现在的时间”,并且以与日期类似的方式列出时间,从大到小(小时:分钟:秒),并带有一个冒号分隔每个。 同样重要的是要注意,ISO 8601默认为军事时间(24小时制),这可能有点令人沮丧。 这些都是ISO 8601的基础,但是,如果您有兴趣阅读有关坚韧不拔的文章,可以在https://en.wikipedia.org/wiki/ISO_8601上找到更多信息。 好吧,回到当前的问题-尝试将日期和时间转换为可读的,用户友好的值。 实际上,有两种方法可以执行此操作,具体取决于您要执行的操作,但是无论如何,您都必须在Swift中使用DateFormatter。 那么什么是DateFormatter? DateFormatter实际上是Apple定义的类,可帮助转换日期和实际时间。 DateFormatters上具有多种方法,您可以调用这些方法来获取/设置值,这是它们变得最有用的地方。 解决该问题的第一种方法是创建一个函数以从ISO 8601格式提取日期。 在我们的例子中,让我们想像一下,我们还没有分开日期和时间,它仍然以ISO 8601中格式化的奇怪的“ datetime_local”键下降。如果需要,我们实际上可以从日期中删除日期: 好吧,这是怎么回事? 首先,我们设置自己的dateFormatter常量,它是DateFormatter的一个实例。 DateFormatter的所有实例上都有一个名为Calendar的属性,我们可以使用该属性来设置数据输入的日历类型。 看看那个! 苹果实际上是.iso8601的选项之一! 然后,我们为该初始dateFormatter设置日期格式,在我们的情况下就是ISO 8601的样子-“ yyyy-MM-dd’T’hh:mm:ss”。 设置完初始dateFormatter之后,实际上我们需要创建一个新的dateFormatter。 可以这样想:“这是我要传递的字符串的格式为(我们的初始dateFormatter),这是我希望将其转换为(我们的newFormat)的内容。”因此,我们声明了另一个常量,称为newFormat,这是另一个常量DateFormatter的实例,并将其dateFormat属性设置为我们希望我们的原始字符串变为“ MMM […]