Tag: 编程

iOS 10远程通知

在iOS 10中,通知发生了很大变化。 远程和本地通知方法是统一的。 您可以使用通知扩展名添加图像之类的媒体。 在本文中,我将讨论如何设置通知类型和注册远程通知。 在下一部分中,我将向您展示如何处理远程通知和可操作的通知。 远程通知过程 首先,了解如何使用远程通知会很有帮助。 远程通知涉及以下步骤: 配置您的通知类型并注册远程通知 注册到APN的远程通知 将设备令牌注册到服务器(推送通知提供程序) 在提供商和APN之间进行通信 处理远程通知 步骤3和4是服务器端过程。 步骤1.配置通知类型并注册远程通知 1)配置通知类型 您需要请求授权才能接收通知。 在此阶段,您可以设置通知类型,例如警报,声音和标志。 在iOS 9及以下版本中 使用`registerUserNotificationSettings`方法 在iOS 10中 使用`requestAuthorization(options:completionHandler:)`方法。 func requestAuthorization(options:UNAuthorizationOptions = [], completeHandler:@转义(Bool,Error?)-> Void) 选项描述您要提供的通知类型。 completeHandler具有两个参数: Grant和error –如果未发生错误,则错误为nil 。 – 授予的返回true或false取决于以下情况。 这不是我期望的结果。 为什么? 授予所请求选项的授权时,此参数的值为* true *。 当一个或多个选项的授权被拒绝时,该值为* false *。 在Apple文档中,他们谈论的是请求的选项,而不是通知设置。 但是实际的测试结果与上面的列表不同。 即使用户更改了授权选项(例如在设置应用中禁用警报),它也没有返回“ false”值。 首次启动应用程序时,“授权请求”对话框仅出现一次。 因此,我建议您将`.alert`选项设置为默认选项。如果您从`registerUserNotificationSettings`或`requestAuthorization(options:completionHandler:)`中省略了该选项,则无法在设置应用程序中为您的应用程序通知找到警报选项。 2)注册远程通知 调用registerForRemoteNotifications()方法。 如果注册成功,它将自动调用` […]

为什么编码很重要:位和字节入门

那是编码的黑暗时代。 交流很容易中断,普通用户很难弄清楚到底出了什么问题。 此问题是由于使用不同的编码来读取字节序列而导致的。 要了解此问题的症结,我们来看两个关键术语: 位 :信息的基本单位,通常表示为0或1 字节 :固定长度的位序列,通常由8位组成 因此,一个字节将被表示为2⁸= 256个数字,范围从0到255(或以位为00000000到11111111)。 字节中的位被赋予索引。 最右边的位(也称为最低有效位 )的索引为0,最左边的位(也称为最高有效位 )的索引为7。 今天,情况仍然如此,顺便说一句! 至少可以说,使用二进制(或十六进制)表示法麻烦且效率低下。 需要某种编码标准。 这就是奇怪的地方,因为您可能已经猜到,原始位序列的含义根据所使用的编码而改变。 输入ASCII码 ASCII是一种字符编码标准,它使用7位表示基于英文字母的128个指定字符。 0到32之间的数字保留给控制字符,这些控制字符指示如何解释和表示数据。 它们被设计用于打印控制,数据结构和传输控制。 所有未重音的英文字符都使用32到127之间的数字。 这里的关键是ASCII是为不重音的英语字符设计的。 尽管该编码仅使用7位(不使用整个位),但是ASCII不能轻松地用于许多其他语言。 例如,亚洲字母有成千上万个字母,这些字母再也不会适合8位。 许多其他字母都使用重音,例如ˆ ´ , ¨等。 因此,就像美国开发ASCII ,其他国家也创建了自己的编码。 这导致了基于不同语言的需求和细微差别以及需要进行转码的各种代码标准的不一致混合。 实质上,不同的国家/地区具有不同的编码标准。 当计算机问世时,就不可能在为不同标准量身定制的软件之间有效地交换信息。 然后是ISO/IEC 8859 —一种与8位 ASCII向后兼容的编码,由来自拉丁文字的191个字符组成。 它包含各种口音 ,可以完全覆盖南非语,科西嘉语,法罗语,挪威语和许多其他内容。 但是, ISO/IEC 8859仅使用单字节固定长度编码对前256个Unicode字符进行编码,这意味着某些语言仍然不兼容。 例如,考虑为西里尔字母设计的ISO/IEC 8859–5 : 以及GB 18030中华人民共和国的官方字符集: 尽管西里尔字母已集成在ISO/IEC 8859 ,但它不支持中文书写系统。 输入Unicode Unicode是一种计算行业标准,用于对世界上大多数书写系统中表示的文本进行一致的编码,表示和处理。 最新版本的Unicode(9.0)包含超过128,000个字符的库,涵盖135个现代和历史性脚本以及多个符号集。 […]

Swift中的回调– TableView和CollectionView的实际示例

您非常喜欢某件东西,因此您始终希望围绕它。 所有程序员都沉迷于某种东西,如果您是iOS开发者,那么当您被介绍到UITableView和/或UICollectionView ,您将UICollectionView 。 当您使用UIScrollView危险时,您会更加爱他们(我是说😢)。 我已经看到程序员非常喜欢某些数据结构(即enum , struct ),以至于他们只能思考。 这种爱带来了一些在别的事情的帮助下做某事的非常酷的技巧。 因此,在开始快速讨论之前,让我更新前面提到的报价, 您非常喜欢UITableView和/或UICollectionView ,以至于即使是简单的输入FORM看起来也UICollectionView 。 请参阅此非常简单的表单以获取用户输入。 它具有一些文本字段和一些标题标签。 可以使用UIScrollView在本地UIViewController轻松设计和维护(适用于较小的屏幕)。 但是,如果您喜欢TableView,那么您会发现它也可以很容易地实现。 我认为它具有一些明显的优势 。 但是让我们看看这怎么可能是一个实施问题。 表单的设计和表示形式与自定义单元格类完全没有问题,但是问题是如何将数据从custom cell对象传输到TableViewController对象。 我将通过图表显示。 现在,可以通过多种方式将输入文本返回给Parent ViewController 。 我们可以使用protocol声明, Notification userInfo等来实现。但是今天,我将讨论一种通过回调函数完成此操作的巧妙方法。 现在,在各种平台和语言中以各种方式定义了回调。 简单地说,回调会将某些内容返回给调用方。 它可以返回值,引用,函数或返回自身。 好的好的。 我说话太多了。 让我们看一些代码。 假设这是一个自定义UITableViewCell类 由名为UserController的UITableViewController实例化。 我们可以在控制器中UITableViewDataSource cellForRowAtIndexPath方法中执行此操作。 让cell = tableView.dequeueReusableCell(withIdentifier:“ singleTfCell”,for:indexPath)为! SingleTfTableViewCell cell.staticLbl.text =“公司” cell.inputTf.text = company ///如果表单处于编辑用户信息模式 返回单元 我们知道。 来吧,已经显示了回调!! 是的,我要去。 […]

成为一名优秀的技术大使– Matt Massicotte –中

成为优秀的技术大使 最近,围绕Swift的Apple开发人员世界也进行了大量讨论。 最近关注的焦点是缺乏动态功能。 考虑到Objective-C的动态性以及围绕该功能构建的Apple API的数量,我认为这是一个特别有趣的讨论主题。 在这个主题上有一些相当体贴的文章,我很喜欢阅读它们。 但是,正是这种问题的性质使我发现了最有趣的问题。 也许不足为奇,编程语言具有口头语言的某些特质。 文化围绕着它们发展,通常具有非常独特的方面。 我认为部分原因是由于Objective-C的动态功能,它具有独特的文化。 特别是对于已经使用了一段时间的用户。 由于Swift在哲学上与Objective-C不同,因此在文化上也有所不同。 这将使某些人感到震惊。 但是,我们知道即将到来。 多年以来,Objective-C的纯粹活力已荡然无存。 将此错误作为证据: 当然,出于充分的理由这是非法的。 编译器需要有关使ARC工作的方法签名的更多信息。 但是,在引入ARC之前的一段时间,这个特殊的结构成为了警告。 我的意思是无论是形象上还是字面上。 正是编译器试图帮助您防止出现明显的错误。 但是,这也是不鼓励使用最动态功能的一种方式。 这表明文化正在发生转变。 这绝对让我震惊。 宣布Swift时,我大为震惊。 即使我看到了它的到来,也知道这是必然的(http://arstechnica.com/apple/2010/06/copland-2010-revisited)。 我开玩笑花了几个月的时间来完全处理新闻和含义。 Objective-C既怪异又充满活力,一旦掌握了它,我就会觉得自己在使用非常不同的东西。 我喜欢那个。 如果您像我一样,就已经对该工具产生了情感上的依恋。 也许是非理性的。 但是不可否认。 对我而言,Swift感觉更像是C ++的衰落者,而不是Objective-C。 而且,鉴于情况,我认为这是完全合理的。 所有的LLVM和Clang都是用C ++编写的。 我怀疑苹果的编译器团队在设计Swift时显​​然考虑了Objective-C,但他们内心却是C ++。 所以我们到了。 我们不在Objective-C 3.0的那个替代维度上。 这不仅仅是目标/动作范式。 不仅仅是Swift需要动态性,或者它是不必要的。 有很多技术上的原因说明这种过渡会很好。 但是,您还必须承认过渡​​不仅是技术上的。 这是情感的。 这是关于放开您可能依附的东西。 如果感觉不太好也可以。 我希望我们认真思考为什么要进行类型战争。 为什么对使用动态类型的个人发表尖刻的评论。 我们很想对Objective-C说好话。 谢天谢地,对不对? 有更好的方法。 苹果建立了融合不兼容技术的迷人历史。 […]

可视化扩展布局

我注意到许多在线用户(即StackOverflow)在视图布局不正确时会跳到少数UIViewController属性,然后几乎随机地操作它们以获得所需的行为。 这总是导致对布局问题的“可接受”答案是“自动将AdjutstsScrollViewInsets设置为[true / false]”或“将edgesForExtendedLayout设置为UIRectEdgeZero”,其中一个人说“谢谢,已修复!”,另外五个人说“那没错”。修复它会有所帮助”。 即使在Apple的WWDC视频中,也没有关于这些API的工作原理以及它们相互之间有什么影响的超级清晰的解释,尽管WWDC 2013在发布时有广泛的概述。 我找不到关于其所有工作原理的出色文章,所以我想针对这些API的工作原理发布PSA,以便我们可以开始以正确的方式修复问题并停止永久保存不良信息。 我认为具有交互属性的示例应用程序绝对是了解UIKit来龙去脉的最佳方法。 如果你玩的够多的话,你就可以开始预测行为。 一旦您可以解释更改给定属性将对结果布局产生什么影响,便有了相当不错的掌握。 因此,为了说明这一切是如何工作的,我将包括一个示例应用程序的屏幕截图,然后为您提供一个停顿的地方,并思考改变给定属性的效果。 当然,您可以浏览一下,但是我想您会发现尝试提前计算出最终的布局会更有优势。 为此,我们将从iOS 10开始,它使我们可以忽略新引入的safeArea及其带来的其他API(和注意事项)的影响。 我们将在不久的将来覆盖这些内容。 这是所有具有实例化时视图/视图控制器具有的默认值以及在UINavigationController内部显示tableView时的默认外观的所有内容。 请注意,tableView的背景为绿色,但单元格背景为红色。 我们可以使用它来查看tableView的开始位置及其内容的开始位置; 当这两个不同时,我们正在查看一个非零contentInset,它显示在底部的单元格中。 这个contentInset来自哪里? 如果您检查代码,我们不会自己指定。 自动输入AdjustsScrollViewInsets 。 UIViewController属性autoAdjustsScrollViewInsets是iOS 7(对界面进行了大修的版本)中引入的,默认为true。 在iOS 7中,导航栏默认为半透明,并且为了展示半透明性,视图必须在导航栏下方开始(如果没有内容可看,您将无法欣赏半透明!)。 但是,如果视图从导航栏后面开始,则很明显,如果没有一些Apple Magic™来为开发人员处理事情,事情就会变得模糊。 这种魔术以automaticAdjustsScrollViewInsets的形式出现,它进入UIViewController的子视图并运行此测试: func magicView()-> UIView? { 保护self.isKind(of:UIScrollView.self)else { 返回self.subviews.first?.shouldApplyMagic() } 返回自我 } 并自动设置该滚动视图的contentInset以容纳navigationBar。 ContentInsets是非常基本的,我仅将这一部分包括在内,以快速提醒那些尚不清楚的人。 我发现,如果您将UIScrollViews视为内容的“窗口”,则更容易理解它们在做什么; 窗口框架本身不会改变大小,但是您可以四处走动以查看窗口框架后面的其他内容。 您所看到的不止是那里,所以一旦您触及内容的最上/最下部分,就无法再进行任何操作(忽略弹跳的UIKit给我们提供的内容)。 使用相同的隐喻,contentInset本质上将“空白”内容添加到您正在查看的内容上方,这意味着您可以看到比其他地方更多的内容。 如果我将topContentInset添加为100点,则意味着我可以滚动到内容的顶部,然后再在其上方滚动100点。 对于UITableView的基本情况,这只是空白,它将显示您的backgroundColor是什么,但是UIScrollViews可以让您做更多的事情。 我现在不会讲这个; 也许解释UIScrollViews是另一天的好主意。 既然我们对automaticAdjustsScrollViewInsets有了一个不错的了解,那么应用程序的初始状态就应该有意义。 我们的视图从UINavigationController的顶部开始(当然,它的视图)。 默认情况下,Apple会自动为我们提供AdjustsScrollViewInsets == true,因此,在布局视图时,它会看到导航栏的高度为64(进入状态栏区域),并在tableView上方为我们提供了64个空白内容。 […]

有趣的位掩码

有很多类型检查方法。 您可以将其定义为常量字符串以供日后检查,也可以使用enum进行便捷的方式(这种方式最多可以使用)…但是有一种类型检查的方法,即使用Bitmask 。 本文将引导您深入了解如何在Objective C中使用Bitmask 。 我们可以很容易地看到,Apple在SDK中使用了大量Bitmask ,例如: UIViewAutoresizing , UIInterfaceOrientation … 我们将创建自己的示例,让我们看看: typedef NS_OPTIONS (NSUInteger,PLandayEngineerTeam){ PLandayEngineerTeam_Mobile = 1 << 0, PLandayEngineerTeam_Backend = 1 << 1, PLandayEngineerTeam_Frontend = 1 << 2 }; 我们实际上使用了按位运算符,在这种情况下称为“ 移位” ,因为在此操作中,数字被移动或移位 。 在我们的示例中,数字向左移动。 欲了解更多信息,您可以查看一下有关位操作的信息:https://en.wikipedia.org/wiki/Bitwise_operation 因此,现在我们在Binary中提供示例: typedef NS_OPTIONS (NSUInteger,PLandayEngineerTeam){ PLandayEngineerTeam_Mobile = 1 << 0, // => 00000001 PLandayEngineerTeam_Backend = 1 << 1, […]

框架如何在macOS上工作

即使约束几乎是在macOS / iOS和tvOS上构建UI的默认设置,在某些情况下,框架仍是首选。 macOS上的帧操作与其对应的帧操作非常相似。 与CGRect一起使用时,您会看到对NSRect的引用,但实际上这只是CGRect的类型别名。 但是,存在一个根本区别,就是坐标系被翻转,或者更确切地说,它在iOS和tvOS上被翻转。 这意味着值为零的x坐标始于其超级视图的底部,而不是其顶部。 值得注意的是,这只会影响x坐标,y坐标的工作方式与您期望的一样。 如果您习惯于在iOS和tvOS上计算帧,那么反过来做所有事情都会是一个挑战。 幸运的是,Apple为我们引入了一个属性,以便在我们想要翻转坐标系时覆盖它,以便x坐标或零表示子视图的顶部。 让我们快速看一下一个非常简单的NSView示例中的外观。 从图像中可以看到,子视图位于左下角。 仅需一行代码,我们就可以反转容器视图以获得所需的行为。 如您所见,我们仅添加了isFlipped的覆盖并将其设置为返回true 。 让我们看看文档中关于isFlipped属性的说法。 此属性的默认值为false,这将导致坐标系不翻转。 在非翻转坐标系中,原点位于视图的左下角,并且正y值向上延伸。 在翻转的坐标系中,原点位于视图的左上角,y值向下延伸。 X值始终向右延伸。 如果希望视图使用翻转的坐标系,请覆盖此属性并返回true。 https://developer.apple.com/documentation/appkit/nsview/1483532-isflipped 因此,通过覆盖该属性,该视图坐标系内的所有内容都将被翻转。 请确保注意,将其他子视图添加到基础子视图将不会继承此子视图,并且如果您还希望翻转那些子视图,则必须重写相同的方法。 为了说明我的意思,让我们看一个最后的例子。 就是这样,在macOS上进行基于帧的计算时,不再麻烦。

我为什么要成为一名编码员?

那是1993年。我刚从高中毕业。 我当时正在上大学考试课程。 一位来我父亲的理发店的顾客使我在接下来的25年中从事职业。 直到那天,我只触摸了Commodore 64和Sinclair ZX Spectrum的键盘,这些键盘无法正常工作。 我一直想成为计算机科学工程师。 当我开始从事这项工作时,我仔细地看着德语老师,他有时用Turbo Pascal写作,有时用GWBasic写作。 我对DOS的了解来自那些日子。 我可以设法赢得大学入学考试。 但是我研究的部门距离计算机很远。 大学第二年,我看到了我对语言学的兴趣。 我认为,这是因为我对计算机和语言感兴趣。 在我职业的20年中,我尝试学习Objective-C。 过了一会儿,斯威夫特出现了! 我立即开始学习这种语言。 我找不到时间写Swift(仍然不能),因为我不愿担任图形设计师。 下班后,当我回家时,由于我的孩子,我也找不到时间。 几乎没有时间进行处理。 但这对我来说还不够。 我内心充满饥饿感,就像对情人的一种激情。 当我闭上眼睛,我看到一些飞行代码。 一年前,我的一个朋友建议我学习Ruby on Rails。 我非常喜欢这种语言,以至于我也有同样的感觉。 我一直在脑子里写作。 那太饿了 我申请了工作。 我愿意少花钱。 我只想写代码。 那是我的梦想。 但是他们通常没有任何答案。 我最终还是菜鸟,没有人愿意雇用菜鸟。 没有人知道在我内部进行编码的热情。 我买了二手MacBook Pro。 我正在编码。 我编辑了第一个WordPress主题并将其出售。 我有一个家庭及其生活,我必须赚钱。 当然还有账单。所以我需要我的工资,这是我从平面设计中获得的独特收入。 即使我不再喜欢它,我也必须去做。 退休时间更少了。 之后,我想拥有自己的工作或为想要与我一起工作的人担任编码员。 但是与此同时,如果我是失业者,该计划将更改为“现在!”! 感谢您的阅读。

服务器端Swift与Kitura和Bluemix –编码自我–中

服务器端Swift与Kitura和Bluemix IBM Bluemix是一个云平台即服务解决方案,它使您能够专注于编写应用程序,而Bluemix处理大多数DevOps-y东西,例如网络,服务器,存储和软件依赖项。 它支持多种编程语言,包括Swift。 它也易于使用-您只需管理Web浏览器即可管理服务。 您甚至可以在IBM Swift Sandbox的浏览器中编写Swift代码。 本教程将带您了解Kitura和Bluemix入门的基础知识。 首先,我们将设置Bluemix,以便在准备就绪时可以以最小的努力上载我们的应用程序并启动服务器。 然后,我们将逐步完成Swift Package Manager和Kitura。 一旦建立了一定的熟悉度,我们将构建一些有用的东西并将其上传到Bluemix。 我们将使用Swift Package Manager中的SwiftCron软件包构建一个小型服务,该服务采用cron表达式并返回该表达式的可读描述。 设置IBM Bluemix 首先,请前往IBM BlueMix并注册免费的30天试用版。 登录时,系统会要求您命名组织的名称,这实际上是可以添加其他人员到您的团队并选择其位置的团队。 只需选择最接近您的位置-这些选项就限于Bluemix当前已设置基础架构的位置。 然后,将要求您设置一个空间,这是Bluemix组织应用程序和服务的方式。 然后,您将导航到仪表盘,该仪表盘是空的。 单击创建应用程序,我们将使事情变得更加生动。 Bluemix是基于Cloud Foundry构建的,Cloud Foundry是一种开源平台即服务(PaaS)。 然后,Bluemix为一些流行的Web框架(例如Python的Flask框架)提供了样板,以帮助您立即开始。 不幸的是,Swift还没有样板产品,因此我们将向下滚动这些诱人的选项,移至Cloud Foundry Apps部分。 为Swift选择运行时 。 设置您的应用名称。 我选择了SwiftCronServer,并将主机名保留为相同的自动填充值。 只需几分钟,我们已经在启动服务器。 那不是那么容易吗? 返回仪表盘,您应该可以看到您的新应用。 点击它。 然后,向下滚动到“持续交付”部分,然后单击“启用”。 您可以使用命令行界面手动将代码部署到Bluemix,但是将其向上游推送到Github并自动构建它更容易,更可靠。 在“持续交付工具链”页面上,向下滚动到可配置的集成。 链接您的GitHub帐户,然后单击“创建”。 轻松享受SPM和Kitura 现在是时候在本地运行Kitura项目了。 为您的项目创建一个新文件夹。 mkdir SwiftCronServer cd SwiftCronServer 我们将要使用的Kitura和Cron库都可以通过Swift Package Manager作为软件包使用,因此,我们将使用带有swift […]

构建Swift API端点

我们通常在常量文件中维护服务常量,从而针对开发,登台和生产等环境更改端点。 不幸的是,当将构建推入存储或进行临时发行时,此过程容易出现人为错误。 为避免这种情况,我们可以根据环境构建baseURL,如下所示。 然后,您可以在扩展中添加与应用程序相关的功能,如下所示: 在行动中使用环境: 我们可以使用构建设置中的“调试”设置来维护相应的环境。 为此,我们将使用预处理程序宏#if DEBUG并将环境设置为“开发”。我们可以在#else下将环境更改为“暂存”或“生产”。 可以如下所示管理端点。 我们甚至可以将属于特定功能的多个端点归为一组。 例如,与用户相关的API可以分组在“ struct User”下,并且可以作为“ structName.method”进行访问。 用法: 我们可以看到路径如何在Xcode中直观地流动: 通过单击以下链接,可以查看样本ServiceConstants.swift文件: https://github.com/appitventures/IOS-Blog/blob/master/ServiceConstants.swift 有关如何从项目目标和方案维护环境的更多详细信息,请参阅此博客: 设置Xcode目标:如何使用不同的API环境创建多个iOS构建