Swift 3将文件上传到Amazon S3

我想分享一个简单的教程,介绍如何使用Swift 3将文件上传到iOS中的 Amazon S3 。 我们走吧。 我们需要将Amazon S3框架添加到您的项目中。 在此示例中,我将通过帮助Cocoapods来完成此任务 。 2.创建一个Podfile : 平台:ios,“ 8.0” hibit_all_warnings! use_frameworks! 目标’AmazonS3Upload’做 吊舱“ AWSS3” 结束 3.从终端运行下一个命令: 吊舱安装 4.打开生成的工作区。 之后,我们可以使用Pods的框架来实现文件的上传。 5.我们需要导入2个模块: 导入AWSS3 导入AWSCore 6.使用您的凭证设置AWS配置。 例如: 让accessKey =“ …” 让secretKey =“ …” 让凭据提供者= AWSStaticCredentialsProvider(accessKey:accessKey,secretKey:secretKey) 让配置= AWSServiceConfiguration(区域:AWSRegionType.usEast1,凭据提供商:凭据提供商) AWSServiceManager.default()。defaultServiceConfiguration =配置 7.创建一个上传请求: 让url = …文件的URL … let remoteName =“上传文件的名称” 让S3BucketName =“您在Amazon S3上的存储桶的名称” 让uploadRequest = AWSS3TransferManagerUploadRequest()! […]

使用CI / CD服务构建和部署项目

几个月前,我开始阅读有关CI / CD的文章,但是自上个月与朋友一起开始新的个人项目以来,我再也没有机会在项目中使用过它。 但是什么是CI / CD? CI或持续集成是一种将代码不断集成到您的应用程序中的能力,这意味着您每天/每周或您希望在任何其他时期将新功能和/或修补程序推送到您的仓库中。 持续集成(CI)是一种每天将所有开发人员工作副本合并到一条共享主线的实践(维基百科) CD或持续交付是一种能够安全,快速地连续发布软件的新版本的功能。 持续交付(CD)是一种软件工程方法,团队可以在短时间内生产软件,以确保可以随时可靠地发布软件(Wikipedia) 连续交付是一种以可持续的方式安全 快速 地将所有类型的变更(包括新功能,配置变更,错误修复和实验)投入生产或交付用户的能力 。 (continousdelivery.com) 为了实现这一目标,我们将使用像git(gitlab,github,bitbucket)这样的版本控制系统,开发人员可以将他们的工作推送到发布分支,他们的CI服务将提取该代码,构建,测试并将我们的应用程序部署到beta用户。 我们开始在Google上寻找CI,并发现了一些有趣的服务,例如Travis,Buddybuild,Bitrise,CircleCI和Jenkins。 Travis是免费的开放源代码项目,具有不错的UI,但这是一个私人项目,Travis没有免费的私人回购计划。 Buddybuild是我们的最爱,我们之前使用过它,并且在私人项目上免费使用。 不利的一面是为免费用户建立队列的等待时间很长,但是我们可以忍受。 我们没有尝试使用Bitrise,CircleCI或Jenkins。 对于这个项目,我们决定使用支持私有仓库和Buddybuild的Gitlab。 建立分支机构 我们有两个分支,将用于为我们的用户生成应用。 我们有一个开发人员分支将生成一个beta应用程序,一个主分支将生成一个AppStore应用程序。 您可以拥有多少个分支,例如,生产前分支或alpha测试员分支。 考虑到这一点,我们需要创建并保护这些分支,以便没人能向其中推送一些代码并最终破坏应用程序。 首先,我们需要创建一个新分支,您可以转到您的仓库并选择分支 ,然后选择新分支。 要保护分支,您需要选择设置进入存储库 向下滚动到“ 受保护的分支机构” 。 选择一个分支,然后选择将能够合并和推送的角色。 之后,您的分支将获得受保护的标签。 保护分支意味着没有人可以直接通过Pull Request(PR)或Merge Request(MR)将代码直接推送到该分支,这意味着在该项目上,一旦它被开发,我们将在另一个分支中开发新功能/修复。完成后,我们将其推送到Gitlab,他们创建了一个MR,以将该新功能/修复程序合并到开发人员中。 构建我们的应用 我们选择Buddybuild作为CI服务,因为它: 与Gitlab轻松集成。 私人回购是免费的,即使我们需要等待很长时间才能进行构建(有时等待时间约为一小时)。 在Buddybuild上创建帐户时,您可以选择将其与gitlab,github或bitbucket链接。 选择您的git服务,它将自动扫描应用程序。 它可以轻松,轻松地设置您的项目,完成后您将看到分支。 如果选择更多 -> 应用程序设置 ,则可以配置分支机构设置以及更多。 首先,我们要在不是开发人员或管理员的任何分支上禁用推送,因为我们将仅构建MR / PR,而不构建推送。 如果要构建推送,请启用此选项。 您可以在Buddybuild上设置很多配置。 如果您想了解更多信息,建议您阅读文档。 […]

在iOS中的UITableViewCell中自动扩展文本输入

在iOS中动态扩展视图从未如此简单。 正如我们在iOS的早期版本中所看到的,如果我们需要一个UILabel来根据其内容高度来计算高度,我们可以这样做,但是需要基于内容文本,字体,UILabel宽度等进行一些手动高度计算。它通过调用sizeToFit方法来增长。 对于文本输入,这从来都不是一件容易的事。 如果我们使用UITextField ,我们知道它最多只能输入一行。 对于多行输入,我们使用UITextView并使它可编辑。 但是问题是,我们必须设置它的高度或边界约束。 如果输入内容的高度超过了UITextView的高度,则它不会扩展,而是在该高度内内容可以滚动。 UITableViewCell的动态高度计算更加复杂。 但是在具有自动布局功能的iOS 8之后,生活变得更加轻松,因为苹果终于对它进行了外观设计。 好吧,这里的要求有些不同。 我们需要一个文本输入视图,该视图会随着内容高度的变化而自动增长/缩小。 这是操作方法。 首先,让我们创建一个Xcode项目并添加UITableViewCell的新子类。 说,我们的子类名称是QACell。 因此,让我们打开QACell.xib并根据您的要求添加TextView或UITextView的任何子类。 让我们在UITextView的顶部,底部,左侧,右侧添加边界约束,以便当UITableViewCell的高度发生变化时,其高度可以增加/缩小。 因此,添加约束后,它应该看起来像这样。 现在,打开UITextView的“属性”检查器,并禁用“滚动和弹跳”。 我们必须禁用滚动,因为启用滚动时,UITextView的框架与其内容大小无关。 但是当被禁用时,它们之间是有关系的。 我建议禁用跳动,因为我们需要在UITextView发生的每次更改时都更新UITableViewCell,当启用跳动并且TextView高度发生更改时,我们会有意外的跳动,这是我们所不希望的。 现在,让我们打开QACell.swift并为我们正在使用的UITextView添加一个IBOutLet。 然后是棘手的部分。 我们需要观察UITextView中内容的变化,这意味着当我们在UITextView实例中键入用户时,我们需要知道。 我们知道该怎么做,对吗? 我们需要实现UITextViewDelegate协议,并重写textViewDidChange(textView:UITextView)方法。 在这一阶段,我们知道用户何时通过委托在其中键入内容。 正如我们可以看到的变化一样,当发生变化时,我们必须通知UITableView更新当前UITableViewCell实例的高度。 但这不只是像往常一样重新加载单元格,因为如果我们重新加载单元格,则在键入每个字符之后,单元格将被重新加载,并且焦点将从当前UITextView实例中丢失。 因此,我们将无法正确键入。 而且,如此多次更新Cell绝对是一项昂贵的操作。 因此,让我们解决问题。 因为我们需要将输入更改的信息传递给我们的UITableView,所以我们将通过委托进行操作。 因此,让我们在其中编写一个协议和一个委托方法。 协议ExpandingCellDelegate { func updateCellHeight(indexPath:NSIndexPath,comment:String) } 现在,当UITextView实例的内容更改时,我们将调用委托方法。 因此,实现此协议的类(我们的ViewController)获得了更新特定UITableViewCell实例所需的消息。 在我们的代码中看起来像这样。 func textViewDidChange(textView:UITextView){ self.delegate.updateCellHeight(self.cellIndexPath,注释:textView.text) } 在这个阶段,我们已经完成了构建基础。 现在我们必须把这个事情付诸行动。 让我们打开具有UITableView的ViewController并实现UITableViewDataSource,UITableViewDelegate协议。 而且,实现我们之前创建的ExpandingCellDelegate 。 在cellForRowAtIndexPath中为QACell设置必要的数据源和属性,并像下面的代码一样设置委托。 cell.answerTextView.scrollEnabled […]

Jual Alat Pengukur Suhu Thermogun温度计枪Termometer红外数字

Selama Postingan ini masih tayang barang akan selalu ada 型号GM / GS 320 Spesifikasi: 温度范围:-50〜330(-58〜626) 准确度:1.5%或1.5 分辨率:1%或1 距离斑点比率:12:1 发射率:0.95(固定) 分辨率:0.1 / 0.1 红色激光功率:小于0.5 MW 电源:2节AAA电池(termasuk),dibandingkan dengan pendahulunya yang menggunakan batere kotak 9V。 摄氏和华氏温度。 数据保持功能 激光目标指示器ON / OFF选择 背光开/关选择 7秒内自动关闭电源,无任何操作 产品尺寸:140 x 85 x 35mm(长*宽*高) 条件:100%全新。 Produk ini digunakan untuk mengukur suhu permukaan berbagai benta tanpa […]

大中央车站0611

同步与异步: 同步函数仅在完成其订购的任务后才返回。 另一方面,异步函数立即返回,命令任务完成但不等待它。 因此,异步功能不会阻止当前执行线程继续进行下一个功能。 并发与发与并行 多核设备通过并行并行计算同时执行多个线程; 但是,为了使单核设备实现此目的,它们必须运行一个线程,执行上下文切换,然后运行另一个线程或进程。 这通常足够快地发生,从而给人以并行执行的错觉,如下图所示 串行队列: 串行队列中的任务一次执行一个,每个任务仅在前一个任务完成后才开始。 同样,您也不知道一个任务结束到下一个任务开始之间的时间。 这些任务的执行时间在GCD的控制下; 您唯一要知道的是,GCD一次只能执行一个任务,并且会按照添加到队列中的顺序执行任务。 并发队列: 确保并发队列中的任务以添加顺序开始。 项目可以按任何顺序完成,并且您不知道下一个任务开始所花费的时间,也不知道在任何给定时间正在运行的任务数。 这完全取决于GCD。 何时开始任务的决定完全取决于GCD。 如果一个任务的执行时间与另一个任务的执行时间重叠,则由GCD决定它是否应该在另一个内核上运行(如果有一个内核可用),或者执行上下文切换到另一个任务。 主队列,串行队列,一次执行一个任务。 但是,可以保证所有任务都将在主线程上执行,这是唯一允许更新UI的线程。 此队列是用于将消息发送到UIView对象或发布通知的队列。 串行执行的任务总是一次执行一次。 同时执行的任务可能会同时执行。 闭包是可以存储和传递的自包含,可调用的代码块。 调用它们时,它们的行为类似于函数,并且可以具有参数和返回值。 另外,闭包从其自己的作用域之外“捕获”它使用的变量-也就是说,它从封闭的作用域中看到变量并记住它们的值。

向Siri打个招呼

苹果宣布在上届WWDC中Siri将向开发人员开放。 因此,让我们在应用程序中使用它。 由于SiriKit是一个功能强大的框架,开发人员可以毫不费力地向其应用程序添加语音识别功能。 由于语音在Apple服务器中处理,因此Siri将需要Internet连接。 在将UITextView和UIButton放入视图控制器之前。 当用户点击按钮时,他/他将在UITextView上看到他/她在说什么。 您的应用需要获得许可才能捕获麦克风中的语音并加以识别。 因此,您需要在info.plist文件中添加两个字符串。 密钥为隐私-麦克风使用说明和隐私-语音识别使用说明 。 这些值是任意的。 当然,您将需要在项目中检查这些权限。 为了使用SiriKit,应导入Speech类。 您还需要使用SFSpeechRecognizerDelegate ,该方法只有一种实现方法, func speechRecognizer(_ speechRecognizer:SFSpeechRecognizer,availableDidChange可用:Bool) 。 代码 您可以使用上面的代码来测试设备中的语音识别。 别忘了模拟器不适合测试,因为您可以使用麦克风。 使用真实的设备进行测试。 如果您愿意,可以从下面的Github链接下载示例项目代码: onurtuna / SpeechRecognition-Swift SpeechRecognition-Example-Swift –用Swift编写的语音识别示例。 github.com

自定义CollectionViewCell

CollectionView或TableView的单元格通常都是一直被重复使用,但是重复使用只能使用一样的格式,如果说需要不一样的格式要如何实现? 在app中很常会看到这种分区块的画面,但如果画面内容太多,长度超过手机的画面时,用CollectionView是一个很方便的分块的方法,这个时候就需要自定义每一个cell的样式。 首先要让每个区块链的单元独立,所以每一个单元要各自有一个类,在Xcode中建立档案File-> New-> File-> CocoaTouchClass: 帮每一个区块链建立好之后,开始编辑每一个cell的内容,这边就不多重复述。编辑完之后如何把cell带进去CollectionView呢,如果有用过CollectionView应该会知道cell要先对CollectionView做注册,就算是在Storyboard上的cell也是要定义Identifier才能够让程式知道你是要使用哪一个cell。 接下来要决定在不同的情况呼叫不同的cell来用,在这边只是用很简单的判断式就可以做到: cell的变数要因为你的顺序而改变indexPath.row的值 还没有结束,如果只有这样子就会让你的单元格全部固定一个大小,而且不一定会是你需要的大小,所以我们要用FlowLayout中的方法来更改每个一个cell的大小: 这边要注意size的宽不能够超过CollectionView本身,不然CollectionViewLayout的宽设定出来会是错误的。 现在可以显示出你要的版本面,而且切好区块链之后能够针对一个区块链修改,以后如果需要增加区块链也不用全部重拉,只需要重新排个区块链的顺序,就可以修改画面。 希望这篇文章能够帮助大家更简单的编排UI,而且能更简单的修改。 Nibelheim11 / CustomCollectionViewCell 通过在GitHub上创建一个帐户来为CustomCollectionViewCell开发做出贡献。 github.com

比较NSCollectionView和UICollectionView#1

在将应用程序从iOS移植到macOS时,可以比较相似之处并移植代码。 自2015年使用OSX El Capitan 10.11(现称为macOS)以来,NSCollectionView已改进为现代API,看起来很像iOS的同级产品。 但是,仍有一些细微的更改,您需要进行研究才能注意到。 我将在以后的帖子中写这些。 这次,我将从内容容器的核心元素开始。 在macOS中,它称为NSCollectionViewItem。 在iOS中,您将找到它作为UICollectionViewCell。 内容容器的性质 为了指出这两个容器的基本原理,应从其祖先开始。 继承树如下所示: NSCollectionViewItem> NSViewController UICollectionViewCell> UICollectionReusableView> UIView 在macOS环境中,容器是一个控制器,它像其他View Controller一样具有一堆生命周期方法。 但是,在iOS中,它是一种视图,可以包含元素的子视图。 查看层次结构 为了继续上一点,默认情况下NSCollectionViewItem没有视图。 必须以编程方式或使用Interface Builder创建视图。 您可以在YouTube视频中了解有关如何构建此基础的更多信息。 在iOS中,它要简单得多。 假设您正在使用Interface Builder构建内容,只需将组件拖动到创建UICollectionViewCell附带的视图中即可 。 此外, UICollectionViewCell还具有一些访问视图的默认属性。 contentView-创建随附的默认视图 backgroundView —(可选)显示在单元格其他内容后面的视图 selectedBackgroundView —(可选)选择单元格时在背景视图上方显示的视图 在下一篇文章中,我将讨论准备此内容容器的区别。 参考文献 NSCollectionViewItem 项目是集合视图显示的最常见的元素类型,每个集合视图都必须位于… developer.apple.com UICollectionViewCell – UIKit | Apple开发人员文档 当一个数据项位于集合视图中时,UICollectionViewCell对象将显示该数据项的内容。developer.apple.com

如何在Swift 3中使用动画制作自定义AlertView / DialogBox

尽管我们有UIAlertViewController来显示警报,但是我们没有足够的灵活性来进行自定义。 因此,在这里,我正在编写另一个教程,介绍如何根据需要使自己拥有AlertView / DialogBox。 在本教程中,我们将制作一个简单的AlertView,其中将包含标题和图像,但是您可以使用此方法实现任何复杂的设计。 如果可以想象,就可以做到。 👍 让我们开始吧… 我创建了一个名为Modal的简单协议,该协议可帮助您显示/关闭自定义AlertView / DialogBox。 您可以使用动画值来满足您的要求。 首先将该文件添加到您的项目中。 在将Modal Protocol添加到项目中之后,创建一个新的Swift文件,并为其指定任何名称。 我将其命名为CustomAlertView 。 现在,创建一个名为CustomAlertView的类,并将其作为UIView的子类。 导入UIKit 类CustomAlertView:UIView { } 现在,确认Modal协议并实施所需的变量。 类CustomAlertView:UIView,模态{ var backgroundView = UIView() var dialogView = UIView() } 我们将需要创建自己的初始化程序,以使用标题和图像初始化CustomAlertView ,因此,让我们创建一个将使用Title和Image的初始化程序。 如果要创建自己的初始化程序,则还需要实现所需的 init?(编码器aDecoder:NSCoder)并覆盖 init(frame:CGRect) 。 您还需要从初始值设定项中调用其指定的初始值设定项。 因此,我们通过提供主屏幕边界来调用init(frame:CGRect) ,这将使我们的CustomAlertView覆盖整个屏幕。 如果您想了解有关初始化器的更多信息,请转到此链接 。 便利init(title:String,image:UIImage){ self.init(框架:UIScreen.main.bounds) } 覆盖init(frame:CGRect){ super.init(frame:框架) } 需要初始化吗?(编码器aDecoder:NSCoder){ fatalError(“ init(coder :)尚未实现”) } […]

我用NativeScript构建了东西-第3部分

OAuth + NativeScript 这是第三部分系列的最后一部分。 在第1部分中,我将基于NativeScript的POV作为解决方案。 在第2部分中,我讨论了使用Angular + NativeScript进行更改检测。 在最后一部分中,我将介绍如何将OAuth工作流程集成到NativeScript应用程序中。 以下内容假设您对OAuth 2.0有所了解。 OAuth 在NativeScript中使用OAuth提供了一些障碍。 特别是如果您使用Google作为提供商。 过去(2-3年前),您可以在本机应用程序中执行OAuth,只需将Web视图嵌入到您的应用程序中,允许用户浏览工作流程并查看弹出的code或token的URL。另一端。 如今,Google已消除了该集成渠道(有关安全性,可用性…… yada yada yada😜),您需要使用真正的OS浏览器来引导用户完成工作流程。 这使其更加复杂。 现在,您不仅要查看嵌入式浏览器的URL,还必须了解操作系统将自定义协议的链接路由到您的应用程序的能力。 所以现在看起来像这样 使用callbackURL(例如customprotocol://google/oauth浏览器打开到OAuth工作流程 用户通过工作流程 在auth工作流程结束时,浏览器将重定向到customprotocol://google/oauth?code=blahblah 发生这种情况时,操作系统将拦截该链接并将事件路由到您的应用程序。 因此,您需要侦听它们,拉出code参数,然后从OAuth提供程序请求令牌。 对于iOS,这表示为: 提供一个SFSafariViewController (上面的步骤1)。 通过实现侦听UIApplicationDelegate (上面的步骤4)中的链接: -(布尔)应用程序:(UIApplication *)app openURL:(NSURL *)url 选项:(NSDictionary *)选项 最后,对于NativeScript,您需要: SFSafariViewController : … 让safariVC = new SFSafariViewController({URL:url}); page.ios.presentViewControllerAnimatedCompletion(safariVC,true,null); 实施自定义应用程序委托: 导出类AppDelegate扩展了UIResponder实现 UIApplicationDelegate { 公共静态ObjCProtocols = [UIApplicationDelegate]; applicationOpenURLOptions?(app:UIApplication,url:NSURL, […]