借助SwiftLocation轻松进行位置管理器和信标监控 SwiftLocation是一个简单而强大的库,可让您轻松处理位置和信标监视,而无需担心CoreLocation设置,也无需在需要获取或使用用户当前位置的任何地方实现无聊的委托。 该库的主要目标是减少准备诸如移动设备的位置管理器之类的常见事物所需的代码量。 旧的可可模式需要您实施大量的样板代码才能获得简单的数据。 幸运的是,随着Swift的引入,iOS和Mac开发中的许多事情都在发生变化,我们被鼓励使用新的模式和范例,例如函数式编程(实际上是很旧的,很古老),以减少编写代码并提高可读性。 让我向您展示一些例子! 假设您需要准确获取当前用户的位置; 我们不需要连续的位置,并且如果相关的精度较低,我们也不想获得所有位置。 使用CLLocationManager,我们需要: 实施授权请求,等待用户响应并开始监视会话 实现CLLocationManagerDelegate协议的所有必需的委托 如果相同的代码在不同的精度要求之间共享,我们需要根据需要过滤任何无效的位置,直到找到正确的位置,然后停止所有 这是一个工作示例: 大约有30行代码只能获取当前用户位置。 而且,除非尝试创建通用类,否则应在应用程序中的所有位置重复此样板代码。 使用SwiftLocation可以减少所有内容: 很好啊? 使用类似的代码,您还可以监视连续更新的位置,只需将频率参数从.OneShot更改为.Continuous(根据您的需要,您也只能获得重大更改或以指定的行驶间隔更改)。 有时,您可能只需要获取一个大概的位置,而无需启动电话的GPS硬件(并向用户弹出授权对话框)。 在这种情况下,您可以仅使用电话的IP地址获得有效的CLPlacemark: SwiftLocation还可以帮助您反转地址字符串并获取CLPlacemark对象:它同时支持Apple和Google服务; 像往常一样,您只需一行代码即可实现: SwiftLocation还允许您监视地理区域,并在进入和退出事件时得到通知: 虽然所有这些功能都是由LocationManager单例类提供的,但是SwiftLocation中还有另一个单例,如果您使用信标,则可能会对您有所帮助。 BeaconManager允许您: 监视信标家庭或信标 用您的设备模拟信标(由于Apple自有类的某些限制,它只能在前台使用) 通过调用monitorForBeacon()或monitorForBeaconFamily()函数,Beacon监视既可在后台运行,也可在前台运行。 想进一步了解SwiftLocation? 您有新功能的想法吗? 在SwiftLocation的GitHub页面上告诉我!
什么是沙盒? 沙盒是一种无需创建金融交易即可测试我们的应用和应用内购买的环境。 使用App Store基础结构但不处理实际付款的测试环境。 而是返回交易,就好像付款已成功处理一样。 使用iTunes Connect创建沙箱测试器 在iTunes Connect中创建沙箱测试程序帐户,您可以使用该帐户在测试环境中运行应用程序,然后再将其提供给用户使用。 在iTunes仪表板上,单击“用户和角色”,然后单击“沙箱测试器”。 单击测试器旁边的添加按钮(+)。 输入测试人员信息,然后单击保存。 对于每个沙箱测试器,您需要收集以下信息: 名字 姓 从未用作购买iTunes或App Store内容的Apple ID或与任何现有Apple ID相关联的电子邮件地址。 考虑为每个沙盒测试器创建一个专用的电子邮件地址。 密码 秘密问答 出生日期 App Store地区 测试订阅 在沙盒环境中测试应用程序时,可自动更新的订阅持续时间会缩短。 此外,测试订阅仅在每个8小时窗口内自动续订每个帐户最多六次,然后订阅将在每个订阅期结束时自动过期。 无论应用程序是否处于活动状态,续订都会自动进行,就像App Store中的续订一样。 这种测试机制的唯一问题是无法选择测试*取消订阅*。 同样,在使用沙箱和TestFlight环境时也无法测试订阅管理。 每次续订都会向应用程序发送交易数据,交易取决于续签发生了多少次。 下一次在应用程序打开进行验证时将进行处理,这些交易会触发另一个密码提示。 此多个密码提示仅在测试中出现。 测试续订和到期 由于时间限制,请使用每月订阅进行测试 订阅每月订阅 关闭应用程式 5分钟后启动应用程序 应用程序将显示密码提示,输入密码 重复步骤2至4 6次。35分钟后,该应用现在应恢复为取消订阅状态,并允许用户再次付款。 测试还原购买 订阅每月订阅 在5分钟内删除该应用 安装应用程序并打开 点击恢复按钮 在这种情况下,应用程序应找到活动订阅以向用户解锁专业内容。 测试跨设备的还原购买 订阅每月订阅 在其他设备上安装该应用 开启应用程式 点击恢复按钮 在这种情况下,应用程序应找到活动订阅以解锁专业内容。 […]
一种学习Swift中Redux入门的简单方法。 Redux是一种架构软件模式的实现,该模式优先考虑单向数据流。 它是由Flux架构(由Facebook开发)创建的,在应用程序的开发中已取得了长足的发展,并有望在其使用中带来巨大的优势。 它是诸如MVC,MVVM和Viper之类的其他架构模式的替代。 好处 Redux的巨大希望之一就是创建约束条件,以鼓励更有组织的软件开发和测试,因此,由于这些原因,最终会降低开发阶段的复杂性,并提供维护应用程序状态和高级调试的工具。 。 本文介绍了一种开始了解这种新模式的简单方法。 实施要求 在iOS(Swift + Xcode)上构建应用程序的基本级别。 观察者模式知识。 知道如何使用CocoaPods依赖系统。 组件 状态:代表应用程序的状态。 只能有一个,可以分为子状态。 动作:这些是描述系统功能的简单对象。 根据情况,这些对象是否可以携带信息。 它们是由View层调度的,目的是更改应用程序的状态。 减速器:这是我们开发应用程序主要逻辑的地方。 减速器必须是无副作用的纯函数,并且必须是同步的。 它们是唯一可以为应用程序创建新状态的对象。 给它们一个动作和当前状态,并返回一个新状态。 请注意,单向流是在View调度Action时发生的。 此Action传递到相应的Reducer,因此,此Reducer根据先前的Action生成一个新的State,并将State传递回View,以便对其进行更改。 商店:这是此实现过程中最重要的组成部分。 它是汇总上述所有组件并使流程正常工作的原因。 View将新的Action调度到商店。 然后,商店将此动作与当前状态一起传递给Reducer,然后接收回还原器的新状态。 每当创建新状态时,都会警告视图,这可以通过实现观察者设计模式来实现,该观察器设计模式允许视图成为要通知的商店的“订户”。 开始吧 我开始学习Redux的方法是使用一个名为ReSwift的库来构建示例应用程序(“ Rock,Paper and Scissors”游戏),该库在Swift中实现了该架构的概念。 我们首先概述应用程序的外观。 为简单起见,该应用程序应在单个ViewController上工作,在底部包含3个按钮(Rock,Paper和Scissors),在顶部包含1个消息字段,并包含2个占位符,以显示玩家何时进行移动以及最后移动揭示玩家的武器。 为了开始开发,我提出了一个用例,其中Player1选择剪刀,而Player2选择Rock ,从而赢得了Player2的胜利。 该流将发生如下: 发展历程 在Xcode中创建一个新的“单视图应用程序”项目,并使“包含单元测试”能够使用Redux的概念进行测试。 使用CocoaPods安装“ ReSwift”吊舱。 接下来,我们将创建第一个组件,状态。 查看上图,我们可以清楚地看到应用程序在执行过程中将发生变化的部分,其中每个部分都由应用程序的状态组成。 然后,我创建了一个State.swift文件,并将状态形成结构以及可能形成应用程序概念的模板结构放入其中。 重要的是要指出结构必须是不可变的,以便Redux起作用,只有这样我们才能确保状态仅由化简器更改,因此我使用了Structs和Enums而不是Classs: 现在让我们创建一个动作,该动作将描述打算更改状态的动作。 在这种情况下,我们只有一个ChooseWeaponAction ,它在每个玩家选择武器时触发: 最后,我们将构建减速器。 在这里,我们过滤创建的Action,获取应用程序的当前状态,并根据将使用Action中包含的信息开发的逻辑来生成新的State: 测试 […]
在阅读本文之前,但对UIScrollView ,我强烈建议您在UIScrollView上阅读此介绍文章。 PS:自从我在Brian YouTube网站上开设Brian Voong的Youtube课程以来,我已经将自己转换为程序编码员,这意味着我100%的UI员工使用的是代码而不是故事板。 首先第一件事: 最初,事情对我来说看起来很简单,只是: 将UIScrollView添加到主UIView 。 在UIScrollView上添加顶部,左侧,右侧,底部自动布局约束。 将UILabel (显示很多文本)作为子视图添加到刚刚添加的UIScrollView 。 在此新添加的UILabel上添加上,左,右,下AutoLayout约束。 然后,我认为事情应该正常进行。 虽然不是这样。 问题:UIScrollView无法滚动。 原因:尚未正确设置UIScrollView的contentSize。 如何以正确的方式做到这一点: 在现有或新创建的项目中,创建一个新的Swift文件:ScrollViewController.swift 2.在ScrollViewController中,添加所有UI元素将很快使用。 let text =“”“ Lorem ipsum dolor amet,除其他外为adhuc aperiri nam。按商品价格出售commodo melatore ea eam,按商品价格出售commodo meliore ea e。 persius pro,id cum falli accusam。在欧洲有良好的党派,多名成员,在nam。tempor poscent有意向书。 ad eam。per ce lalit vivendum。Ei sit null null aliquam,ferri epicuri quo。ex vim tibique […]
更新:将文章和项目更新为Swift 3.0 在线上有很多帖子,介绍如何使用界面构建器配置动态表格视图单元。 但是,针对程序化编程的程序几乎不多。 而且由于有了NSLayoutAnchor,所以事情从未如此简单! 最后,您将知道如何使用AutoLayout基于标签内容创建动态高度的tableview单元。 入门项目 首先,让我们从以下启动项目开始。 该应用程序删除了Storyboard,并将View Controller推送到应用程序委托内的导航控制器上。 我们将要交互的主要文件如下 Book.swift —包含书籍名称和详细信息的模型类 BookTableViewCell.swift —符合UITableViewDataSource协议的空UITableViewCell子类 BookDataSource.swift —包含用于生成书籍清单的类方法 ViewController.swift —空的ViewController子类 配置TableView 在函数configureTableView(:)中,添加以下代码 tableview.estimatedRowHeight = 100 tableview.rowHeight = UITableViewAutomaticDimension tableview.registerClass(BookTableViewCell.self,forCellReuseIdentifier:bookCellReuseIdentifier) 通过更新estimatedRowHeight属性,我们获得了以下效果: 如果表格包含高度可变的行,则在表格加载时计算其所有高度可能会很昂贵。 使用估计可以使几何计算的某些成本从加载时间推迟到滚动时间。 创建自调整大小的表视图单元格时,需要设置此属性并使用约束来定义单元格的大小。 注意,我们还设置了tableview的rowHeight属性。 这样,我们就可以预期单元格的自调整大小行为。 此外,我注意到一些开发人员重写heightForRowAtIndexPath可以达到类似的效果。 由于以下原因,应避免这种情况。 使用tableView:heightForRowAtIndexPath:而不是rowHeight会对性能产生影响。 每次显示表视图时,它都会在委托中为其表的每一行调用tableView:heightForRowAtIndexPath:,这可能导致表视图具有大量行(大约1000或更多)而导致严重的性能问题。 registerClass只是用一个标识符注册我们的BookTableViewCell。 通过使用NSLayoutAnchor,我们将tableview的锚点固定到其superview。 在configureTableView(:)中添加以下代码 view.addSubview(tableview) tableview.translatesAutoresizingMaskIntoConstraints = false tableview.topAnchor.constraint(equalTo:view.topAnchor).isActive = true tableview.leadingAnchor.constraint(equalTo:view.leadingAnchor).isActive = true tableview.bottomAnchor.constraint(等于:view.bottomAnchor).isActive = true tableview.trailingAnchor.constraint(equalTo:view.trailingAnchor).isActive […]
Partiamo dall’inizio… 2014年 Apple Presenta durante la conferenza mondiale degli sviluppatori wwdc2014un nuovo linguaggio di programmazione destinato(目标C)utilizzato fino a quel momento per lo svilups di programOS allOS,OS OS, )。 Il scelto per il nuovo linguaggioèSWIFT(dall’inglese“ rondine”,“ rapido”)。 快速达成共识, 迅速达成目标,在目标C的客观C行为中使用未成年人的犯罪行为。 可能因语言问题而无法使用Apple Consiglia的问题。 Swiftpuòben definirsi il risultato di una attenta selezione darwiniana (in cui l’uomo recita la […]
6本必读的书籍,可帮助您迅速成为程序员和iOS应用程序开发人员。 “要成为一名优秀的程序员,需要做两件事。 一种是获得大量练习。 另一个是要接受真正的良好教育” 1. Apple的Swift编程语言(Swift 3版) Swift对新程序员很友好。这本书由apple.swift编写,是在C和Objective-C的基础上构建的,没有C兼容性的限制。这是swift学习编程的最佳资源。 2. raywenderlich.com教程团队的快速学徒 本书适用于想快速学习编程的初学者,也适合于对编程有一点了解的初学者。 也许您为网站或某种程序编写了一些JavaScript。 在编程过程中会遇到一些练习和挑战,并在测试过程中测试您的知识。 3. CodeWell Academy和RMZ Trig编写的《使用数据结构和算法版的Swift大师手册》 这是一个非常不错的初学者指南,可以使用数据结构和算法进行编码。 在本书中,您将学习如何以及在哪里,何时,为什么使用代码。 最重要的是,您将学习如何使用。 您将首先观察世界并定义代表事物(数据)或动作的代码。 您会发现更高级的概念。 4.用Swift 2进行面向对象的编程作者:Gaston C. Hillar。 面向对象编程(OOP)是现代软件开发所必需的.Swift是一种多范式编程语言,其最重要的范式之一是OOP。 这很有意义,因为面向对象的编程可以使您最大程度地重复使用代码并最小化维护成本。这本书包含了太多的抽象概念,这些概念要求真实的示例易于理解。 5. Neuburg,Matt撰写的《 Swift的iOS 9编程基础》。 这本书是iOS应用程序开发的初学者。在这本书中,您将了解Swift,Xcode和Cocoa框架的基础。 还有Swift语言基础知识,UIApplicationMain函数,笔尖加载机制,委派和通知的Cocoa模式以及保留周期。 6.通过Matt Neuburg对iOS 9进行编程 本书具有一些高级的功能强大的iOS 9编程。这本书描述了视图,视图控制器,iOS应用程序界面的基本单元,应用程序委托。调查了iOS提供的最重要的辅助框架。
我2年前开始进行iOS开发,从Treehouse,Raywanderlich,objc.io和GitHub学习。我使用委托将数据从一个ViewController传递到另一个ViewController。我们可以使用RxSwift在几行代码中实现相同的任务。根据标准Rx代表文档 Rx是通过Observable接口表示的通用计算抽象。 像原始的Rx一样,RxSwift的目的是实现异步操作和事件/数据流的轻松组合。 KVO观察,异步操作和流都在序列抽象下统一。 这就是为什么Rx如此简单,优雅和强大的原因。 为了从rootViewController上的推送的viewController传递数据,我们可以轻松做到。 我们必须在SelectedDataVC类的ViewController类上传递数据,让我们深入了解一下。 1.使用CocoaPods,Carthage安装RxSwift和RxCocoa 2,在SelectedDataVC中添加变量和可观察变量 私人让selectedVariable =变量(“”) var selectedObserver:Observable { 返回selectedVariable.asObservable() } selectedVariable是具有一些String的初始值的变量。 selectedObserver是Observable which做一些工作,观察者可以对此做出反应。 当用户从SelectedDataVC中选择一些数据时,只需将数据值设置为selectedVariable selectedVariable.value = selectedName 在ViewController类中添加DisposeBag。根据文档: 处理袋用于将类似ARC的行为返回给RX。 当DisposeBag被释放时,它将在每个添加的一次性物品上调用dispose。 现在,当某些用户单击加号图标以在ViewControllerVC中设置数据时,则SelectedDataVC将被推入堆栈。添加以下代码行: 让selectedItemVC = self.storyboard?.instantiateViewController(withIdentifier:“ SelectDataVC”)作为! SelectDataVC selectedItemVC.selectedObserver .subscribe(onNext:{[弱自我] selectedName在 如果selectedName.count> 0 { self?.displayLabel.text = selectedName } } .disposed(作者:disposeBag) self.navigationController?.pushViewController(selectedItemVC,animation:true) 在实例化SelectedDataVC的过程中,我们正在ViewController类中订阅SelectedDataVC的事件,每当selectedVariable值更改时,我们在ViewController类中的标签就会更新。 这是完整的演示代码:https://github.com/EonKid/RxSwiftDemo 感谢您的阅读。如果您有任何疑问,请发表评论。
QR码是一种二维条形码,最初是为日本汽车工业开发的。 编码URL,推广虚拟商店,访问加密货币钱包,向消息传递平台添加新联系人— QR码(或其某些变体)为处理各种类型的数据提供了一种简化的方法。 让我们看一下使用静态数据创建我们的代码(例如,字符串)。 在上面的代码中,我们创建了一个称为generateQRCode(from:)的函数,该函数返回可选的UIImage 。 在此函数中,我们首先要将字符串转换为Data对象(它只是字节的MutableCollection )。 该对象将使用某些给定的编码包含我们字符串的表示形式。 在这种情况下,我们使用ISO Latin 1 ; 但是, ASCII或UTF-8也可以。 现在,使用参数名称“ CIQRCodeGenerator”创建CoreImage过滤器的实例。 本质上,我们已经初始化了一个CIFilter对象,该对象用于名为“ CIQRCodeGenerator”的特定过滤器。此参数名称使我们可以引用Swift的内置过滤器来通过Core Image框架生成QR代码。 在Swift中使用CIFilter方法创建过滤器后,必须调用setDefaults()或setValue(_:forKey:)分别设置参数。 在Swift中使用CIFilter方法创建过滤器后,必须调用setDefaults()或setValue(_:forKey:)分别设置参数。 考虑到潜在的复杂性,在某种程度上这似乎是深奥的,而且应该在某种程度上。 仔细看看下一行: 在这里,我们传递data常量(它只是字符串的编码版本)来设置键“ inputMessage”的值。这一步骤至关重要,并且因为设置和检索了CIFilter对象的参数,所以它以这种方式工作通过使用键值对 。 做完了! 好吧,不完全是。 回顾一下,我们向generateQRCode(from:)函数传递了一个字符串,然后将该字符串编码为数据对象。 然后,我们创建了一种特定类型“ CIQRCodeGenerator”的CIFilter对象。最后,我们使用了数据对象来设置键“ inputMessage”的值,该键表示在QR码生成中使用的数据输入。 本质上,我们已经检索了一个特定的模板,收集了所有必需的组件,但是仍然没有返回任何内容。 不用担心转换废话; 我们将在片刻内解决该问题(我们正在使用它来消除生成的QR码中的模糊感)。 专注于展开输出。 我们为什么这样做呢? 这是因为filter(这是我们的CIFilter )返回一个可选的CIImage (再次,请随意忽略最后的.applying(transform) )。 在这种情况下, CIFilter最终使用字符串作为输入来生成CIImage对象。 为了使图像正确显示在imageView插座中,我们将其投射为UIImage 。 最后,我们得到以下信息: 不好了! 为什么我们的QR码如此模糊? 由于我们的CIImage是由点组成的,因此将所得的UIImage缩放为适合我们的UIImageView ,这导致缺乏清晰度。 这就是变换部分的来历! 我们创建一个仿射变换矩阵 ,用于缩放QR码。 这只是用于绘制2D图形的struct […]
断断续续的一年多来,我一直在尝试获取一个小的Swift Docker映像。 我发现小图像是有好处的,特别是在可伸缩的微服务架构中,容器不断地移动到不同的机器上,并且需要占用很小的空间并快速启动。 目前,基本的swift:4映像为1.3GB! 这使得难以在图像周围移动(推动和拉动)以及协调众多容器。 最初,四处搜寻使我进入ibmcom/swift-ubuntu-runtime ,它仅包含必要的运行时依赖项。 这是一个很大的改进,基本大小为338MB,仍然很大,但比基本Swift映像小了近4倍。 实现小图像的一种范例是静态链接容器的主要二进制文件,并将其FROM scratch放入图像中。 这可以通过许多不同的编译器来实现。 不幸的是,Swift编译器在静态链接标准库和Foundation时存在一些问题。 但是,使用Docker的多阶段构建功能并从基础Swift映像复制必要的共享库将使您拥有比IBM Swift运行时映像小的映像。 我编写了一个shell脚本,该脚本使用二进制文件的名称以及可选的输出文件的名称,该脚本使用ldd确定二进制文件使用的共享库,并将它们压缩为gzip压缩的tar文件。 使用此脚本,我能够从基本的Swift映像开始,构建二进制文件,并将依赖项和二进制文件复制到busybox映像中。 我用这种范例构建了两个图像:一个简单的print(“Hello, world”)程序和一个Vapor“ Hello,world”网络应用程序。 print图像为102MB,而蒸气图像为113MB,大约是ibmcom/swift-ubuntu-runtime图像的ibmcom/swift-ubuntu-runtime ! 希望很快就能解决静态链接,并且图像可能会更小。 快乐的Swift-ing / Docker-ing!