Tag: App Development

在表视图中显示异构数据

移动应用程序的常见发展之一是使用表格显示信息 。 当您具有同类实体的集合时,可以轻松完成此任务,但是当此集合具有n个不同的实体时,它将变得更加棘手。 在本文中,我将展示一个示例,说明如何使用适配器模式在表视图中显示异构数据 。 公开的示例是具有两种消息类型的消息传递应用程序。 文字和图像。 当我们面临在表中显示异构数据集合的问题时,直接的解决方案是在“ cellForRowAtIndexPath”方法中使用模式匹配来确定我们需要使用哪个单元格来显示集合中的当前实体。 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let currentItem = itemsArray[indexPath.row] switch currentItem { case let item as TextMessage:< let cell = tableView.dequeueReusableCell(withIdentifier: “TextMessageCell”, for: indexPath) as! TextMessageCell< cell.configure(viewModel: item) return cell case let item as ImageMessage: let cell = tableView.dequeueReusableCell(withIdentifier: “ImageMessageCell”, for: […]

UITableView行选择-额外鲜味

很多时候,您都有一个UITableView并且想要选择一行。 最后,您将看到一行永久性突出显示的行,因此您尝试对其进行修复。 如果您想继续: 设置单个视图项目 将ViewController嵌入到UINavigationController 添加UITableView并在所有四个边缘上设置约束 使控制器成为tableView的dataSource和委托 将tableView的IBOutlet添加到您的控制器 添加具有居中图像的原型单元 将tableView的单元格高度设置为图像视图的高度 添加具有相同图像(或任何其他图像)的新UIViewController 设置从单元到新控制器的表演节目 添加一些代码以赋予tableView一些行。 完整的代码如下所示: 当您返回时,该单元格仍突出显示。 (注意:它本身并不会取消突出显示,这只是gif的时间。😔) 尝试在tableView(:didSelectRowAtIndexPath)修复此问题很诱人。 它可能看起来像这样: 您会注意到,返回tableView时,该单元格根本没有突出显示。 这似乎没什么大不了的,但它会改变您的应用程序的感觉。 UI详细信息就像鲜味,您无法用手指指着它,但是您知道它何时在那里。 在viewWillAppear(animated:)添加检查以查看是否选择了行。 如果是这样,请以与视图外观相同的动画速度取消选择它。 现在,整个ViewController应该如下所示: 顺畅得多。 像这样的小细节确实可以使您的应用脱颖而出。 😀如果您认为这有帮助,请通过。

CakePHPでApp Storeレシート取得

Boleh VELTRA! ナオユキです。 ちょっとエンジニアっぽいことをしたのでメモ程度に残しておきます。 iOSアプリにおいて,レシート(课金情报)をサーバーサイドで取得してみました。 公式のプログラミンミイドはこちら 初心者に教える必要があったので,省略せずに书きました 函数_checkReceipt($ receipt_data = null){ $ url =’ https://buy.itunes.apple.com/verifyReceipt’; $ options = JSON_HEX_TAG JSON_HEX_APOS JSON_HEX_AMP JSON_HEX_QUOT JSON_PRETTY_PRINT; $ send_data = array(); $ send_data [“ password”] = {App内课金共有シークレット※1}; $ send_data [“ receipt-data”] = $ receipt_data; $ content = json_encode($ send_data,$ options); $ opts [‘http’] = [ ‘method’=>’POST’, ‘header’=>’Content-type:application / json’, […]

使用pu.sh从命令行发送iOS推送通知

我一段时间以来一直在大多数应用程序中使用推送通知。 在iOS上,它们是远程通知功能的核心。 它们快速,安全并减少了开发人员为有效地向其应用程序和用户传播信息所需的工作量。 此外,这些天您可以在其中显示丰富而全面的内容。 我在这里写了一篇有关该文章的文章,您会发现它对您自己的应用程序开发很有用,您可能会喜欢阅读。 因此,尽管我对这项技术感到满意,但在某个领域中,我一直发现自己想要并且正在测试它们。 通过这种方式,我的意思是能够多次将它们发送到安装有我的应用程序的特定设备上,并且可以重复多次进行,以便我可以测试,调整和重写其文本和有效负载。 在iOS上测试推送通知 通常,您可能有自己的服务器设置,或者可能使用了许多现有的推送通知服务之一。 所有这些都需要大量时间和精力来启动和运行。 理想情况下,您可能想开始仅使用Mac,iOS设备和零现金(当然不包括为Mac和设备支付的钱)发送通知。 如果您在线上进行了一些研究,您可能会遇到NWPusher,它虽然效果很好,但仅适用于直接从钥匙串读取的证书和密钥的基于证书的身份验证。 它还作为您需要安装的Mac应用程序分发,因此它只能在该平台上运行。 您还需要每年自己生成这些证书,并且每次都是一个多步骤过程。 Shell脚本解决方案 我使用基于令牌的通知,而不是基于证书的通知,它更易于设置和管理。 另外,我没有创建一个用于发送通知的图形应用程序,而是编写了一个bash shell脚本来发送通知。 它称为pu.sh ,位于GitHub上,此处也有完整记录。 同时,您也可以在下面与我联系,以获取更全面的演练。 我还要指出的是,使用Shell脚本解决方案可以确保透明度。 您已经预先确切知道该脚本对您提供的信息有什么作用,即该脚本仅将有效负载发送到APNs服务器。 收集所有先决条件 以下两节是此处官方文档中信息的精简版本。 对于我们的解决方案,我们将使用基于令牌的推送通知,而不是基于证书的推送通知。 基于令牌的APN连接 基于令牌的身份验证比基于证书的通信速度更快,因为它不需要APN来查找与服务器相关的证书。 您可以将同一令牌用于多个提供商服务器,并且您所有公司的应用程序都可以使用一个令牌。 请记住,您必须每小时至少使用签名密钥更新一次令牌。 我们将尽快介绍如何更新您的令牌。 令牌还可以持续任意长的时间。 直到您将其吊销为止,否则每年都必须重新发行和重新分发证书。 获取加密密钥和密钥ID 您需要一个APNs身份验证令牌签名密钥来生成服务器使用的令牌,以便发送推送通知。 您可以从开发人员帐户developer.apple.com上的“ 密钥 ➙ 所有”部分中请求此密钥,如下所示。 继续下一步之后,您将获得: 密钥ID为的10个字符的字符串 。 随时准备使用它。 如果您忘记了它,它仍然可以在开发人员门户中使用。 .p8 文本文件的 签名密钥 。 将此放置在安全的地方。 例如,不要将其保存在源代码存储库中。 如果丢失,它将永远消失,您将不得不撤销它并重新生成它。 如果此密钥以任何方式受到破坏,则可以将其用于向应用程序发送推送通知-因此,如果您怀疑发生了这种情况,请将其撤消并请求一个新密钥。 您已经知道此过程比创建密钥,证书等要简单得多。 获取设备令牌 以下是您的应用程序应用程序委托的方法,带有一些简短的解释性注释,您需要获取设备令牌。 […]

探索视图层次

本文是关于UIView , UIViewController和UIWindow如何连接的。 我将说明如何遍历视图,视图控制器和响应者链的层次结构。 我们将通过推送,模式和嵌入演示来探索应用程序的结构外观。 并在Xcode中构建控制台版本的Debug View Hierarchy工具。 UI工具 Xcode中的Debug View Hierarchy捕获用户界面的快照,并允许浏览和检查视图对象。 有时控制台更方便。 我们可以使用私有方法对UI进行内部检查。 -[UIView recursiveDescription] -[UIViewController _printHierarchy] 您可以暂停应用程序执行,并在控制台中使用表达式来调用recursiveDescription和_printHierarchy 。 (lldb) expr -l objc -O — [[[[UIApplication sharedApplication] keyWindow] recursiveDescription] (lldb) expr -l objc -O — [[[[[UIApplication sharedApplication] keyWindow] rootViewController] _printHierarchy] -l objc -O –用于将上下文从Swift切换到Objective-C。 View Hierarchy 应用程序通常包含许多视图和一个以上的视图控制器,从而建立了两个层次结构: UIView层次结构是一棵树,它的根位于窗口中( UIWindow是UIView的子类)。 我们可以使用subviews和superview属性遍历此树。 UIViewController层次结构从窗口的rootViewController开始。 视图控制器可以提供其他视图控制器或作为其他视图控制器的容器,从而创建两个不同的层次结构。 呈现的视图控制器 当我们使用Present […]

基于iOS的应用开发的主要好处

iOS小工具以其出色的执行力,最实用的功能和亮点吸引了消费者而闻名。 商业有远见者将iOS应用程序开发视为激发业务的有利可图的资产。 正确的应用程序,正确的功能和在正确的时间交付可以实现成功。 在技​​术日趋繁荣的现代世界中,对于成长中的公司而言,拥有业务应用程序必不可少。 智能手机是用于个人和专业用途的使用率最高的设备。 运行智能手机的两个主要平台是iOS和Android 圣地亚哥的移动应用开发 。 两者都有其自身的好处,但是出于某些原因,为什么首先在iOS上启动业务应用程序会比Android受益。 首先, 1.出色的消费者体验 iOS用户是快乐的用户,因此使其成为业务应用程序的首选。 苹果凭借其理想的设备,出色的客户支持和无懈可击的编程,已经在买家小工具上树立了盛行的品牌。 无论如何,对于Apple客户而言,情况并非如此。 iOS开发人员确保每个最新的iOS应用程序都能在iPhone上顺利运行,从而提供令人难以置信的用户体验,这对于任何业务应用程序都是必不可少的。 谈论苹果的应用审查系统,苹果用户比安卓用户更愿意为应用付费。 此外,Android应用程序的平均成本为3.79美元,而iOS应用程序的平均成本为2.01美元,因此有很多付费客户。 将应用程序提交到App Store时的审查系统,以确定它们是否可靠且不包含任何令人反感的数据。 因此,Apple已为所有开发人员制定了指南,以使其能够提供最佳的用户体验。 2.苹果界面 组织进行应用程序以提供更好的客户服务。 应用程序越吸引人,组织与客户的联系就越好。 苹果用户始终赞扬其设备的规范环境。 除此之外,他们还喜欢iOS应用程序的简单有趣的界面。 这些亮点可以使组织的应用程序更具吸引力,以利用和增加销售。 3.吸引精通技术的受众 对于基于圣地亚哥的软件开发业务,必须吸引新客户以支持其销售。 对于精通技术的受众来说,iPhone无疑是吸引人的小工具。 借助iPhone应用程序,组织可以升级并增强其在细分市场中的目标。 为企业设计iOS应用程序是展示公司的创新方法,可以进一步提高品牌知名度。 4.顶尖国家/地区的更高的市场渗透率 发展业务并在偏远国家扎根是每个组织的最终梦想。 iPhone在美国和英国等国家非常有名,拥有iOS应用程序使该组织能够在这些国家扩展业务。 由于iPhone在这些国家/地区盛行,该组织提供了一个不错的机会来稳固其市场地位。 5.提供高安全性和安全的交易 在为企业构建应用程序时,组织需要选择一个充满活力的阶段,而最重要的是为其用户提供最高的安全性。 iPhone客户端可以免受外部危险。 iOS为病毒和恶意软件之类的外部威胁提供了坚实的防护,因此说服企业选择iOS取代Android应用。 尽管可以通过安全措施来升级在线部分的安全性,但iOS应用程序通过加密在线交易并消除了网络钓鱼,黑客攻击等威胁,使其对客户而言更加安全。 iOS和支持设备(如iPad和iPhone)使它们对于提高业务销售和生产力变得越来越重要,因此,为该业务应用程序投资该平台可能是明智的选择。 6.高投资回报率 Android应用程序产生的总支出不到总支出的10%,这对企业而言并非完全有利。 利用iOS应用程序可以使组织进入收入更高,投资回报率更高的可靠帐户。 可扩展的iOS应用程序能够满足值得投资的客户,并以增强的价值扩大业务范围。 到目前为止,我们已经看到了企业在2018年为企业选择iOS应用程序开发的最大优势。这肯定会使您倾向于使用iOS应用程序开发平台来制作其他业务应用程序。 安全性是iOS应用开发的最佳功能之一,这使其成为许多企业的首选。 现在,如果您打算外包您的移动应用程序开发项目,那么对于许多企业主来说,雇用一家可靠的移动应用程序开发公司可能是一项复杂的任务。 我们在这里为您提供帮助! 致电我们888–585–7988 ,了解BitCot如何成功开展您的业务。 标签 —圣地亚哥的应用程序开发人员,圣地亚哥的移动应用程序开发人员,圣地亚哥的应用程序开发,圣地亚哥的软件开发,圣地亚哥的Web设计, 资料来源:BitCot.com

具有圆角和阴影的视图

在过去的几年中,移动和网络应用程序的总体设计模式一直持平。 借助iOS 7和Material Design,谷歌和苹果公司(紧随Windows 8的足迹,让我们在这里成为现实)宣布了崭新的设计模式。 平面UI非常棒。 它删除了看起来确实有点过时2000的时髦3D UI元素。 但是,随着iOS 11的发布,苹果似乎正在从更加突出的纯平UI转移到阴影和其他与深度相关的效果上。 它仍然是非常平坦的外观,只是带有一些用于指示用户如何与UI交互的附加信息。 上图中需要注意的一点是,单元格既有圆角,又有阴影。 为了在CALayer上圆角化,您需要执行以下操作。 扩展名CALayer { func roundCorners(半径:CGFloat){ self.cornerRadius =半径 } } 这会将拐角半径应用于图层— 仅将拐角半径应用于背景颜色和边框。 这很重要,因为如果图层中有任何 contents则需要将masksToBounds设置为true ,以使拐角半径剪切内容。 为了给CALayer添加阴影,只需要多几行代码。 扩展名CALayer { func addShadow(){ self.shadowOffset = .zero self.shadowOpacity = 0.2 self.shadowRadius = 10 self.shadowColor = UIColor.black.cgColor self.masksToBounds =假 } } 在支持视图的图层具有内容之前,在视图上同时具有阴影和圆角不是问题(范围可以从图像到其他非平凡的视图元素)。 如上所述,如果存在图层的contents ,则需要将masksToBounds设置为true才能应用圆角。 剪辑内容和显示阴影是不能同时存在的两种状态。 这是有道理的。 如果要在视图上放置阴影,则在视图上不能使用遮罩将其裁剪到边界,因为阴影会显示在视图边界之外。 要剪辑带有圆角的内容,您需要执行相反的操作。 因此,添加阴影并圆化视图的角点并不像听起来那样琐碎。 […]

XCODE显示标签栏可帮助快速处理多个文件

我们许多iOS开发人员都不了解Xcode中的标签栏内容。 因为默认情况下,当我们启动Xcode iDE时不显示选项卡栏。 我最近也想通了。 虽然可以在一个窗口中单击顶部箭头来回移动,但是对我来说,选项卡是更快工作的最佳方法。 如果在Xcode中看不到标签栏,请单击查看->显示标签栏 它确实有助于更快地工作。 最近,我正在开发一个新项目,当我在类文件中编写某些功能时,在一个选项卡中打开了文件,在另一个选项卡中,我为其中一些功能编写了单元测试。 同样,通过单击键盘上的CTRL + TAB,您可以轻松地在选项卡之间来回切换。 资料来源:http://thinkdiff.net/ios/xcode-show-tab-bar-helps-to-work-on-multiple-file-quickly/

编码与对象映射器

我最近一直在尝试使用Swift的新Codable协议,以将从远程服务获取的JSON映射到Swift模型对象。 出于某种背景,在Swift 4中添加了Codable,作为一种干净地允许对象将自身转换为外部表示的方法。 可编码本身只是可解码和可编码的一种类型。 在这篇文章中,我将重点介绍Decodable部分,因为它是我感兴趣的远程JSON表示形式的转换。 比较方式 过去我曾经广泛使用过ObjectMapper,但由于Codable现在已内置到Swift中,所以我想对两者进行比较。 我要比较的功能是: 验证🕵️ 自定义转换(映射到自定义类型,例如将JSON字符串映射到正则表达式) 错误处理⚠️ 我要解析的数据是我们为BBC Sport应用远程获取的真实配置 这是一个相当简单的JSON结构,但是它有几个正则表达式,我想将其映射到NSRegularExpression ,而不是String 对象映射器 使用ObjectMapper映射此JSON模型所需的结构如下。 这些结构都符合ImmutableMappable 协议,这意味着他们需要一个构造函数,该构造函数接受Map对象,如果映射失败,则抛出错误。 验证方式 要执行验证,您可以使用Optionals。 在此示例中,我们确定该应用程序可以在没有这些电子邮件地址的情况下运行,因此这些电子邮件是可选的。 如果不存在键或无法将其map.values(“emails”)转换为正确的类型,则map.values(“emails”)会引发错误。 我们利用try? 捕获该错误,如果有错误,只需将其转换为nil值即可。 如果我们确定特定属性是必需的,那么我们就不会将其标记为可选属性,并允许错误传播。 总体而言,使用ImmutableMappable验证非常简单 您可能已经注意到,在此调用map.value(“regex”, using: RegexTransformer())了另外一个参数map.value(“regex”, using: RegexTransformer())这是用于将String转换为NSRegularExpression的自定义转换,这使我的NSRegularExpression ! 自定义转换 ObjectMapper开箱即用地支持自定义转换,这非常简单。 在这里,我们只是实现TransformType协议和关联的transformFromJSON方法。 那需要一个类型,然后我们将其强制转换为String ,然后安全地try? 将String转换为NSRegularExpression 。 然后可以在任何地方重用此变压器reuse 错误处理 为了测试错误处理,我将使用缺少output键的JSON文件。 通过ObjectMapper运行此命令时,我们会收到一条非常有用的错误消息。 映射时出错。 -原因:无法转换为“字符串” -位置:Config.init(map :):30 -键:输出 -currentValue:无 它告诉我们快速找到问题所在的一切。 我发现使用AlamofireObjectMapper集成时,错误被抑制了,这不理想。 可编码 开箱即用的等效Codable实现如下 尽管使用CodingKey协议将键定义为enums但它与ObjectMapper非常相似。 […]

使用iOS应用内购买

与设置和测试应用内购买相比,iOS开发中要做的事情更多。 该过程很费力,需要进行全面的测试,尤其是从业务角度来说,应用内购买至关重要。 iTunes Connect配置-第1部分 本教程基于自动续订订阅,但是您可以通过非常相似的方式配置其他任何应用内购买。 要设置应用内购买,请按照以下步骤操作: 登录到iTunes Connect。 打开我的应用程序,然后选择要配置的应用程序。 打开“ 功能”标题,然后在左侧窗格中选择“ 应用内购买 ”。 点击+图标,然后选择应用内购买类型。 您可以使用4种类型的应用程序内购买: 每种类型都有特定的用例,因此请确保您先阅读说明。 如果看不到自动续订,则说明您尚未接受更新的Apple Developer Program License Agreement或者尚未在iTunes Connect上填写协议,税收和银行信息。 5.假设您选择了“自动续订” ,请提供“ 参考名称”和“ 产品ID” 。 a)参考名称仅在iTunes Connect和“销售和趋势”报告中使用。 它不会在App Store中显示,因此可以是您喜欢的任何东西。 b)产品ID必须是唯一的,因此建议您使用带有订阅名称的应用反向域名,例如: com.reversed.domain.onemonth 。 6.选择“ 创建新的订阅组”,或者选择一个现有的组(如果有)。 所有自动续订的订阅必须是组的一部分。 用户一次只能订阅一个组中的一个订阅,但可以更改为同一组中的另一个订阅。 这允许用户升级或降级订阅,而无需为同一服务付费两次。 与参考名称相同的订阅组参考名称仅在iTunes Connect和“销售和趋势”报告中使用。 7.应该会出现自动更新的订阅详细信息页面。 选择订阅期限 (从1周到1年)和可选的免费试用期(从3天到1年)。 8.单击“ 设置起始价格”以选择默认货币和价格(必须从定价层中选择),其他国家的价格将自动计算。 9.现在,您可以为各个地区选择不同的价格。 保存更改后,您会发现价格保留为定价层: 10.添加至少一个本地化版本,包括“ 订阅显示名称”和“ 描述” ,最好是支持的所有语言。 这些值将对用户可见,因此请确保它们听起来值得信赖。 11.现在,您需要向订阅组添加至少一个本地化 。 […]