Tag: 编程

iOS Push与Amazon的AWS简单通知服务(SNS)和Swift轻松实现

推送是任何移动应用程序中不可思议且必不可少的功能。 亚马逊的AWS通过其惊人的简单通知服务(SNS)为移动提供了推送服务。 我个人发现使用Swift和SNS在iOS上实现推送有点困难,主要是因为没有关于该主题的简化的分步文档。 本教程就是这样:一个简单的分步教程,介绍如何使用Swift和SNS在iOS上实现推送通知。 我们将您要在下面学习的内容纳入了此处列出的大多数产品中。 本教程旨在握住您的每一个步骤 。 我们将创建一个Swift / SNS push应用程序。 首先创建一个单页应用程序:打开XCode并创建一个单页应用程序。 您可以随意调用该应用程序,但要确保名称是唯一的。 创建p12证书:为新应用创建应用ID,推送启用的证书和p12文件。 这是一个很好的教程,请执行以下操作:单击此处。 a)创建一个新的平台应用程序:登录到AWS并转到SNS仪表板。 单击“创建平台应用程序”链接。 b)输入平台应用程序详细信息:输入您的应用程序名称(您的唯一名称)。 推送通知平台应为“ Apple开发”。 4. 完成创建平台应用程序:在下拉菜单中选择“ iOS推送证书”作为推送证书类型。 单击“选择文件”按钮,然后选择您在步骤2中创建的p12证书文件。单击“从文件加载凭据”按钮,如果您为证书创建了一个,则输入密码。 如果没有密码,请将其保留为空白。 完成所有操作后,单击“创建平台应用程序”按钮。 复制应用程序ARN以在XCode应用程序中进一步使用 → 5. 将SNS ARN插入您的应用程序委托:打开AppDelegate.swift文件,并将SNS平台应用程序ARN插入为应用程序委托的第一个变量。 自然,您的应用程序ARN将与下面的字符串不同。 /// SNS平台应用程序ARN 让SNSPlatformApplicationArn =“ arn:aws:sns:us-east-1:203525439813:app / APNS_SANDBOX / SpreebieSNSExample” 6. 下载适用于iOS的AWS开发工具包:转到此处的适用于iOS的AWS开发工具包页面,然后下载SDK或单击此处下载。 7. a)解压缩SDK文件并将其拖放到您的项目中:解压缩下载的SDK,并将AWSCore.framework,AWSCognito.framework和AWSSNS.framework文件添加到您的项目中。 b)嵌入框架:通过转到YourProject-> Targets-> General-> Embedded Binaries,嵌入刚添加到项目中的框架。 添加AWSCore.framework,AWSCognito.framework和AWSSNS.framework。 8.将AWSSNS导入到您的应用程序委托中:将AWSSNS框架导入到您的AppDelegate.swift中 。 导入AWSSNS 9. […]

如何使用比例和图层位置为UIView设置动画。

为什么? iOS开发人员迟早需要在视图之间使用自定义动画。 这通常是位置变化和缩放的混合,主要是将一个视图的框架缩放到另一个视图的框架动画。 您可能首先尝试这样的事情: 有时这会起作用,但如果myView有任何子视图,则不会myView 。 例如,如果myView内部有标签,则myView视图的框架将更改,但标签将保持不变。 相反,我们需要标签与超级视图一起缩放。 我们可以将框架动画应用于标签的框架,但是虽然这会更改标签的大小,但字体不会缩放。 我们需要更好的方法。 我将向您展示如何使用视图的transform属性和图层的position来实现目标。 位置和锚点 在iOS中,每个UIView都有一个带有两个有趣属性的层,用于我们的目的: anchorPoint和position 。 这两个属性已连接,更改anchorPoint或图层的position将更改其在父视图中的位置。 position属性是anchorPoint在超级视图中的位置,因此更改anchorPoint或position将影响子视图在其容器超级视图中的位置。 position值代表屏幕上的点,因此设置x = 1会将视图向右移动一个点。 anchorPoint值不同。 对于anchorPoint ,设置x = 1将在视图的右边缘设置anchorPoint,而x = 0会将其设置在视图的左边缘。 让我们看动画 让我们用一些动画来阐明所有这些。 从视图和子视图开始: 让我们将初始正方形从 至 让我们分解一下,从位置开始,使smallSquare最终在容器内部居中。 好的,那很容易。 现在,我们将smallSquare移到中心时将其缩放到其大小的两倍。 很好,看起来不错。 现在,我们可以以此为基础来创建新功能,该功能会将视图从其初始框架移至新框架。 现在我们可以将上面的转换写为 现在为anchorPoint 我们假设anchorPoint始终设置为x:0.5和y:0.5。 这是默认位置,但是有人可能将anchorPoint移到了其他位置,我们需要考虑到这一点。 我们需要从 至 现在,无论anchorPoint的位置如何,视图都将正确移动和缩放。 出于缩放和位置更改的目的,我们不需要移动图层的anchorPoint,我们可以仅依靠layer.position和transform来实现源自视图中任何点的动画效果。 摘要 我创建的方法可以使您的生活更轻松,应用程序更流畅。 下面是完整功能,作为对UIView的扩展。 我还将附上一个游乐场文件,以便您可以尝试。

使用Swift 4 KeyPath构建过滤器

最近,我与一个同事一起工作,该同事试图将过滤器应用于可观察的数据库对象流。 虽然建议的代码有效,但仅限于仅针对Bool和String值进行过滤,并且它是Stringly类型的API,依靠String键映射到属性。 可行,但可能会更好 不幸的是,这不是很可扩展,也不能防止我们怪异的运行时崩溃 。 例如,假设我们运行一个更改属性名称或类型的数据库迁移,并且具有以下代码: 过滤器{中的(filterKey,filterValue) 守卫让值= object.getValue(for:filterKey)为? 整数 否则{fatalError(“无效的类型转换/无效的密钥”)} } 字符串键入的密钥现在可能已过期并且将导致错误的值查找, 或者呼叫站点将使用错误的类型🤕。 在这种情况下,您可能会出现fatalError或return nil的情况,但是无论哪种方式,这种行为都是不希望的。 因此,我们着手通过两个目标(底部的最终代码)来改善这一点: 使它通用 获得编译时安全 对于那些熟悉KVO或键值观察的人,应该立即浮现一个Stringly typed API的Stringly ,哈哈。 如果您不熟悉,则只需知道需要KVO(过去时,请参阅此处的新iOS 11版本)即可使用NSString/String键路径,这会在属性名称更改且您未更新所有的属性时导致运行时崩溃使用它的地方。 由于我们想要访问属性,因此我想看看Swift 4的新KeyPath API,它是通用的并且很棒。 KeyPaths是一种类型安全的方法,用于将引用类型的属性与评估属性分开。 这是一个例子: 在上面的代码中,我们创建对MyStruct.name的引用,并在第13行对其求值 如上所示,要引用属性,您只需要特殊字符\后跟属性引用即可。 您可以将KeyPath中的泛型视为KeyPath ,尽管它在形式上被称为KeyPath ,但是您可以理解。 然后,使用下标方法[keyPath: ]可以评估您的密钥路径所对应的属性。 有了这种类型的安全性,我们现在可以构建一个过滤器,该过滤器的初始值设定项将导致我们正在寻找的编译时安全性。 在进入代码之前,让我们考虑一下过滤器应该做什么。 与以前非常相似,过滤器应提供一种确定对象是否具有与某个期望值匹配的值的方法。 我们可能要求该值具有Equatable一致性,但这将导致限制性非常严格的API,因此我们只需要一个Matcher闭包即可。 让我们看一下脚手架代码: 过滤脚手架代码 初始化程序有两个通用参数类型: Object ,它是指将应用过滤器的对象, Type是我们将要评估的属性的类型。 使用Swift语言的类型推断,当我们为初始化程序提供KeyPath ,将能够推断出初始化程序的Type约束为PropertyType 。 为什么这么好❓ 它将强制我们的matcher闭包接受一个匹配PropertyType的参数,这意味着如果该属性的类型由于任何原因(例如数据库迁移)而沿线向下移动,则编译器将捕获匹配matcher与PropertyType的不matcher ,从而导致编译时间安全! 🙌🏾 我们现在进展顺利,但这仅仅是脚手架。 […]

重构以获得更好的心态

作为兼职/业余编码员,我可能曾经是Apple的目标程序员:敏锐,充满活力,但如果我要真正实现目标,则迫切需要帮助。 Apple提倡Model-View-Controller应用程序设计的变体已经不是什么秘密了,但值得庆幸的是,他们没有像这样推销它。 它们只是为您提供了所需的所有工具,模板以及自动完成功能,可让您在单个文件(具体来说就是UIViewController)中构建第一个应用程序。 不用离开该文件就可以做一些很棒的事情,但是如果您冒险进入另一个很好的场景,只需将另一个UIViewController放在StoryBoard上,创建一个序列就可以了。 现在,您有一个功能丰富的应用程序,可以做的事,只需要担心两个文件。 简单性令人迷惑,这意味着任何人都可以制作应用程序并在App Store上出售。 但是后来我开始制作具有4个视图,然后是5个,6个的应用程序。然后我想使它在iPad上看起来与众不同。 方向呢? 哦,当然,我希望一切都可以连接并流通。 我开始严重失去控制权,并想知道MVC的含义是什么,因为我似乎只有ViewControllers才多,但幸运的是,播客来帮助我,并向我展示了另一条路线。 Garric Nahapetian的Swiftcoders:第38集与KrzysztofZabłocki

你好ARKit

在进入增强现实的奇妙世界之前,让我们确保已具备所有先决条件。 Xcode 9(测试版或更高版本) :ARKit在Xcode 9(测试版)或更高版本上可用。 因此,请确保下载最新版本的Xcode 9。 物理设备 :您将需要一个物理设备来测试您的ARKit应用程序。 建议测试设备至少包含A9处理器,这意味着iPhone 6S或更高版本或最新的iPad。 iOS 11(测试版或更高版本) :由于ARKit是iOS 11 SDK的一部分,因此要求您的设备运行iOS 11 beta或更高版本。 根据您的Internet连接,下载和安装所有内容可能需要10分钟到45天的时间。 我在开玩笑,最多30天🙂 现在,您已经下载并安装了所有必备软件,并准备好尝试使用iOS版ARKit构建增强现实应用程序。 在本章的最后,您将了解实现ARKit应用程序的基本概念。 启动Xcode 9并创建一个新项目。 您会注意到Xcode 9带有一个专门为ARKit应用程序设计的新项目模板, 如图1所示。 图1:Xcode 9中的增强现实项目模板 选择“ 增强现实应用程序 ”模板后,按“ 下一步 ”按钮。 这将带您到项目选项屏幕,该屏幕允许您配置项目的不同属性。 对我们而言,最重要的选择是“ Content Technology ”,它允许开发人员使用SpriteKit,SceneKit或Metal框架创建ARKit应用程序。 图2:对多种内容技术的支持 确保选择SceneKit,因为本书中的大多数示例都使用SceneKit作为内容技术。 接下来,为您的项目指定一个位置,最后按“创建”按钮使ARKit项目生效。 您只有片刻的时间见证了增强现实的魔力。 运行该应用程序,并确保您的物理iPhone已插入并已连接。 图3显示了运行中的ARKit默认应用程序。 您的花园可能没有我的花园绿🙂 图3:运行中的ARKit默认应用 休斯顿! 我们有ARKit! 本章是我的《 iOS开发者的ARKit》一书的一部分。 立即获取该书,并开始构建出色的增强现实应用程序。 祝贺您运行了第一个ARKit应用程序。 在下一节中,我们将了解制作默认ARKit项目所涉及的代码。 了解项目: […]

什么是Pangram?

我偶然发现了一个编码实践问题,该问题要求我编写一个接受字符串的函数,如果不是字符串,它将返回缺少的字母。 我不知道是什么东西。 我不想让那吓到我。 我去了Google! 七巧板是使用字母表中所有26个字母的句子。 示例如下: “快速的棕色狐狸跳过了懒狗”包含了字母表中的所有26个字母。 不相信我吗? -数一下! 再次,编码问题是要求一个函数,该函数需要一个字符串,如果不是pangram,则返回缺少的字母,如果不是pangram。 它将返回一个空字符串。 这是更短的实现 在字母表中创建一组所有字母,并在给定的str中创建一组字母。 使用.subtracting方法从AlphabetSet中减去inputStrSet。 将结果存储在var missingLetters中。 返回缺少的字母。 我最初不对字母进行硬编码的方法是使用for循环遍历初始化为字符的Unicode Scalars范围“ a”…“ z”,然后使用String.init(char)将其转换为字符串。 将字母放入String到Bool的字典中,字母:false 然后,每次通过字母字典匹配一个字母时,都使用for循环遍历给定的字符串,将该字母的值设置为true。 遍历字母字典,如果value为false,则追加到missingLetters。 最后返回丢失的字母! 感谢您的阅读,今天仅此而已! 在下面的👏掌声中显示您的支持,并在我的iOS开发者之旅中关注我😊 丽莎·姜(@imnotlostrui)| 推特 来自Lisa Jiang(@imnotlostrui)的最新推文。 嗨,我是丽莎! 我希望有一天可以通过移动设备改变世界…… twitter.com NYCgirlLearnsToCode(LJ) NYCgirlLearnsToCode有55个可用的存储库。 在GitHub上遵循他们的代码。 github.com

在iOS中将渐变颜色快速应用于文本

渐变颜色很酷,尤其是将它们应用于文本时。 当然,您可以打开Photoshop或Sketch,对文本应用渐变,导出为png等。在以后需要更改字体,文本,间距等时,这是非常有限的。让我们学习如何使它们全部发生码! 通过下载游乐场来遵循:https://github.com/kgellci/GradientColorsInSwift 创建带有渐变颜色的视图。 在将渐变颜色应用于视图时,CAGradientLayer是您的朋友。 现在是时候添加标签并为文本遮罩渐变了! 您当然可以使用情节提要和自动布局来设置视图和标签。 如果视图更改大小,则必须相应地更新渐变图层的大小。 这足以让您自己开始探索渐变。 通过遮盖imageView或UIButtons标题标签来尝试上述示例。 您还可以浏览Shift的源代码:https://github.com/kgellci/Shift Shift可让您通过定时动画或设备运动快速创建渐变(倾斜设备可移动渐变)。

查询CloudKit中的视频数组,下载并存储在Documents目录中-iOS的Swift 3教程

从CloudKit下载视频非常简单,但是我需要查看多个资源并弄清楚如何修复几个错误才能使所有这些工作正常进行。 本教程假定您具有CloudKit知识和使用documentDirectory的知识。 如果您不熟悉CloudKit,请查看此Ray Wenderlich教程。 这就是我用来学习基础知识的东西。 我们将在本教程中做什么 有一系列我们要下载的视频名称。 检查是否有任何下载 创建一个查询,该查询将发送未下载的视频数组 查询Cloudkit以查找我们需要的记录 下载视频并将其存储在文档中 我假设您已经知道如何设置CloudKit并上传了视频。 步骤1:设定 这是我将在本教程中使用的视频名称的数组。 您将需要更改项目以匹配您在CloudKit中存储的名称。 在您的ViewController中: 让arrayOfVideoNames = [“ Apple”,“ Banana”,“ Cantalope”] 步骤2:获取文档目录的内容 创建一个新文件。 该文件将包含一个名为DocumentsDirectoryFunctions的结构,该结构将具有与documentsDirectory相关的所有功能。 此结构的主要目的是获取documentDirectory的内容,以便我们可以将其与arrayOfVideoNames进行比较。 fileManager和getDocumentsDirectoryPath被标记​​为私有,因为我们不需要在结构外部使用它们。 如果需要,只需删除“私有”即可。 struct DocumentsDirectoryFunctions { 私人让fileManager = FileManager.default 私有函数getDocumentsDirectoryPath()->字符串{ 让directoryPaths = fileManager.urls(用于:.documentDirectory,在:.userDomainMask中) 让docsDirectory = directoryPaths [0] .path 返回docsDirectory } func getContentsOfDocumentsDirectory()-> [String] { var tempArray:[字串] = [] 做{ 让filelist […]

Swift中OOP的基本概念以及如何实现它们

对于每种面向对象的语言,三个概念都很突出:封装,继承和多态。 这些概念是编程语言的通用概念,但与面向对象编程紧密相关。 我决定探索Swift / Objective-C中的概念,并在C中实现它们。 某些概念在编程语言中具有不同的形式。 对于每个概念,我都会简要介绍这些概念。 C 如果您是C程序员,则可以跳过此部分。 但是您从来没有碰过C代码或感到有些生锈,这是示例中使用的语言构造的快速入门。 C有两个文件: .h —头文件,包含函数和数据声明,由客户端代码包含; .c-源代码,实现。 我们将使用指针。 指针是对内存中位置的类型化引用。 指针在类型后使用星号声明。 int *指针; 我们可以创建一个指向内存中任何内容的指针。 C中没有类,但是我们有结构。 struct Foo { 国际会员 }; 结构只能包含数据,不能包含功能。 但是我们有指向函数的指针。 struct Foo { 国际会员 无效(*功能)(无效); }; 如果您在Objective-C中使用了块,则看起来很熟悉。 C需要在使用前声明。 struct Foo; 虚函数(void); 为了方便起见,我们可以为类型创建别名。 typedef struct Foo * FooRef; // FooRef现在是Foo的指针 FooRef foo; 我们可以使用点表示法访问结构的成员。 访问指针值称为解引用。 对于结构的成员,我们可以使用->运算符。 *指针= 123; foo-> […]

iOS开发基础:功能

什么是功能 ? 功能是执行特定任务的一组步骤。 函数是您在程序中使用的一种过程或例程,因此您不必重复自己。 让我们开始写一个,我会一路解释。 功能 每个功能都必须以单词func infront开头。 这就是我们声明函数的方式。 func computeShapeArea 之后,我们写出可以是任何名称的函数名称,但建议使用描述性名称,因此在较大的程序中,将更容易理解函数的用途。 func computeShapeArea(length:Int,width:Int) 之后,您可以看到我在其中添加了两个括号和一些变量。 它们是什么,它们是干什么的? 这些称为参数。 当您的函数需要一些输入数据来工作时(在这种情况下为长度和宽度来计算面积),可以使用参数。 使用它们的方法是首先选择一个名称,在这种情况下为长度和宽度,添加一个冒号,然后此参数将为数据类型,在这种情况下为整数。 func computeShapeArea(length:Int,width:Int)-> Int { } 如果要让函数返回某些内容,请编写箭头符号“->”,然后放置数据类型。 稍后我们将讨论返回数据,现在就跟我来。 在数据类型之后,您要写两个大括号。 在这些括号内,您将编写函数的功能。 func computeShapeArea(length:Int,width:Int)-> Int { 令面积=长*宽 返回区 } 功能现已完成。 现在,您可以输入数据来计算形状面积,它将存储在函数内部的area变量中,然后返回该变量。 要使用它,请在操场上写下函数的名称,如果按回车键,它将自动完成: computeShapeArea(长度:3,宽度:4) 在右侧,您应该看到函数的结果。 在此示例中,您需要输入两个值,否则该功能将不起作用。 尝试用其他数据编写其他示例。 你们中有人想知道如何使功能更精确吗? 如果您做得很棒,但是您将如何做呢? 您可以通过将参数和返回类型更改为double s来做到这一点,以便该函数将接受十进制数字,对其进行计算并返回“更精确的”值。 好的,现在让我们尝试创建一个更高级的功能。 假设您的抽屉里藏着一些钱,想买辆车,但是首先必须检查是否有足够的钱来做。 为什么要打扰,我们将编写一个函数为您检查check var myHiddenMoney = 16000 var newCarPrice […]