Tag: iOS应用程序开发

缩小您的.IPA尺寸:EP。 2 —减小PNG图像的大小

และากตอนที่แล้วที่เราวิเคราะห์กันว่าแอพเรามันใหญ่เพราะอะไรและScanหา图像资源ที่เราไม่ได้ใช้แล้วเพื่อลบอออกไปจากProjectของเรามันก็คงจะพอลดขนาดของแอพเราไปได้บ้างไม่มาก ก็น้อยจากการลบสิ่งไม่จำเป็นออกไป แล้วสิ่งจำเป็นล่ะ? เราจะสามารถทำอะไรกับมันได้อีกมั้ย? Caseอ案例研究ผมเจาบอกว่า Tweetbot for iPad สามารสนาดแ​​อพลงได้ เกินกว่าครึ่ง จากการทำลดขนาดรูปภาพที่ใช้ในแอแแค่นั้นยังไม่พอ ความเร็วในกน็วใารแสดงผลรูปภาพยูปภร็วขึ้นอีกตั้ง2.5เท่า !! อ่านแล้วผมนี่ตาลุกวาวอะไรจะดีขนาดนั้นต้องลองซักหน่อยแล้ว ูู่่ตัวคืููููููููููู่่่่่่่่่่่Al Optim Optim Optim Optim Optim Optim Optim Optim Optim ImageAlphaเป็นเครื่องมือที่จะแปลงPNG NGองเราให้มีขนาดเล็กลงจากที่เราใช้PNG PNG8 + Alphaอสั้ายสั้นๆก็คือๆก็คือยู่ในรูปภาพให้น้อยลงจาก24 bit(16.7ล้านสี)เหลือ แค่256ังคงคุณสมบัติแต่แต่ังคงคุณสมบัติNG NG NG NGส่วส่วส่วNGส่วNG NGส่ว256 NG พคุณดีไซน์ให้เป็นลั ษณะนั้นนะ)เราโหลดแอพมาปรับๆดูก่อนก็ได้ว่าแปลงเป็น8位แล้วมันพังมั้ย? ถ้าไม่ก็ลุยต่อเลย Alรูปที่เราทำมันก็เยอะเหลือะเหลืนซึ่งมีานั่งทีละรูปไม่เสร็จงานกันพอดีเบื้องหลังการทำงานของImageAlphaคือไลบรารี่pngquantซึ่งมี命令行实用工具 ถราสามารถconvertทีเดียวทั้งAsset.xcassetไฟล์ได้เลย Package pngquantมันอยู่ใน二进制ของImageAlphaนั่นแหละคลิกขวากด显示程序包内容แล้วดูใน Contents/MacOS/ จะเจอlib pngquantหรือเราจะติดตั้งจากhomebrewเอาเลยก็ได้เช่นกันด้วยคำสั่ง brew install pngquant pngquant terminalากนั้นใน终端cd path/to/your/.xcassets และคำสั่ง find *.imageset/*.png […]

Swifty Firebase API @ Ka-ching —第3部分

更新,2018年10月14日: 自撰写本文以来,这些博客文章中描述的概念已被分为两个开源框架,可以在这里找到: ka-ching-as / FireSwift-Database Firebase实时数据库的扩展,可以使用“ Codable” Swift类型。 … github.com ka-ching-as / RxFireSwift-Database Firebase实时数据库的RxSwift扩展– ka-ching-as / RxFireSwift-Database github.com 这篇文章是3(或4或5?)部分系列的延续。 在第一篇文章中,我们向Firebase API添加了Codable支持: 在第二篇文章中,我们使用Phantom Types添加了Type Safe路径,这为我们提供了强类型的路径和出色的API人体工程学: 在本文中,我们将添加对RxSwift的支持。 如果您想了解有关RxSwift的更多信息,请参考官方github回购,其中提供了很好的用例示例。 我在这里要表达的唯一的进一步动机是,Firebase实时数据库和Rx的思维方式存在巨大的重叠:RTDB允许用户订阅随时间变化的数据。 Rx的主要目的之一就是提供随数据随时间变化建模的原语。 如我所见,Rx是使用Firebase RTDB API的理想方式。 例如,使用本机API观察Firebase中某个位置的更改,要求用户跟踪订阅时返回的订阅令牌。 在Rx中,我们可以将此令牌包装在订阅中,以便在处理订阅时删除Firebase观察器。 但是,当我们开始编码时,所有这些可能更容易掌握! 添加一个Rx扩展 为了方便起见,让我们开始向DatabaseQuery添加Rx扩展(这是DatabaseQuery的超类型)。 可以在RxSwift存储库中找到添加Rx扩展的模式,例如RxCocoa扩展。 它看起来如下:

自定义搜索栏颜色

UI设计人员总是对默认元素外观不满意,并试图通过自定义外观控件展示自己的创造力。 作为负责用代码实现设计的人,您可能会为UIKit默认控件的困难和灵活性感到沮丧。 在这里,我想分享一些自定义UISearchBar对象的技巧和片段。 想象一下您的任务是使搜索栏与应用程序的配色方案匹配的情况。 首先,让我们回顾一下最明显的着色选项,并意识到它根本不明显。 searchBar.backgroundColor = UIColor.green 乍一看,它似乎什么也没做,但是,如果您具有良好的色彩感知能力或借助“色度计”工具,您会注意到所需的色彩已与搜索栏的默认灰度混合在一起。 实际上,它可以按预期工作并更改视图的背景色。 但是您只能通过其顶部的半透明条形视图来查看它。 那么,如何更改此障碍并为搜索栏获得纯色背景色? searchBar.barTintColor = UIColor.green 此代码更改了此条形图的颜色,因此不再是问题。 文本字段呢? 颜色没有属性。 您需要像这样创建UISearchBar类扩展: 作为额外的触摸,让我们尝试在上述文本视图中更改光标颜色。 searchBar.tintColor = UIColor.green 那图标呢? 您可以使用以下扩展名访问和自定义放大镜图标: 占位符文本颜色也可以使用类似的代码进行自定义(但具有按键式的价值): 目前为止就这样了。 如果我忘记了一些内容,我将在此处添加有关UISearchBar的更多提示。 使用Swift编写有趣的代码。

使用Swift的iOS中的Websocket

WebSocket允许极其快速的双向网络通信,这使您可以更快,更频繁地发送和接收更新,更不用说安全了。 WebSocket是一种使用套接字的通信协议,可通过单个TCP连接提供双工通信。 它由IETF于2011年标准化,是与HTTP不同的协议。 WebSockets广泛用于聊天应用程序,流实时通知和股票价格中。 Websocket生命周期 与服务器握手 握手应用程序是WebSockets中的Web部件。 这是从HTTP到WebSocket的桥梁。 客户端向服务器发送一个非常标准的HTTP GET请求: GET / chat HTTP / 1.1 主持人:example.com:8000 升级:websocket 连接:升级 Sec-WebSocket-密钥:dGhlIHNhbXBsZSBub25jZQ == 安全WebSocket版本:1 这里最有趣的是`Sec-WebSocket-Key`,出于安全原因,它是根据WebSocket标准生成的。 服务器验证请求,如果一切正常,则发送回HTTP响应: HTTP / 1.1 101交换协议 升级:websocket 连接:升级 Sec-WebSocket-接受:s3pPLMBiTxaQ9kYGzzhZRbK + xOo = 交流信息 服务器或客户端可以随时发送遵循以下特定格式的数据: 我不会详细介绍每个部分,但是您可以在标准中找到更多信息。 乒乓球 客户端或服务器在任何时候都可以发送ping,而另一方必须发送回pong。 闭幕 任何一方都可以通过发送指定的控制序列来关闭连接。 在iOS中实现WebSockets 在iOS,macOS,tvOS或watchOS中实现WebSocket并非易事。 新的Network.framework可以简化此操作,但是您仍然需要处理基础任务,例如升级连接和设置WebSocket框架。 红蜘蛛 Swift WebSocket客户端库Startscream简化了所有繁重的任务。 安装该库并将其导入任何Swift文件中。 进口红蜘蛛 建立连接 之后,创建一个连接并设置委托。 套接字= WebSocket(URL:URL(字符串:“ ws:echo.websocket.org”)!) socket.delegate […]

iOS网络变得简单

最近,我学到了一种简单的iOS模式,该模式总是使我的头部受伤-网络。 我见过这么多具有​​不同目的和复杂性的解决方案。 但是直到最近,即使您是第一次看到,我也看不到任何通用,可测试和易于理解的东西。 当我加入我的上一个团队时,我们开始以反应性方式做事。 但是今天的教程将精简我们在团队中开发的版本。 本教程的目的是向您展示一种简单的方法来制作自己的内部网络库,这样您就不必依赖第三方库了。 1.打开一个名为“ NetworkLayer”的新Xcode项目。 假设您知道如何打开新的Xcode项目,那么我将把这一部分留给您解决。 2.接下来,我们将清理项目文件夹,如下所示。 我喜欢从一开始就保持项目整洁。 如您所见,我遵循经典的MVVM体系结构,其中大多数逻辑都存在于ViewModel中。 还有一个“网络”文件夹,用于存放与网络相关的任何内容,这将是本教程的核心。 3.那么我们要做什么? 在本教程中,我们将创建一个简单的GitHub客户端,该客户端将显示最受关注的仓库,并可以按语言进行过滤。 我们将基于公共GitHub API进行项目。 https://developer.github.com/v3/ 因此,我们将使用具有不同变体的https://api.github.com/search/repositories端点,以过滤要查看的存储库。 而且还将有详细信息屏幕,其中包含有关回购所有者的信息。 4,做骨架 相应地在文件夹中为UI和模型创建以下文件: 型号:Repos.swift,Repo.swift,User.swift,Response.swift 视图:RepoTableViewCell.swift ViewModel:RepoTableViewModel.swift,RepoTableViewCellModel.swift,UserViewModel.swift 控制器:RepoTableViewController.swift,UserViewController.swift 然后是网络层的核心: 网络:Networking.swift,EndpointType.swift,GitHubAPI.swift 最后,它应该类似于: 5.现在让我们用一些有意义的代码填充空文件 从更简单的内容开始,让我们用UITableViewControler UINavigationController替换Storyboard的内容。 将UITableViewControler’s超类更改为RepoTableViewController. 接下来,您应该自定义设计所需的单元格,但是在本教程中,我将进行通用介绍并显示Repos名称,描述,所有者的名称,语言和星级。 我的版本如下所示: 另外,由于我们要显示有关回购所有者的信息,因此我们需要另一个屏幕来显示用户详细信息,其中包含一些基本标签和图像视图。 6.接下来,我们将使用 Repos 和 Repo 模型。 在Swift 4中,有一个令人兴奋的新功能:带有Codable&Decoable 。 因此,我们将使用这种方式将json数据解析为模型对象。 希望您理解了这个想法,并且对您有所帮助。 我也在GitHub上发布了这个项目。 我必须感谢我以前的团队Sergei Guselnikov的合作伙伴,他是一位出色的iOS开发人员,因为这里包含的一些想法是基于我与他一起工作中学到的。 ✋️

请勿打扰-警报无法响起的故事

游戏早期警报 是 我们团队 的第一个iOS应用。 我们那小小的沉睡者乐队确信此闹钟应用可以唤醒世界上任何人。 我们添加了一些经典游戏,随着闹铃响起,您可以玩游戏来停止它。 好玩吧 好吧,出了点问题。 事实证明,iOS上的第三方应用程序具有一定的局限性,并且我们的闹钟不会响。 这些是我们遇到的一些限制 – 通知不能覆盖铃声开关,也不能覆盖“请勿打扰”模式 。 – 来自应用程序的本地通知 (即使离线也可以发送的唯一通知类型) 将永远不会在电话“睡眠”时隐式“唤醒”应用程序。这限制了应用程序开发人员在手机中设置另一个通知的可能性。贪睡事件。 – 第三方应用程序的通知声音的最长持续时间为30秒。 这意味着一旦30秒结束,就不会再有声音了。 现在,开发人员需要计划无限数量的通知,以确保用户将醒来。 另外,如果您尝试添加超过30秒的声音,则声音不会消失。 – 第三方应用程序无法将音量设置为高于或低于设备的设置音量 ,也无法抑制其他应用程序的声音。 因此,如果您一直打开声音,则可能在闹钟响起之前被Facebook或Twitter通知唤醒。 – 所有用于通知的警报声音 (必须捆绑在应用程序内) 必须来自应用程序 ; 应用无法访问音乐应用或Spotify中存储的声音(无法唤醒音乐)。 基本上,如果您将手机设置为静音或处于“请勿打扰”模式,则只有本机iOS闹钟会在早上响起。 最终,我们找到了使“早期”工作的方法- 如果您让该应用程序运行并仅锁定手机或让其自行锁定,它将能够在早上真正唤醒您。 我们需要一种方法来通知我们的用户有关这一重要信息的信息,并且为此我们创建了一个小屏幕。 该屏幕在2.5年来经历了一次真正的演变,我们的应用程序一直存在于App Store中,并且我们从所有更改中学到了很多东西。 我们有尴尬的时刻和启蒙的时刻。 早期的Game Alarm开发人员Jelena Krmar撰写了这个故事以及其他一些故事,您可以在 我们的博客 上阅读所有这些故事。 并且,如果您中有更多人遇到了类似的问题,这些问题都限制了iOS上第三方应用程序的使用,请随时与我们联系并分享您的经验。

移动应用开发公司— Apptunix.com

在Apptunix ,我们的移动应用程序开发公司提供的解决方案不仅有助于解决他们的问题,而且还帮助他们抓住新的商机。 这里的基本区别是标准的执行方式。 我们开发的应用程序不仅可以将您的创新思想转变为现实,而且还可以通过新的机会和更好的业务解决方案来改进老式系统。 另外,在黑色星期五抢享我们的特别优惠 在Medium上关注我 ,成为第一个阅读我的故事的人。

与Swift编译器配对存根:间谍注册

通常,我们需要使用副作用来对代码进行单元测试,这些副作用会使用抽象(Swift中的协议)与系统的其他部分进行交互。 有很多技术可以构建这种抽象并验证我们的代码是否按预期工作:存根,监视,伪造等。 以前,我深入研究了自动生成存根占位符的方法,该占位符允许在测试用例中无缝自定义模拟函数的功能行为。 让我们通过间谍注册扩展该方法,该注册可以观察并记录在测试案例中产生的副作用。 首先需要知道的是 让我简要地介绍一下如何使用一些Swift编译器帮助来加快构建函数的存根的过程(有关详细信息,请参阅我的上一篇文章)。 假设您希望为包含某些功能的协议创建一个模拟(为了本文的缘故,将其命名为addUser(name:) )。 而且,与其使用自定义标记和/或嵌入的断言从头开始创建它,还不如说每个函数只生成一个变量作为占位符,以在该函数调用期间在内部调用。 以传统方式,您将需要手动提供该占位符函数的类型,但需要使用lazy修饰符和一些简单的辅助函数stub ,它可以由Swift类型系统来推断。 最终的解决方案看起来很简单:

[2018] iOS开发工具包

这是我在2018年主要使用的iOS开发工具,服务,框架等的列表。 开发工具 Fastlane :连续交付 邮递员 :测试RESTful 蜜蜂 Charles :调试和嗅探HTTP-请求 源代码树 : GIT GUI客户端 iTerm2 + 哦,我的Zsh p4Merge :可视化并解决合并冲突 可可豆 , 迦太基 :作为依赖性管理者 服务 结构 :作为“替代”分发平台和崩溃报告器 Testflight :作为本地发行平台 Trello :管理项目 CircleCI :用于持续集成和交付 亚搏体育app 和 GitLabCI :用于存储库管理器以及持续集成和交付 toggl:帮助我跟踪项目工作时间并创建可计费报告 构架 RxSwift :Swift中的反应式编程 来自RxSwift社区 :RxOptional,NSObject-Rx,RxKeyboard和RxGesture Alamofire : Swift中优雅的HTTP网络 领域数据库 ObjectMapper : JSON对象映射 锚点 :声明性,可扩展,强大的自动版式 R.swift :键入和自动完成的资源 SwiftLint :强制执行Swift样式和约定 Kingfisher […]

Swift:无条件的可选

您好,我亲爱的开发人员, 在我分享了有关避免重复的无辜帖子之后,iflets和Guards难以理解,隐式的可选选项和强制转换的效果如何,我收到了来自Reddittors社区的大量反馈。 他们中的一些人甚至声称我无能,对其他人不屑一顾,强奸,并呼吁采取种族灭绝行动。 除了那些过分夸张之外,我注意到的是,大多数注释都标记为Optional作为条件语句中使用的实体或该实体,这会导致崩溃。 作为避免重复数据删除使用的语言功能的借口,我听到的另一重要立场是,代码将变得难以理解。 至少我感到有些困惑,因为条件是使用Optionals的最困难和冗长的方式。 这是因为我们在标准库中有大量的功能,这些功能专门用于可选处理。 我什至没有提到SwiftZ,SwiftX之类的工具,它们将本来就很强大的工具变成了真正令人惊奇的东西。 是的,如果您不了解其背后的基础知识,则它们是不可理解的,因为可选处理的方法源自数学。 但这不是避免使用它们的原因,而是学习新知识和改进的原因。 因此,让我们从头开始。 可选 (如果您不知道的话)是类型,它表示有无价值。 就如此容易。 现在,让我们看一下普通开发人员编写的一些常规Swift代码: 免责声明 : 这是概述方法的示例代码,其他代码段也是如此。 请原谅我,我所有的读者,他们确实理解这一点。 我的文章描述的是通用方法,而不是特定的用例,您会为没有多少人感到震惊。 函数的作用很明显,但是我仍然会解释。 您将两个字符作为边界传递,并接收到两个字符之间的范围内的1个字符长的字符串数组。 我在这里写的唯一一本很少使用的是charToUInt ,因为我想避免重复。 charToUInt是用闭包方式编写的典型函数,因为在我看来,使用func声明如此小巧且易于掌握的函数有点过头了。 您可以在我的文章中了解有关这种重复数据删除的更多信息: 没人理会的常见错误– Swift中的一阶函数 您好,我亲爱的开发人员,让我们看一看完全不同的重复案例。 假设我们… blog.idapgroup.com 亲爱的读者,你们中的大多数人都已经编写或看到了这样的代码。 但是您是否曾经想过,您可以改进该代码,使其更具可扩展性,灵活性和短时性? 现在,在我们进行下一步之前,我强烈建议您阅读这篇有关Monad,Functor和Applicatives的出色文章。 尽管我不会在SwiftZ中充分利用本文的所有概念,但是您仍然会帮自己一个忙,因为您肯定会成为更好的SDE。 而且,它将简化阅读我的文章。 作为快速参考: Monad实现func flatMap (f:(T)-> M )-> M ,其中M是Monad,包装一些值T ; 函子实现func map (f:(T)-> T)-> M ,其中F是函子,包装一些值T。 因此,考虑到所有这些知识,让我们看一下如何将这些知识应用于conditionalCharacterStrings : 如果您准备好要发誓,现在是关闭文章并写评论我多么可怕的最佳时机。 其余所有读者必须了解一件重要的事情。 […]