Tag: Swift 4

ARKit和CoreLocation:第二部分

使用线性代数(和Trig)导航 示范代码 ARKit和CoreLocation:第一部分 ARKit和CoreLocation:第二部分 ARKit和CoreLocation:第三部分 数学和坐标之间的方位角计算 如果您没有机会, 请先 结帐 第一 部分 。 现在,我们需要弄清楚如何获得两个坐标之间的方位角(角度)。 找到轴承后,我们进行了旋转变换,以使节点朝向正确的方向。 定义 弧度: 弧度是一个角度度量单位,定义为使得一个弧度从单位圆的中心对向产生的弧长为1。弧度等于180 /π度,以便将弧度转换为度,乘以180 /π。 如果您有两个不同的纬度(地球上两个不同点的经度值),则借助Haversine公式 ,您可以轻松地计算大圆距离(球体表面上两点之间的最短距离)。 – 可动类型 sin =对立/斜边 cos =相邻/斜边 棕褐色=对面/相邻 atan2: 带两个参数的反正切或反正切函数。 棕褐色30 = 0.577 意思是:30度的切线为0.577 arctan 0.577 = 30 意思是:切线为0.577的角度为30度。 按键 “ R”是地球的半径 “ L”是 经度 θ是纬度 “ β ”轴承 ‘ ∆ ‘是增量/变化 通常,当您沿着大圆弧路径(正交运动)时,当前的前进方向会有所不同; 最终航向将与初始航向有所不同,具体取决于距离和纬度(如果要从例如35°N,45°E(≈巴格达)移至35°N,135°E(≈Osaka),将以60°的航向开始,并以120°的航向结束!)。 该公式适用于初始方位角(有时称为正向方位角),如果沿大圆弧沿直线直线移动,则将使您从起点到终点 […]

远程通知样本

要模拟远程通知,您需要配置iOS应用和提供商服务器。 如果您还不了解通知,则需要阅读我撰写的有关本地通知样本的文章。 以下是我在阅读有关通知的所有Apple文档之后并结合NodeJS的基本知识后制作的视频: 在应用程序上配置远程通知 要为您的iOS应用配置远程通知,您需要按顺序阅读以下Apple文章。 它描述了您需要的所有东西,除了服务器端特定编程语言的代码。 向APN注册您的应用 与APN进行通信,并接收可标识您的应用程序的唯一设备令牌。 注意 :要获取设备令牌,您还需要在设备上运行应用程序以及用户权限以显示通知(通过使用UNUserNotificationCenter对象的requestAuthorization(options:completionHandler:)方法)。 设置远程通知服务器 设置服务器以生成通知并将其推送到用户设备。 生成远程通知 使用JSON负载将通知发送到用户的设备。 向APN发送通知请求 将您的远程通知有效负载和设备令牌信息发送到APN。 建立与APN的基于证书的连接 通过在提供商服务器上安装证书来保护与APN的通信安全。 建立与APN的基于令牌的连接 使用无状态身份验证令牌,通过APN保护您的通信。 静默地将更新推送到您的应用程序 传递静默通知,并在用户设备的后台唤醒您的应用程序。 如果您停留在上述任何步骤,都可以在此处下载完整的iOS应用项目。 在服务器上配置远程通知 首先,您需要下载在NodeJS环境上运行的示例服务器项目。 该项目使用基于证书的连接,与基于令牌的连接相比,它部署起来更简单。 打开provider-server.js文件,您将看到以下内容: 您需要为该服务器的操作提供3件事: cert.pem文件的路径 key.pem文件的路径 设备令牌 要获取cert.pem和key.pem文件,您需要阅读本文。 我还使用node-apn节点包来支持发送通知。 你可以在这里读到它。

核心图形样本

首先,要测试Core Graphics的一些示例,您需要创建UIView的子类,并将带有该子类的视图添加到情节提要中。 之后,请阅读以下有关Core Graphics的文章,以帮助您对其进行基本了解。 核心图形 利用Quartz技术的力量执行具有高保真输出的轻量级2D渲染。 处理基于路径的绘图,抗锯齿渲染,渐变,图像,颜色管理,PDF文档等。 CGContext Quartz 2D绘图环境。 UIGraphicsGetCurrentContext() 返回当前的图形上下文。 接下来,按如下所示重写UIView的func draw(_ rect: CGRect)方法: override func draw( _ rect: CGRect) { } 您将在此处放置所有绘制方法。 首先,您需要获取当前上下文: let ctx = UIGraphicsGetCurrentContext()! 接下来的每个绘图操作都需要使用此ctx变量。 如果您遇到以下任何问题,可以在此处下载完整的源代码项目。 1.填充背景色 就这样。 您可以在此处下载完整的源代码项目。

递归迭代:Collat​​z猜想(快速4)

本周,我被要求研究Collat​​z猜想,并编写一个函数,该函数确定达到给定输入达到1所需的步骤。Collat​​z猜想以20世纪初德国数学家Lothar Collat​​z命名。 猜想背后的主要思想是,对于任何给定的数字n (即12),如果给定的数字是偶数,则您将是该数字的一半。 如果是偶数,则继续将结果数减半。 如果不是(意味着,如果数字为奇数),则将奇数乘以3并加1。继续应用这两个运算( n * 2或3 n +1),直到n = 1。 为了显示: 如果是偶数,我将被2除。如果是奇数,我将被3乘以加1。我继续这样做直到得到数字1。 上面,我编号了到达1的步骤。它花费了9个步骤。 在下面,我将研究如何计算代码的步数(当然是Swift!)。 注意:有时我会像“ Colletz”那样拼写“ Collat​​z”,对不起! 当n = 12时,无需递归即可运行此功能花费了0.009045888秒。 当n = 12时,使用递归运行此函数在其上次迭代中花费了0.000402969秒。 请注意,在第一次调用中,它花费了0.008834584秒,这比我编写的没有递归的第一个函数要少。 我希望您喜欢使用DispatchTime,并将带有for循环的函数重构为具有递归的函数,从而对Collat​​z猜想有更多的了解。 请在下面享受一点Gosling / Culkin递归。 资源: DispatchTime –调度| Apple开发人员文档 创建相对于系统时钟的时间,该时间自引导以来开始计时。 developer.apple.com

Swift 4:可丢弃的结果

斯威夫特2.2 在Swift 2.2中,如果您调用一个函数并且不使用其返回的结果,则不会收到任何警告。 要生成警告,方法定义本身需要使用以下注释: @warn_unused_result 即 Swift 3和Swift 4 此行为已在Swift 3和Swift 4中翻转,现在所有未使用的返回结果都会生成警告。 如果您正在设计API,则某些函数的返回值应更多,因此应将其视为副作用,您可以使用以下注释函数: @discardableResult 即 可以在此处阅读有关此更改的快速建议

小Xcode Beta带来的惊喜🎁:核心图形可编码一致性

⭐️⭐️⭐️️⭐️⭐ 嗨! 此帖已移至新博客! 来到Fivestars.blog以获得最新文章! ⭐️⭐️⭐️️⭐️⭐ 如果您早在Xcode 9 Beta 1之前就直接Codable Swift 4的Codable协议,同时启动了一个最新的Beta(3或更高版本),您可能会看到类似以下的警告: 核心图形框架不像Swift一样不是开源的,因此这不是我们可以预见的。 不过,这是个好消息! 事实证明,每一个CoreGraphics Geometric Data Type现在都符合Codable ,即: CGFloat CGPoint CGSize CGRect CGVector CGAffineTransform 太棒了! 我们如何利用这一优势? 如果我们将CGPoints / CGSizes / etc存储在某个地方,则现在必须确保以与新的Codable一致性期望的相同方式进行存储。 让我们看看如何! 尝试1:源代码 最简单的方法是查看源代码,例如,如果转到CGPoint定义,则将看到以下内容: 同样,Core Graphics Framework不是开源的,因此我们只能看到公共函数的标头和定义。 这不会帮助我们了解事物在幕后的工作方式,让我们尝试另一种方式… 尝试2:Apple的文档 我的第二个最佳猜测是Apple的文档,这令人失望: 尝试3:艰难的道路(游乐场!) 厌倦了猜测揭开谜团的新方法,我决定以简单的方式做事。 我开了一个新操场,开始编码: 所以你有它! 🎉🎉🎉 快速回顾一下,这是存储/读取数据的方式(如上面的Playground所示): CGFloat 只需要一个数字,带可选的小数点. 从小数部分中拆分整数部分(如果有小数部分) CGPoint 期望包含两个CGFloat的数组,第一个表示x ,第二个表示y CGSize 期望包含两个CGFloat的数组,第一个表示width ,第二个表示height […]

iOS Touch ID身份验证教程

苹果在iPhone 5s中引入了TouchID,用户无需输入密码就可以使用指纹来解锁iPhone中任何功能的设备。 在OS 7中,Apple并未向开发者发布FingerPrint API,但在OS 8中,Apple向我们提供了在您的iOS App中使用此功能的API。 在本教程中,我将解释如何在iOS应用程序中使用此功能。 本地认证框架 要添加TouchID功能,您必须在项目中添加LocalAuthentication Framework。 转到项目设置>常规,然后向下滚动到链接的框架和库部分。 单击+号并添加LocalAuthentication.framework 。 2.认证视图 对于TouchID,我们将创建一个登录按钮,并在按钮的onClick上提供TouchID身份验证屏幕,以供用户解锁功能。 @IBAction func clickLoginButton(_ sender:Any){self.authenticateUSerTouchID()} 3. TouchID验证的成功与失败 func authenticateUserTouchID(){让上下文:LAContext = LAContext()//声明一个NSError变量。letmyLocalizedReasonString =“访问您的Home ViewController需要验证。” var authError:NSError? ){context.evaluatePolicy(.deviceOwnerAuthentication,localizedReason:myLocalizedReasonString){成功,评估错误,如果成功// //如果触摸ID身份验证成功,请导航到下一个视图控制器 { DispatchQueue.main.async {print(“系统验证成功”)let storyBoard:UIStoryboard = UIStoryboard(名称:“ Main”,bundle:nil)让homeVC = storyBoard.instantiateViewController(withIdentifier:“ HomeViewController”)为! //其他如果触摸ID身份验证失败,则打印错误MSG, {HomeViewControllerself.navigationController?.pushViewController(homeVC,animation:true)}} else // 如果让错误=错误{让消息= self.showErrorMessageForLAErrorCode(错误。代码)打印(消息) } }}}} 4.在Touch ID身份验证失败时打印错误消息 func showErrorMessageForLAErrorCode(errorCode:Int)->字符串{ var […]

Swift 4的可编码协议

在WWDC 2017上,Apple引入了一种特殊的新方法来处理应用程序开发中的重复任务:JSON处理。 到目前为止,依靠第三方库(即SwiftyJSON,JSONShootout)来完成工作是非常普遍的,但是,随着Apple新的Codable协议的引入,许多情况本来可以很好地处理。 新的Codable协议实际上是另外两个协议的Encodable Decodable : Encodable & Decodable 。 这意味着,如果您认为合理的话,您也可以决定将两者分开实施。 让我们从一个示例开始: 假设您正在从咖啡店下载菜单。 您的Coffee模型看起来像这样。 通过简单地实现上述协议,您已经免费获得了一些好东西。 通过实例化JSONEncoder您可以轻松地将咖啡对象转换为Data. 由此,如果您从中初始化一个String ,您已经可以看到模型的JSON表示形式。 你有它。 现在,对于解码器,我们将使用编码器上的outputFormatting属性,以演示Swift 4的另一个不错的小功能,称为多行字符串文字。 通过将编码器的outputFormatting定义为.prettyPrinted我们可以在控制台上很好地呈现JSON,这对于处理更复杂的对象特别有用。 现在,要从JSON数据实例化Coffee,我们将复制打印对象并粘贴到新的字符串变量中,如下所示: 请注意,通过使用此新的“多行字符串”功能,我们能够以这样的方式表示字符串,并带有换行符,而不必转义双引号。 您只需要小心正确地排列顶部和底部的三重引号,一切就可以正常工作。 从那里开始反向过程,将字符串转换为输入数据,然后使用JSONDecoder解析代码并从中构建新的Coffee实例。 太酷了吧?

服务器端Swift-配置文件

在前两篇文章中,我描述了如何向服务器端Swift HTTP服务器添加MVC模式(带有单元测试)。 在本文中,我将展示如何向应用程序添加对配置文件的支持。 配置框架 在ASP.NET Core MVC应用程序中,Microsoft添加了对读取配置文件(以及环境变量,命令参数等)的支持,语法和想法看起来很酷。 下面是可用于读取Microsoft框架中的配置的代码示例。 我想在我的Swift应用程序中实现类似的构造。 决定哪些参数最重要(基于执行方法的顺序)非常重要。 我想订购: file -> system environment -> command parameters 。 首先,我认为我必须自己创建这些类,但是后来我发现IBM创建了一个非常好的库。 IBM-Swift /配置 配置–用于Swift应用程序的分层配置管理器 github.com 这确实是一个很好的框架,可以满足我的所有要求。 它与Microsoft解决方案非常相似。 读取配置 要从我想支持的所有地方读取配置,我们必须将以下代码添加到我们的main.swift文件中。 将BasePath.pwd指定为relativeFrom参数很重要。 它是当前工作目录( PWD )的相对路径。 我的整个main.swift文件现在看起来像这样: 使用IBM的框架读取配置后,我将配置设置转录为自己的对象-该对象仅将我在应用程序中使用的配置存储为属性。 因此,我将在应用程序中使用真实的类属性,而不是字符串键。 我将拥有智能感知和更轻松的重构。 为此,我创建了ConfigurationManager类的简单扩展。 仅根据管理器的属性创建Configuratio对象。 我的Configuration对象真的很简单。 它存储了我可以在整个应用程序中使用的所有配置属性。 我的configuration.json对应于上述类,如下所示: 我们必须将该文件放在Package.swift文件附近。 当我们在Xcode中工作时,这一点很重要,因为此文件夹是当前工作文件夹,并且ConfigurationManager会正确找到此文件。 重建可执行文件后,我们的配置文件必须放在该文件附近。 依赖注入 现在,我已将所有配置存储在专门为此目的创建的对象中。 现在,我希望有一种方法可以在需要访问配置设置的所有地方使用该配置。 当然,最好的解决方案是依赖注入。 我将在我的依赖项容器中注册我的配置对象,并且我可以在任何需要的地方解析配置。 可以按照以下代码进行注册。 我正在将配置注册为单例。 现在我们可以例如通过注入构造函数来解析配置: 因此,在我的TaskRepository我注入了配置对象,并且可以使用该对象中的所有属性。 现在,我已经实现了可用于存储对数据库的访问信息的机制。 在下一篇文章中,我将使用该信息来准备连接以及从实际数据库(使用某些ORM框架)读取/写入对象。 […]

NSKeyValueObserving

Доброговременисуток,Дорогиедрузья! (нет) С. Key-Value Observing (KVO) 。 Key-Value Observing этоважнаяконцепция,которойоченьнемногиеразработчикипользуются。 APIэтойконцепциидостаточнопрост。 Онпозволяетуведомлятьобъектыприизменениисостояниядругогообъекта。 Этозвучиточеньполезно! Key-Value Observing реализуетсяпосредствомпротоколаNSKeyValueObserving。 ,тотпротокол,какуказановдокументации🍏,являетсянеофициальным。 КлассNSObjectужереализуетпротоколNSKeyValueObservingилюбойкласс,которыйнаследуетсяотNSObject такжереализуетэтотпротокол。 UIKitнереализоо Foundation (Военинреализуютэтотпротокол)和Воеклассы。 Ноэтоможноисправить😬。 c Key-Value Observing на примере。 Xcodeисоздадим Single View Application注释。 Послесоздадимдвафайла(класса),которыебудутнаследоватьсяотNSObject: Имплементируем Configuration : О键值Key-Value Observing проста。 Когдаобъектдобавляетсявкачественаблюдателядляопределенноооне Несмотрянато,чтоAPIпротоколаNSKeyValueObserving Swift 3 невелик,оннемногоулучшился。 Смыслвтом, updatedAt 。 在ViewController ,请在ViewController添加一个уведомленобизменении。 Key-Value Observing ViewController Key-Value Observing 。 […]