Tag: ios

快速浏览类型擦除

如果您正在编写Swift,那么您可能已经听说过类型擦除。 也许您甚至在使用它。 但是,即使您属于这两个阵营中的一个,也有可能实际上不知道为什么类型擦除有效。 ♂️ 与其给您提供有关如何擦除类型的方法,不如让我们实际研究问题所在并逐步解决。 问题 假设我们正在制作一个通用网络会话类,该类必须支持各种JSON反序列化器,这些反序列化器返回的对象与网络会话的关联类型匹配。 像这样: 这很烦人,但确实有道理。 我们的协议JsonDeserializer是抽象类型,因此Swift编译器无法推断其引用的具体类型,也不能假设其在编译时由其associatedtype提供的类型。 Hector Matos在他的博客KrakenDev : 简短的答案是:Swift希望是类型安全的。 再加上它是一种提前编译的语言,并且您有一种需要NEEDS能够在编译期间随时推断具体类型的语言。 我不能太强调。 在编译时,不是函数/类约束的每个类型都需要具体。 协议中的关联类型是抽象的。 这意味着它们不是具体的。 他们是假的。 没有人喜欢假货。 因此,尽管此错误令人不快,但确实有道理-并且该错误告诉我们一些重要的信息。 指出,该协议只能用作通用约束 ,即在尖括号之间。 尝试1 我们知道,将JsonDeserializer用作类型约束的唯一方法是在使用它,但是出于参数的考虑,我们决定使用协议约束来指定一种类型,就像我们对泛型类的处理方式一样。 结果如何? Cannot specialize non-generic type ‘JsonDeserializer’ ❌ 虽然这是预期的。 正如我们前面所讨论的,该协议是一种抽象类型,尽管它可能具有通用要求,但它本身并不是通用类型。 不是class SomeType { … }方式。 尝试2 好吧,让我们尝试使用JsonDeserializer作为一般约束,并将反序列化器放入一个代理对象,我们将其称为DeserializerBox (此处使用Box是为了与以后的类型擦除命名约定保持一致)。 这个错误告诉我们我们需要提供一种类型来满足DeserializerBox的通用类型要求。 不幸的是,这意味着要指定一个JsonDeserializer 。 但是,我们想使用任何为我们提供Payload类型对象的JsonDeserializer ,因此指定特定的反序列化器具体类型将无法达到目的。 这与仅将具体类型用作Session的deserializer属性的类型约束没有什么不同。 令人沮丧的是,这是进步。 尝试3和3.5ish 为了弥补我们缺乏必要的类型争论,我们还需要DeserializerBox成为JsonDeserializer的真正代理对象,这意味着它应与JsonDeserializer 。 这意味着我们应该能够将代理与JsonDeserializer一样对待,并且它应该公开相同的接口。 为此,我们必须坚持使用JsonDeserializer […]

UIKit:查看阴影

上次我们讨论了如何使视图的角变圆。 今天,按照承诺,我将向您展示如何使用layer.shadowX属性,以使视图看起来像Card,并获得其他炫酷效果。 让我们从简单而永不过时的Card View开始。 我知道你需要这个 myCard.layer.cornerRadius = 10 myCard.layer.shadowOpacity = 1 myCard.layer.shadowColor = UIColor(名称:“ Swift Orange”)!. cgColor myCard.layer.shadowRadius = 4 myCard.layer.shadowOffset = CGSize(宽度:4,高度:4) 该代码是不言自明的: 我按照上cornerRadius UIKit Rounded Views中的描述设置了cornerRadius属性。 我将阴影不透明度设置为从0到1的值,以将其应用于阴影颜色。 我设置阴影颜色。 我设置代表模糊半径的阴影半径。 如果您不愿意像我一样阅读,则只需要知道该值越高,图像就会越模糊。 如果您想学习,请单击此处。 最后,我设置偏移量,该偏移量是阴影相对于以点表示的图层的偏移量。 注意:要使阴影可见,请不要将layer的属性masksToBounds设置为true,否则它将被裁剪。 这还没有结束……还有一个阴影属性可供我们使用,以产生一些很酷的效果: shadowPath。 让我们看看如何制作一个像漂浮在设备屏幕上的视图。 让cardWidth = myCard.frame.width 让cardHeight = myCard.frame.height 让distanceFromCard = 15 myCard.layer.cornerRadius = cardWidth * 0.5 myCard.layer.shadowOpacity = 0.1 […]

乐观的后来者! 使用我的工作流程,准时! (针对居住在韩国的人)

标题可能有些古怪。 是。 我将在本文中向您介绍的App(实际上是工作流程)仅对居住在韩国的人有用。 但是,即将发布的帖子将解释细节,这对于也渴望进行类似工作流程的人员将非常有用。 如果您现在不在韩国,我将很高兴等待下一个将在2周内上传的帖子。 对不起伙计,迟到10分钟! 每天醒来时,我都会向自己保证。 “今天,我永远不会迟到任何约会。”但是,当我与朋友们玩得开心或我的工作快要结束时,我强烈希望能在适当的时机结束这项工作,我的早晨誓言逐渐消失远。 是。 我给朋友们发短信“对不起,费拉斯,我来晚了。”我已经活了26年了。 所以,让我给自己一个超时时间。 我不是醒得很晚。 我可以很容易地调整睡眠时间。 我也不是住在交通十分稀疏的农村。 我住在城市里。 “那么,我迟到的情况是什么?” 我为什么迟到? 我认为这是因为我是乐观的后来者之一 。 有时,我迟到了,因为我不知道到达那里所需的确切时间。 我对距离感没有信心,所以我只是猜测要花多长时间而不是寻找google map应用程序。 同样不幸的是,虽然我知道要花多少时间和时间,但有时约会迟到了。 这是因为我希望现在就在这里完成当前的工作。 尽管我知道我会迟到,但我推迟了离开的时间,相反,我为自己辩解说,乘坐出租车或其他东西会准时赴约,这是错误的。 解决方案 总而言之,该处方应满足以下三个条件。 首先,我应该知道到达约会所需的确切时间。 其次,即使在规定的最短时间之前,至少应该在15分钟之前,我都应该给自己报警。 需要额外的时间来搁置我的作品。 最后,我应该跟踪自己的迟到情况,以监控自己的表现。 只是一种反馈。 我花了一些时间执行上述三个规则。 我在iPhone上做了一个小的工作流程,以使用Workflow App遵循上述条件。 它不符合我上面提出的所有三个规则,但它保留了关键值,即条件1和2。 有什么价值? 这个微型应用程序不仅计算移动时间。 还要花时间。 每次公交10分钟。 每次地铁4分钟) 另外,这个应用程式还比我要求的最短时间提醒我15分钟。 最重要的价值是, 此工作流程自动集成了您的google map应用和apple calendar应用。 因此,如果您输入目的地和约会时间,此工作流程不仅会告诉您将花费多长时间,而且还会在日历应用程序上进行活动,并在适当的时间向日历应用程序发出警报。 因为我住在韩国,所以此工作流程应用程序仅针对Korea Environment进行了优化。 您如何使用它 [安装] (1)单击此链接(Workflow App)并在iPhone上下载Workflow App。 不幸的是,Android不提供此应用程序。 […]

您的热敏打印机工作正常吗?

蓝牙热敏打印机与Apple iPhone,iPad,iOS和Android设备完全兼容。 例如,BIXOLON SRP-350热敏POS打印机已成为市场上基于移动的销售点系统的最通用的打印机。 它可以以最佳的价格和可靠性水平在市场上轻松获得。 您可以通过蓝牙将其连接到iOS或Android设备,并且只需很少的电线即可轻松进行设置(如果需要,只需电源和现金抽屉电缆)。 适用于任何酒吧,餐厅或零售场所以及贸易展览的完美解决方案。 另一台打印机, Citizen CT-S651 热POS打印机系列也属于具有惊人打印速度的同一系列。 每分钟可打印60张收据(300毫米/秒)。 它还配备了方便的“即插即印”收据纸卷装入系统,占地面积小,并且具有可靠的断头台收据自动切纸器,可让您熟练掌握业务应用程序。 因此,如果您正在寻找上面提到的如何固定热敏打印机的技巧,而实际上很多时候并没有损坏打印机,而是错误地装入了热敏纸,或者使用了错误的纸张,那么我们希望您知道一些可以帮助您重回正轨的步骤– 1)您需要通过用硬币或指甲刮擦纸的表面来验证纸卷是否是热涂层纸。 如果是热敏纸,则在刮擦的地方会出现黑色标记,如果没有,则不会留下任何标记。 2)您需要检查热敏纸是否正确装入,然后再次尝试打印。 3)您应该检查以确保您具有正确的卷筒尺寸或卷芯尺寸,太少或太大都可能导致问题。 因此,在将纸卷放入打印机之前,请记住这一点。 我们希望您了解检查打印机工作情况的机制。 否则,如果您正在寻找热敏票据打印机,则可以在Wish A POS上找到价格合理且可靠的系列。 更多详细信息@ http://wishapos.blogspot.com/2018/07/is-your-thermal-printer-working-properly.html

集成PayFort-我们受了苦,所以您不必

您认为您的客户要求您集成由Amazon构建的在线支付网关时,您将会取得丰硕的成果。 这就是我的主要iOS开发人员(Tahir Pasha)在回应这张票时告诉我的:“因此,我将创建一个沙箱帐户,按照其文档中所述集成SDK,对其进行测试,然后切换到生产环境,就是这样” 从此链接获取文档, 此处的iOS SDK。 从您的沙盒帐户复制商家ID和访问代码, 在集成设置中,设置创建签名所需的REQUESTPHRASE 创建此链接上所示的签名, 您需要从SDK令牌URL获取SDK令牌,如文档第5.3节所示。 现在,通过该SDK令牌,您可以在移动应用中使用SDK来根据首选付款方式处理付款。 简单? 没有。 完成所有这些步骤并将您的应用提交审核后,您将遇到以下问题。 服务器端认证 将您的应用提交审核后,只有Payfort集成团队的人员才会通知您,您需要在服务器端而非移动应用上进行身份验证并获取SDK令牌。 因此,现在您需要在服务器端重做步骤5和6 。 从上面的步骤5:如服务器端此链接上所示创建签名,为此签名,您还将需要用户的设备ID 从上面的步骤6:从服务器公开一个API,该API接受来自移动设备的设备ID,如上所述创建签名,从Payfort请求SDK令牌,然后在响应中将该令牌提供给移动应用程序。 (ps,因为此代码与其余的后端体系结构无关,所以如果您为此独立于后端创建单独的微服务,则更好) 第7步将与上面相同,因为一旦在移动应用中安装了SDK TOKEN,您就可以执行与之前相同的其余任务。 直接交易反馈网址 您还需要配置直接交易反馈URL,Payfort将在其中处理交易后将响应参数发送给您。 Payfort说,如果用户由于互联网连接断开或他关闭了浏览器或者问题出在您身边作为连接商而导致用户重定向到您的return_url之前关闭了浏览器,Payfort会向您发送响应作为此URL上的POST表单。 这个想法很好,但是唯一的问题是Payfort希望您无需任何身份验证即可公开此POST api。 这会为您的数据库打开一些安全威胁。 因此,您需要创建另一个单独的微服务,它具有自己的私有数据存储,该数据存储仅处理这些响应(独立于您的主数据库),而没有其他处理。 即便如此,将这个api中接收到的信息与您的实际数据库合并也是另一个问题。 调试 调试PayFort提供的错误消息是另一个挑战。 例如: 错误代码001:他们的文档说这意味着“缺少参数”。 它没有指定缺少哪个参数。 进入生产 您会想象,当payfort将您的帐户从沙箱转移到生产环境时,他们也会为您移动所有设置。 但是不会,一旦您解决了上述所有问题,并且您的帐户已获准用于生产,则需要手动激活所需的付款方式。 然后,当您再次认为自己已经完成时,您可能还会面临最后一个问题 回购 是的,你没看错。 在一种情况下,如果在Payfort的末端处理付款时发生错误,或者用户决定在处理付款时取消付款,则Payfort API会给您一个回单而不是响应。 在所有其他api中为您提供消息的键称为“ response_message”,而在此特定api中,该键为“ resposne_message”。 我们花了几个小时才弄清楚这一点! 您还需要在您的应用程序中处理此拼写错误,否则它将崩溃 现在完成了 最后,我必须说,一旦设置好,Payfort是一项出色的服务,它的工作确实比我们上一个付款处理者做得更好。 与塔希尔·帕夏(Tahir Pasha)共同撰写 …………。 更新2019年1月10日 […]

SKStoreReviewController — Apple在ios 10.3及更高版本中的iOS应用中请求评论和评级的方式

每个应用程序开发人员的目的都是为了获取反馈或对其应用程序进行评论,以更好地展示其应用并鼓励其他人使用他们的应用程序。 通常,开发人员会向其应用程序提供自定义评论UIView以及UIStackview中的星图。 然后,将用户评分记录在后端中,但在进行应用商店评论时,用户通常会说“现在不选择”选项,因为该用户将从当前应用程序的屏幕中退出,进入Apple App Store页面。 我们是否因为这种行为而错过了用户的反馈? 苹果推出了“ SKStoreReviewController”,可在您的应用程序屏幕上显示评论UIView,并记录评论和评论。 无需任何用户导航到Apple应用商店即可提交他/她的评论。 凉。 是不是 三个简单步骤是: 导入StoreKit。 检查版本是否为10.3及更高版本。 if #available(iOS 10.3, *) { //call ios API method for review view. } else { //Use your custom review view. } 从视图控制器调用SKStoreReviewController.requestReview()。 if #available(iOS 10.3, *) { SKStoreReviewController.requestReview() } else { //Use your custom review view. } 多田! 系统将为您提供评论视图和星号,以对应用程序进行评级。 很好,但是在实现“ SKStoreReviewController”视图时,我们必须意识到某些要点。 […]

自定义导航栏

您知道您可以自定义导航栏吗? 我们开始做吧。 很简单 创建一个新项目。 转到情节提要。 单击ViewController。 转到“ 编辑器->嵌入->导航控制器 ”。 因此,创建了一个导航栏。 现在添加两个条形按钮。 将图像添加到您要显示在导航栏中的Assets.xcassets文件夹中。 现在开始编码。 转到ViewController.swift。 编写一个新的函数覆盖func viewDidAppear(animated:Bool)。 然后将此代码添加到函数中: 现在,让我们逐行浏览代码。 初始化导航栏。 定义导航栏的样式。 设置条形按钮的颜色。 初始化imageView,所以我们有一个显示图像的地方。 创建一个图像并将其设置为我们的imageView。 将imageView添加到我们的导航栏中。 做完了 运行项目 您的导航栏是自定义的。 超级容易。 参考文献: Главнаястраница

地理栅栏:如何使用Swift在现实世界中实现虚拟边界?

什么是地理围栏? 地理围栏是一种定义现实世界地理区域周围的虚拟边界的技术。 每次用户进入或退出某个地理围栏的边界时,都可以在支持位置的设备(通常是智能手机)中触发动作。 通常,用户将根据其位置实时接收包含某些信息的通知。 这项技术的主要优势在于,它将虚拟世界与真实世界融合在一起。 在横向视图中,我们在多个项目中利用了地理围栏,特别是在卫生行业。 地理围栏在移动开发中的应用 地理围栏可以有多种应用程序: 市场营销 :服装店附近时,服装店可以通过当天的优惠和折扣触发推送通知。 提醒 :此应用程序可以提醒足球俱乐部的球迷在周围时进入体育场的大门的地址。 到达和离开特定位置:航空公司可以发送通知,希望用户在飞机起飞后安全旅行,或者在飞机降落时发送欢迎消息。 儿童追踪 :应用程式可以传送通知,告知父母其子女已离开或进入特定区域。 安全性:进入或离开区域时,该应用可以启用或禁用功能。 但是,地理围栏并不是要随身携带推送通知轰炸用户。 重要的是要向用户提供相关信息,以便在正确的时刻考虑到用户的需求,从而做出更好的决策。地理围栏的目的是增加价值并为客户提供更好的体验。 相应地使用它,将为客户和企业创造双赢局面。 因此,了解这种技术的强大功能的重要性。 优点 通过提供实时报价,折扣和促销来吸引客户。 增强用户体验。 向用户发送位置特定的通知。 缺点 地理围栏需要用户的批准。 如果用户拒绝或禁用位置服务,则必须在应用设置中启用地理围栏,然后才能使用。 位置跟踪会消耗过多的电池电量,这是用户关闭设备中的位置服务的首要原因。 仅适用于大范围区域。 知名应用中的地理围栏 您是否曾经问过自己,当您在已经访问过并签到过的地方附近时,Foursquare会如何向您发送提醒? 或《 Pokemon-Go》如何在关键区域禁用狩猎小精灵? 答案是地理围栏:在现实世界中创建边界,同时通过移动设备跟踪您的位置。

基于Texture的聊天应用程序

Texture를이용한ChatKit만들었다。 정말기능만 。다른이브러리들도해봤었다。 mukyasa / MMTextureChat MMTextureChat –用于 Whatsapp 和iMessage的 AsyncDisplayKit (Texture)平滑滚动聊天模拟 github.com MessageKit /消息包 MessageKit –开发中:JSQMessagesViewController社区驱动的替代品 github.com nguyenhuy / AsyncMessagesViewController AsyncMessagesViewController –适用于iOS的平滑,响应和灵活的消息UI库。 github.com slackhq / SlackTextViewController SlackTextViewController –带有不断增长的文本输入视图和其他有用消息传递的嵌入式UIViewController子类…… github.com 생각한이있었는데,내가생각한聊天应用程序라이브러리에서가핵심적인능은 追加,追加용이해야한다。 前置스때유이유지되야하고사용자좋아야한이좋아야한다。 消息输入UI를이기가용이해야한다。 Diff算法Diff算法,网络,网络,网络和应用程序。 聊天应用程序능들과기부부가적으로능들기능들이많다。 GTChatKit产品和服务GTGhatKit产品。 용법을먼저먼저 class기子类 类ChatNodeController:GTChatNodeController {…} 请参见GTChatNodeController子类。 그냥리。이같初始化그냥이다。 让viewController = ChatNodeController() 그리고가능한로퍼티자면보자면보간단히 类ChatNodeController:GTChatNodeController { … func foo(){ let collectionView = […]

在Swift中以编程方式创建UIViews

使用PureLayout具有视图约束 期待什么? 了解iOS屏幕 查看层次结构 何时以编程方式构建视图 如何组织我们的代码(MVC模式) 构建自定义类(UIView) Twitter iOS应用示例 !Massive View控制器 设置约束(PureLayout) 了解iOS屏幕 任何iOS应用程序都有很多视图。 这些视图需要指定四个值才能显示: x,y,width,height 。 有三种不同的方式来构建这些视图: 情节提要 , Nib 文件和Programmatically 。 iOS sdk(UIKit)中有一个框架,其中包含一组标准子类,这些子类的范围从简单的按钮到许多其他视图对象之间的复杂表。 例如,UILabel对象绘制文本字符串,而UIImageView对象绘制图像。 视图可以嵌入其他视图并创建复杂的视觉层次结构。 这将在要嵌入的视图 (称为subview )和进行嵌入的父视图(称为superview )之间创建父子关系。 查看层次结构 视图的组织方式不仅影响应用程序的外观,还影响应用程序对更改和事件的响应方式。 例如,视图层次结构中的父子关系确定哪些对象可以处理特定的触摸事件。 同样,父子关系定义每个视图如何响应界面方向更改。 何时以编程方式构建视图 在满足以下条件时,使用自定义代码通常是一个很好的选择: 动态布局 具有效果,圆角,阴影等的视图 使用情节提要的任何情况都很复杂。 如何组织我们的代码(MVC模式) Model-View-Controller可能是最常用的设计模式。 从iOS开发开始,通常会遇到Massive View Controller问题 :View Controllers常常变得太大,包含难以真正修改或重构的所有功能。 通过遵循这种模式,我们确保项目中的每个类都是Controller,Model或View。 这样可以更轻松地以编程方式创建所有视图,而无需创建意大利面条怪兽。 显然,我们可以有其他组和类,但是应用程序的核心包含在这三个类别中。 入门 启动新项目时,Xcode使用情节提要板对其进行初始化。 为了创建我们的自定义视图,我们需要丢弃情节提要。 接下来,创建两个文件: ProfileView作为View类别下的UIView类,以及ProfileViewController作为Controller类别下的UIViewController类。 […]