Tag: iOS应用开发

Swift World:设计模式-观察者

在开发iOS应用程序时,也许您将使用键值观察(KVO)来帮助一个对象观察另一个对象的状态变化。 这是观察者模式的一个例子。 如果您想了解更多有关它的信息,那么官方编程指南和objc.io的这篇文章都是不错的参考。 如下图所示,这种模式既有主体又有观察者。 主题是要观察的目标。 它包含观察者实例,并将有关更改的信息通知他们。 观察者会收到通知并处理更改。 逻辑很清楚。 让我们编写代码。 作为观察者,它只会在收到通知时打印一些信息。 protocol Observer { func update () } class ConcreteObserver : Observer { var id: String init (id: String ) { self. id = id } func update () { print (id + ” observered the subject’s state was changed.”) } } 正如我们提到的,主题有一个观察者列表,并在状态改变时通知每个观察者。 class Subject { […]

iOS 10中的本地通知

本地通知是一种将通知发送给用户的好方法,而无需Internet连接或服务器端编程。 这些通知对于任何类型的“提醒类型的应用程序”都是完美的,并且自iOS 4发行以来就可用。如果您正在编程一段时间,我确定您已经熟悉UILocalNotification类,现在就熟悉iOS的发布10,我敢打赌,您和我一样高兴(这是非常讽刺的方式), UILocalNotification已过时。 好吧,新的更新随新的代码实现一起出现,作为开发人员,我们应该保持代码更新,对吗? 好的,让我们来聊聊吧,让我们构建一个非常简单的应用程序,它会使用新的UserNotifications Framework’s UNNotificationRequest.提醒我们进行UserNotifications Framework’s UNNotificationRequest. 首先在Xcode中创建一个新项目,然后在“链接框架和库”部分中添加UserNotifications Framework 。 转到您的AppDelegate.m文件,然后像这样导入框架… 现在,在didFinishLaunchingWithOptions:内部didFinishLaunchingWithOptions:复制并粘贴… – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!granted) { //Show […]

iOS开发:观看连接

手表开发入门可能很难。 资源很难找到,好的资源甚至更难找到。 本文结合了最佳资源和最佳实践,发现它们可以通过WatchOS 2框架帮助您的手表开发。 入门 第一步是了解手表与手机之间的不同通信方式。 下一节总结了交流的形式,结合了来自Apple文档和以下教程的信息。 使用Watch Connectivity进行通信 。 在本文中,克里斯蒂娜(Kristina)详细介绍了每种交流类型之间的区别。 大多数监视应用程序可能会使用应用程序上下文进行通信,因为“用户只需要最新信息” 将数据获取到WatchOS 2 App 。 柯蒂斯(Curtis)还讨论了手表交流中的差异。 会话为单例会话, 每个应用都有一个会话,一个在电话上,一个在手表上。 您可以在应用程序中的任何位置访问会话并发送数据,但是只有一个位置负责从另一台设备接收信息 (会话单例)。 不要忘记在两端激活您的会话 ,否则数据将不会通过。 监视应用程序打开时,通过applicationContext和userInfo 立即发送数据。 如果watch应用程序从后台启动,则应用程序上下文会快速更新。 Ray Wenderlich WatchOS 2教程 。 一个简单的Ray Wenderlich教程是入门的好方法。 在继续担心使用正确的通信方式并以最佳方式进行操作之前,我将他们的示例项目用作框架来使某些事情起作用。

Swift中的保护套

您最可能听说过if语句,可以将switch情况视为if的更高级形式。 要启动switch语句,请告诉Swift您要使用哪个变量运行事物,然后提供可能情况的列表。 Swift将首先找到与您的代码匹配的大小写 ,然后执行它,然后退出开关 。 这是一个简单的例子: 即使您认为自己的案件将始终执行,也需要使用默认值:重新使用。 多种情况 让我们添加更多案例并利用更多类型的条件。 我们有一个像上次一样的数字,尽管这次我们将检查每种情况下的数字范围 。 像这样: 要检查范围,您只需使用三个句点,如下所示: 1…100 自从第一个以来,没有任何改变。 我们只是添加了更多案例,并检查了一系列数字,以证明您在案例中可以做什么。 差不多了!

优化HTTP实时流(HLS)以获得最佳用户体验2

介绍 为了更好地理解和利用AVFoundation功能,我观看了wwdc18会议502。我想传达优化HLS的信息,以提供更好的用户体验。 在上一篇文章中,我们学习了为KPI选择什么,以及如何减少启动时间。 本文,我们将介绍如何调查HLS播放中的停顿和错误 调查摊位 失速可能发生,并且确实发生! 听摊位通知 那么,如何检测您的应用程序停滞? 有停顿的通知。 AVPlayerItemPlaybackStalled是用于观察停顿的通知名称。 这是侦听停顿通知的代码示例。 检查AVPlayerItem状态,AVPlayerItem日志 当停顿时,您可以观察到一些东西来调查停顿。 首先,您可以检查AVPlayerItem.isPlaybackLikelyToKeepUp 发生停顿时, AVPlayerItem.isPlaybackLikelyToKeepUp为false ,您可以在那一刻开始加载指标。 其次,您可以从AVPlayerITemErrorLog , AVPlayerItemAccessLog查找详细日志。 如 错误说明 观察到的比特率和指示的比特率 减少失速 为了减少失速,应采取以下措施。 提供全套的比特率层 每个编解码器组合都需要自己的一组层 您的内容服务器和CDN必须 毫不延迟地提供媒体播放列表,片段和键 至少在每个目标持续时间更新实时播放列表 同步播放列表之间的不连续序列号 清楚表明服务器端故障 调查错误 我们如何调查错误? 调查方法很少 来自AVPlayerItem的错误和访问日志 来自AVPlayer,AVPlayerItem的错误属性 媒体验证工具来检测内容问题 AVPlayerItemErrorLog 这可能不是致命错误 详细信息在错误注释中 ErrorLog示例 “ 15秒内未收到媒体文件” “ HTTP404:找不到文件” “细分超过指定的变体带宽” “不支持的加密格式” AVPlayer,AVPlayerItem的“状态”属性 这可能是致命的错误 AVPlayerItem.Error结束播放并从播放器队列中删除项目 媒体验证工具 您可以使用媒体验证工具来发布内容 在开发者网站上可用 结论 […]

Swift的用户友好型错误消息

由Max Howell 无论您的代码多么出色,都会发生错误。 因此,良好的错误处理和消息传递对于完善的用户体验和使您的用户感到沮丧的应用程序至关重要。 NSError始终具有非常有用(且已翻译)的localizedDescription方法,该方法为您提供了有用的信息以呈现给用户。 如果错误严重困扰他们的需求,他们可以向您发送电子邮件,也可以将其发送给Google,或者自己弄清楚他们需要做什么。 那是因为可可错误。 苹果花时间使这些消息有用。 但是对于我们自己的错误,至少在Objective-C时代,很少有人愿意做Right Thing™: -(void)foo错误:(NSError **)错误{ 如果(badThing){*错误= [NSError errorWithDomain:@“ TODOland”代码:1 userInfo:nil]; 返回} // … } Swift坚持要通过try对您的应用进行更强大的编码,并具有真正出色的基于enum的自定义错误,因此我们可以轻松,准确地指定错误条件: 枚举AuthenticationError { 大小写无效密码 案例鼠标无法加入我们的服务 } 专家提示:您可以在函数本地编写错误枚举。 这通常是获得良好错误消息的最佳方法,而不必考虑错误对于全局范围的含义。 不幸的是,这些错误的localizedDescription通常为“操作无法完成”: 这违反了我们的介绍:向用户提供了信息丰富且有用的错误消息。 因此,Codebase对Error产生了以下extension : 因此, AuthenticationError.miceCannotJoinOurService的legibleDescription描述为: “AuthenticationError.miceCannotJoinOurService” 。 显然,一个好的localizedDescription会更好。 为此,使您的Error符合LocalizedError并实现errorDescription 。 但是让我们面对现实吧,现在没有时间这样做,上面的代码示例是一个很好的权宜之计。 上面的代码段经过了实战测试,并且经过了严格的测试,更加努力: 错误是来自Cocoa还是Swift枚举的NSError ? 弄清楚这一点是非常困难的:Swift在两个对象之间“有帮助地”架起了桥梁:( as? NSError和as? Error 总是正确的。我们还尝试了ObjC的isKindOfClass似乎可以工作一段时间,但是随后发现了Swift Error实例。 s变成了我们背后的NSError s,因此我们选择了上面的检查,这不是最安全的方法(长期使用的类名可能会更改),但是我们无法立即找到更好的方法,它也可以100%起作用。 如果存在根本错误,并且根本错误消息不是这样,则获取该潜在错误:“该操作无法完成。” CloudKit错误通常掩埋在潜在错误中,因此您(没有我们的代码段!)实际显示的错误是不友好。 将我们的legibleDescription代码与以下函数配对,无论屏幕上发生什么情况,该函数都会尝试显示警报控制器。 […]

等间距的UICollectionView单元格

大多数iOS开发人员使用UICollectionView,并且应内置等距单元 问题 苹果的iOS类UICollectionView和UICollectionViewFlowLayout被许多应用程序开发人员使用,并且大多数情况下这些类可以很好地协同工作,不需要太多的自定义,但是它们做得不好的一件事是自动为所有设备布局分配单元格。 在开发负责显示大型组织的REST服务的照片缩略图的应用程序时,我发现了这个问题。 使用默认值,甚至使用稍微调整的值,我的布局看起来都类似于以下屏幕截图。 虽然单元格之间的水平空白可能很好,但垂直空白要么不存在,要么与水平空白不一致; 同样,在屏幕边缘周围留有一些空白也很好。 可以调整这些值,但是对于每个设备和方向,每个值可以不同。 当前,Xcode的Interface Builder编辑器和UICollectionViewFlowLayout类都没有提供自动设置这些值的方法。 解决方案 为了解决这个问题,我写了一个UICollectionViewFlowLayout的子类DSSCollectionViewFlowLayout,它重写了prepareLayout方法以计算属性minimumLineSpacing,minimumInteritemSpacing和sectionInset所需的值,因此每当用户更改设备的方向或布局时,它们都具有相同的值。应用程序。 进行此更改后,每个单元格周围的空白区域将变得更加令人愉悦。 尽管每个单元周围的空白空间在设备和方向上都不同,但是在特定布局内,空白空间是一致的。 在为Apple平台开发软件时,与编写源代码相比,我更喜欢在故事板和XIB / NIB中尽可能多地添加设置,因此我决定将属性placeEqualSpaceAroundAllCells添加到我的子类中,以便可以在集合视图的内部打开或关闭此功能。资源“身份检查器”面板。 我的子类DSSCollectionViewFlowLayout的Objective-C标头声明了属性placeEqualSpaceAroundAllCells,因此我的prepareLayout版本将知道是否执行等距的空白计算。 子类的prepareLayout实现的Objective-C源代码显示了如何计算水平或垂直滚动​​的正确空间。 而且,为了好玩,我也写了一个Swift版本。 我目前仅将此代码用于正方形和矩形固定大小的单元格,但它也应与可变大小的单元格的集合视图一起使用。

适用于React Native iOS开发的My Development Toolset 2019

大家好! 我想介绍一下我正在使用的React Native iOS开发工具,播放列表,服务,测试,库和网站以及在MacBook Pro 2015和2011上学习的最新选择。 更新:2019年10月30日。 工具类 有一些不同的开发环境DECO和EXPO 或者您可以使用核素 通过 原子 。 我现在使用EXPO XDE。 不要使用DECO家伙。 因为从您的计算机上删除DECO后,DECO仍然保留800MB。 不知道为什么 如果您真正使用真正的IDE,则可以使用PyCharm或Webstrom 。 雪花 , 意大利辣香肠 和Ignite是适用于iOS的React Native入门套件。 f8App提供了教程来帮助您开始使用React Native。 React Native Expo的游乐场。 您还可以找到有关Expo的惊人应用 CodePush是另一个救生器。 此工具是一项云服务,可将移动应用程序更新直接部署到其用户的设备。 Npm桌面管理器 帮助轻松添加,删除,更新全局和本地软件包。 Sentry是一个跨平台的崩溃报告和聚合平台。 ESLint and Flow将帮助您编写更多质量和正确的代码。 DevTools for Redux有助于热重载,动作重播和可自定义的UI。 图书馆 开源React Native 应用的精选列表 NativeBase是React Native必不可少的跨平台UI组件。 我们可以从一个文件而不是每个组件更改应用程序的外观。 MobX是类似于Redux的状态管理库,Redux是当前的实际状态管理库。 但是,MobX尽可能简单。 React Native Apple HealthKit是用于与Apple […]

CUNY代码

该程序 去年春季学期(2016年春季),我加入了名为#CUNYCodes的投资组合开发计划。 该计划旨在帮助对从头开始开发应用程序感兴趣的技术专业人士或个人,使他们能够学习,磨练和展示自己的技能。 最重要的是,它允许刚毕业的毕业生或即将成为研究生的毕业生在10个星期的时间内拥有更多的实践经验。 我加入#CUNYCodes主要是为了培养我的社交技能,此外,我还学习了iOS开发! 因此,我希望能够将我刚刚学到的东西应用于一个项目,而不是一个单独的项目! 我知道我的弱点是能够清晰地交流我仍在努力的思想过程; 因此,通过加入,我可以在这方面进行工作。 与您自己创建某物与与他人创建某物有所不同:交流。 事情可能变得如此复杂! 特别是当一群人来自不同的背景,不同的编程经验以及最重要的是不同的思维过程时! 现在,回到#CUNYCodes! 在#CUNYCodes,有具有软件工程师背景的导师; 因此,基本上总会有人能够指导您进行您正在从事的项目。 此外,它不仅是一个构建投资组合的程序,而且还将提供现实世界中使用的知识和工具。 我记得当我加入时,并不是每个人都知道Scrum是什么以及如何使用版本控制系统,甚至什么是版本控制。 此外,每周都会有来自不同技术背景的演讲者来演讲,讲述他们的经验以及从成为新手到成为现在的人的转变。 我觉得这对于刚毕业的毕业生来说是一个很好的见解,并激发我们改善自己。 我的经验和隐藏的宝石 老实说,我是最后加入#CUNYCodes的人之一。 我被安排在一个团队中,该团队正在开发名为Hidden Gems的iOS应用。 该应用程序可满足旅行者或对根据其当前位置查找本地场所和事件感兴趣的任何人。 我加入的团队共有5人。 我们每个人都有不同的技能和各种编程经验。 另外,已经有一些布局组件组合在一起。 但是,尚未设置后端。 由于我们大多数人都对学习如何设置AWS服务器和安装LAMP堆栈感兴趣,因此我们所有人都在做同一件事-学习如何安装AWS和LAMP。 现在,我们所有人都知道如何设置后端。 从那里,我们最终将任务分配给谁在前端,谁将在后端工作。 我们决定在前端使用Swift,而我们做到了。 当我第一次加入时,我提到过要在后端工作。 但是,我认为可以肯定地说我是满座的。 我最初开始为iOS应用程序创建REST api。 但是最后,我在前端工作,为Hidden Gems创建了各种功能,其中一些使用了Foursquare API。 我们如何管理项目是使用Scrum每周进行冲刺。 我们使用Pivotal Tracker分发了我们的任务和目标。 问题 是的,我为此创建了一个部分! 并没有任何真正的问题-就在我开发Swift 1.2时,而团队中的大多数人还是在Swift 2上。因此,存在着巨大的冲突,但是我们还是设法使它工作了。 我希望Apple的语言不会依赖于操作系统。 我没有升级到Swift 2,因为我不想升级操作系统。 大声笑。 无论如何,下一个大问题是我的一些队友似乎从未使用过git或任何版本控制系统,或者不知道如何使用它。 到底 令人惊讶! 我们将我们的应用程序整合在一起,并且经过10周的努力(对于我来说可能是6个)可以进行演示。 感谢隐藏的宝石团队以及我们的导师John […]

Swift后端的应用程序监视,首次更新

起始时间 自上次更新以来,发生了很多事情,我们想向您介绍我们的进展。 首先,让我告诉您更多有关我们的身份以及我们这样做的原因。 我和Alex五年前在SaaS产品上一起工作,并且在那时也成为好朋友。 Alex为生活设计产品时,我是一名软件开发人员。 在过去的几年中,我一直在为iOS开发,并在此之前使用Node.js和C ++。 我认为,无论使用哪种语言,开发人员工具都是日常工作中令人沮丧的一部分。 我希望您喜欢Xcode,但是……令人困惑的是,我们开发人员没有花足够的时间来使我们的工具更锋利,因为从长远来看,即使工具效率提高5%,也可以节省大量资金。 尽管创建了如此多的编程语言并发布了这些语言的库,但是整个开发过程仍然受到早期计算的启发,当时唯一的输入方法是文本。 看来,对其进行现代化的努力还不够集中和不够完善。 想出一个主意 当Swift宣布具有许多当时被认为是“学术性”语言的功能时,我对它印象深刻。 开源Swift使我们更接近成为全栈开发人员,并将其带入所有其他生态系统。 在那个时候,我围绕着开发人员工具研究自己的一些想法。 如果我们拥有GitHub,但对于iPad上的Swift Playgrounds,又能够轻松地在操场上共享代码,跟随其他人和他们在Swift上的经验,该怎么办? 如果您可以花最少的精力在云中运行Swift代码而不用担心服务器和可伸缩性怎么办? 所有这些都可能是个好主意,我很乐意看到有一天将它们付诸实践🙂 这使我对在Linux上运行具有很多潜在潜力的Swift产生了兴趣。 除了能够为多个平台编写代码之外,Swift本身在这个领域中处于有利地位,唯一可比较的语言是Rust和Go。 Swift在其生成的可执行代码中在可读性/简单性和CPU / RAM占用空间之间取得了良好的平衡。 这方面存在信息空白,我试图填补七月份发布的时事通讯。 订阅者的数量(每周增长5-10%)和内容量证明了我的假设。 非常感谢我们的读者以及所有为服务器端Swift生态系统做出贡献的人们,没有您,这个新闻通讯将无法实现! 这使我确信,可以在生态系统增长的早期阶段对开发人员工具产生最佳影响。 好像我找到了一个合适的人选。 从简单的事情开始是合理的,应用程序监视和检测似乎是一个不错的选择。 事实证明,对于Linux上的Swift,在这方面没有做太多事情。 亚历克斯喜欢这个主意,我们想证明确实有此需要。 验证想法 在将近一个月前启动了Astrocat的目标网页后,我们已经对这件事产生了浓厚的兴趣。 令我们惊讶的是,有多少人已经在生产中使用Swift,而提高后端稳定性和性能的工具将大有帮助。 我们看到了对崩溃报告和仪表工具的明确需求,并对未来产品有了清晰的愿景。 Astrocat的第一个版本将是一个集成在后端中的库,该库会将崩溃和错误报告发送到我们的服务器或本地托管的服务器。 基于这些事件,它通过电子邮件,Slack集成,推送通知等向您发送通知。