Tag: swift

Swift 3迁移(╯°□°)╯︵

现在是时候迁移了,不仅Xcode 8和Swift 3已经发布,而且我的应用程序也无法通过iOS10正常工作! 迁移前 1.首先Git 分支,并标记您必须! 因此,您可以进行时间旅行,以防迁移造成麻烦! 您应该先从旧版本iOS <10开始,然后再从iOS 10开始 2.让Xcode完成它。 它可以帮助您很好地进行迁移,大约90%的覆盖率取决于您对Modular和DRY的满意程度 。 3.我是否说过让Xcode发挥作用? 您钟爱的布局会弄乱,但右键单击后放心,让Xcode修复布局,一切都会好起来的。 4.让da pod处理依赖项 可可豆荚也需要迁移! woo! 并且某些库将需要目标分支,看起来像… pod’SwiftTask’,:git =>’https://github.com/ReactKit/SwiftTask.git’,:branch =>’swift / 3.0′ 移民 5.杀死剩余的错误/警告 这不应该太多,本指南应该可以使您了解。 但这是最疯狂的一个! 因此,如果您找不到它的折断方式,请尝试仔细看一下您错过的打字字典。 让viewDict:[String:UIView] = … 6. iOS10默认情况下关闭“推送通知”。 这是陷阱时刻! 不要忘记打开它,否则您将注定失败! 对于旧的Xcode,它将在开发环境中看起来不错,但不会在生产环境中使用! application:didFailToRegisterForRemoteNotificationsWithError :,线程[{number = 1,name = main}]错误[Error Domain = NSCocoaErrorDomain代码= 3000“没有为应用程序找到有效的’aps-environment’授权字符串” UserInfo = {NSLocalizedDescription =无效的’aps-找到适用于应用程序的环境的权利字符串}] 您将找不到用于应用程序警报的有效“ aps-environment”权利字符串 。 […]

UIWebView

所以……API和URLSession非常棒,特别是要求提供您所需的信息等,但是,如果您将应用程序的页面或部分专门用于网站的一小部分,该怎么办? UIWebView只需将您想要的网站加载到Webview和TADA中,就可以将Web内容嵌入到您的应用程序中! 在那! 使用UIWebview的最简单方法是拥有一个空的视图控制器,然后将UIWebView嵌入到视图控制器中 现在将Webview放在视图控制器上,添加必要的约束,然后将其作为UIWebview的Outlet连接到与其关联的视图控制器类。 在此示例中,我将使用youtube的嵌入视频,因为对于该特定应用,我们需要每部电影的预告片,但我们不必加载整个youtube页面,而只需加载嵌入的视频。 使用youtube视频及其观点的妙处在于youtube已经为您提供了其视频的尺寸,因此我们不必计算其确切位置和视频大小。 我们首先需要此特定youtube视频的URL,因此请创建一个包含该URL的变量。 现在,在“ /”之后,URL中的字符对于每个视频都是唯一的。 在这个特定的应用程序中,我通过api调用获得了这个唯一字符,该字符串使我可以完成一个唯一字符字符串。 由于Web视图正在处理互联网,因此我在此处放置了一个主要队列。 Webview带有一个名为loadHTMLString的函数,它就是说,它加载您请求的Web内容,以及嵌入到视图控制器中的Web视图的框架,高度和重量。 现在应该加载您的Web视图,并为您提供所需的特定内容! 我强烈建议您使用UIWebviews,因为它不仅可以使您的应用看起来更加专业和智能,而且将不同的网站嵌入到您的Web视图(任何网站)中也很有趣,因此用户仍然可以进入该视图webview并像在该网站上一样使用它。

议程上有一个“摇钱树”

TLDR; 笔记应用程序议程将以Mac应用程序的新销售模式启动。 1月22日,我将为macOS启动一个新的应用程序:议程。 当我说“我”时,我的意思是“我们”,因为议程由Alexander Griekspoor和Marcello Luppi共同开发。 亚历山大(Alexander)是Apple设计奖获奖应用程序Papers背后的开发人员,而马塞洛(Marcello)是一位伟大的设计师,在过去的十年中我们一直致力于处理几乎所有事情。 毫无疑问,在发布之后,我将有更多关于议程本身的信息,但是现在,我想介绍我们已经确定的销售模式,因为它非常独特。 尽管在内部我们开玩笑地开始将其称为“摇钱树”,但我们并没有真正为该模型起名,因为这是我们成名和财富的入场券。 除了夸大其词外,更准确的描述可能类似于“不可续订的高级功能订阅”,但这很罗word,而“订阅”在我们的团队中是一个肮脏的词,因此我们坚持使用摇钱树 。 2017年Mac应用销售大危机 在过去的几年中,Mac开发人员一直在努力应对移动应用程序商店所带来的从底到高的思路。 客户不再希望为软件支付大笔费用,而传统方法(如出售主要版本升级)通常会遭到强烈反对。 当诸如Ulysses之类的出色应用迁移到订阅等更具可持续性的销售模式时,它们会获得1星评价。 这种情况变得非常严峻,使客户与开发人员竞争。 似乎没有一种适用于双方的模型。 付费升级会引起强烈抗议; 订阅引发强烈抗议; Mac App Store中缺少试用版意味着以可持续的价格销售是一个挑战。 “摇钱树”模型 在制定议程时,我们经过漫长而艰辛的思考,并决定尝试一些新的东西。 它不仅需要将应用程序简单地上传到Mac App Store上进行销售,还需要做更多的工作-在下面进行更多说明-但是我们认为结果对客户来说更公平,并会鼓励他们为应用程序付费,而不会引起任何通常的不满。 在我们的Beta测试计划以及在线论坛中,早期的反应是积极的。 那么,我们在这里实际上在谈论什么呢? 议程的销售模式介于免费增值和订阅之间。 该应用程序本身是免费的,没有时间限制,但是还有一些额外的高级功能需要应用程序内购买(IAP)才能解锁。 购买升级包后,所有当前功能将在用户的所有Mac(…和iOS设备,如果iOS应用可用)中永久解锁。 此外,购买后十二个月内添加到议程中的所有功能均已包括在内,并且也将永久解锁。 仅在十二个月的包装到期后,才需要出现需要购买新功能的高级功能。 用户可以选择购买新包装,解锁十二个月以上的新功能,也可以满足于已拥有的功能,直到添加了吸引他们再次购买的功能为止。 灵感来自素描 摇钱树的灵感来自流行的矢量图形应用程序Sketch所使用的销售模型。 (该模型实际上是Framer最初采用的,但是Sketch是使用它的最受关注的应用程序。)购买Sketch时,您将获得十二个月的更新。 因此,您可以在一年内获得新功能和错误修复,但是在此之后,您将再次依靠自己,直到再次购买。 您将不会获得任何新功能,甚至无法修复错误,但是您可以继续使用所下载应用程序的最新副本。 Sketch销售模型使开发团队避免了可怕的主要版本更新周期,该周期深受客户和开发人员的讨厌。 客户之所以讨厌它,是因为即使他们认为没有太多选择,他们也会被迫进行新的购买。 开发人员也不是很热衷,因为他们必须中断6个月或更长时间才能提出足够的新功能来证明版本增加。 而且由于许多客户认为更新只是抢钱,因此重大升级会导致大量负面反馈和1星级评论。 议程的销售模式受Framer和Sketch的启发,但有根本的不同-我们永远不会把客户甩在后面。 我们认为,始终能够为客户提供最新版本的议程非常重要,这样即使他们没有付款或功能已到期,他们也可以获得所有错误修复。 因此,摇钱树是关于解锁功能,而不是解锁更新。 订阅不是前进的方向吗? 苹果在应用程序商店中对订阅进行的更改非常清楚地表明,它意识到传统的销售应用程序的方式并不像以前那样有效。 订阅可以节省一天的时间吗? 您只需要看一下尤利西斯的命运就可以知道答案。 不,不是希腊英雄,而是广受尊敬的Mac应用程序,该应用程序于2017年转为订阅模式。尽管Ulysses是一款出色的应用程序,并赢得了Apple设计奖,但客户并不会羞于以“惩罚” 1-明星评论,将他们的出色评价推到比单独应用程序应有的水平低得多的水平。 人们显然不喜欢应用订阅。 订阅似乎过载 […]

iOS应用

iOS是世界上最复杂的移动平台,它宣布了众多应用程序,从而重新定义了移动设备的利用率。 仿佛您想跟上不断变化的趋势,并寻找iPad和iPhone应用程序开发的专业公司iOS Applications Developer一样 ,则无需进行垂钓之旅。 您可能已经发现全球最熟练和经验最丰富的iOS应用开发组织。 Rudra创新软件为您带来了一支由知识渊博的专业人员组成的团队,他们与世界领先的技术,广告和设计公司打交道。

玩键值观察(KVO)(Swift3)

什么是键值观察? 顾名思义,它是一种允许一个对象观察另一个对象的属性的机制。 什么是“可观察的”? 要观察到,它必须继承自NSObject ,并且必须具有动态属性。 动态表示可以在运行时动态分配属性。 我的可观察对象是否需要为类? 可以是结构还是枚举? 可观察的属性必须是类(Objective-C类型),因此无法动态观察Swifty类型(例如结构和枚举)。 Foundation框架中定义的每个类对象均符合NSKeyValueObserving协议。 观察者实际上在做什么? 当一个对象(即一个viewController)被添加为观察者时,它所观察的属性发生变化时,它会收到一个通知。 什么是实现键值观察器的示例? 因此,假设我有一个WKWebView对象,并且想要观察其属性之一, estimatedProgress 。 首先,我需要添加一个观察者,该观察者将收到有关EstimateProgress更改的通知。 在这里,我将ViewController设为观察者。 在上面的第21行,我在seaWebView上调用.addObserver方法,该方法是WKWebView的实例。 .addObserver方法具有四个参数:observer,forKeyPath,options和context。 观察者 =正在侦听的对象(又名我的ViewController,自我) forKeyPath =我正在观察的属性(又名EstimatedProgress )。 注意:这是字符串文字。 此KVO是Objective-C机制,因此键和键路径是字符串。 小心输入这个坏男孩! options =代表观察者收到的信息类型。 类型包括.new (属性的新值) 、. old (属性的旧值) 、. initial (甚至在添加.addObserver方法之前发送给观察者的立即值) 、. prior (发送通知)任何更改之前和之后)。 context =一条通知消息,其中包含在相应的更改通知中传递回观察者的任意数据。 我在上面设置为零。 其次 ,我需要实现observeValue()方法。 在第31行,我实现了watchValue方法,该方法接受四个参数,keyPath,object,change和context。 keyPath =您正在观察的属性(又名EstimatedProgress ) object =引用正在观察的对象 变化=观察到的变化存储在[NSKeyValueChangeKey:Any]?的词典中[NSKeyValueChangeKey:Any]? 因此,所有观察到的特性变化都保存在该词典中。 context […]

具有Java Spring框架的Apple Push Notification

我正在实现一个Java Spring Framework服务器,该服务器使用Swift将Apple Push Notification发送到iPhone。 这是您将需要的东西: 1.帐户设置 假设您已经拥有一个带有证书的Apple开发人员帐户,登录https://developer.apple.com/并转到“ 标识符 ”选项卡,然后单击“ + ”添加一个新帐户。 填写前缀和后缀,然后记得选中“ Push Notifications ”框 然后选择Edit ,然后滚动到Push Notifications部分 ,您将看到“ Configurable ”橙色指示器。 使用您的CSR文件创建并下载开发SSL证书。 双击运行并添加到您的钥匙链。 打开KeyChain Access ,找到证书并将其导出为.p2文件。 系统将提示您输入密码,最好不要将其留空。 否则,Java Spring应用程序可能无法解析空字符串。 保存此文件,该文件将在以后的步骤中使用。 2. Xcode设置 创建一个新的Xcode项目,例如Single View Application。 在“功能”选项卡中,使用您的Apple ID帐户登录启用“ 推送通知 ”。 在AppDelegate.swift中,添加一种创建设置实例的方法,该设置将在应用启动时通过提示获得用户的许可: func registerForPushNotifications(application:UIApplication){ 让notificationSettings = UIUserNotificationSettings( forTypes:[。Badge,.Sound,.Alert],类别:无) application.registerUserNotificationSettings(notificationSettings) } 启动完成后调用它: func应用程序(应用程序:UIApplication,didFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?)-> Bool { //应用程序启动后进行自定义的替代点。 […]

演示控件,自定义视图和更轻巧的UIViewControllers(第1部分)

现在我们有了MVVM,MVP,VIPER,VIP,但是其他部分呢? 复杂的UI逻辑应该放在哪里? 注意:这是系列文章中的第一篇,我将在其中讨论一些通过抽象UI呈现逻辑来使UIViewControllers变薄的方法。 接下来的帖子将在接下来的几天发布。 当我开始开发iOS应用程序时,我开始使用Apple的首选架构模式Model-View-Controller(MVC)。 我们都知道,MVC导致职责分离非常糟糕。 视图控制器充当视图和模型之间的中介者,并以处理许多杂乱的代码(从UI逻辑和导航逻辑到业务逻辑和API调用)为结尾。 如果您注意到了这一点并搜索了替代方法,则可能听说过MVVM,MVP,VIPER或VIP。 如果您还没有听说过这些,我强烈建议您尝试其中的一些方法(https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52#.6bew98dms)。 人们认为每种MVC替代方案都可以解决一个特定的问题,各有千秋,但是它们都有一个共同点: 它们将逻辑与表示分离开来 ,从而使UI完全可互换。 那太好了。 现在,UIViewController已被隔离,可以无问题地替换为另一种表示方式。 这真的很酷。 当我开始使用MVVM开发自己的应用程序时,我注意到UIViewController变得更薄了,因为它没有任何业务逻辑,但似乎缺少了一些东西。 表示逻辑仍在使视图控制器超出预期,因此我花了一些时间思考并发现了一些解决方案。 今天,我将解释其中的第一个:与视图控制器分离的UITableView协议。 孤立的表格视图 我想从视图控制器中获得的第一件事是UITableViewDataSource和UICollectionViewDataSource。 有些人已经讨论过如何在视图控制器之外获取数据源。 这个想法很简单。 当视图控制器中有UITableViewDelegate和UITableViewDataSource时,我们必须考虑索引,单元格高度,单元格标识符以及许多我们真正不关心的低层概念。 更好的方法是在方程中添加新的分量。 可以将其命名为“表视图”驱动程序,并管理表视图的显示详细信息。 计划 我们将引入一个新组件,该组件将成为UITableView的委托和数据源,并将抽象化视图控制器的细节。 表格视图驱动程序代码 这里有一些注意事项: 表格视图驱动程序存储对其显示的数据的引用。 它还存储对其管理的表视图的引用。 尽管视图控制器不必再担心索引和底层表示的细节,但它可能想了解高层逻辑,例如何时选择项目。 表格视图驱动程序是表格视图的委托和数据源。 最后,它公开了一个高级公共接口,以便视图控制器可以处理它。 简化的视图控制器代码 通过遵循这种方法,视图控制器将不仅更薄,而且更具声明性,并且可以在更高的抽象级别上工作。 让我们看一下简化的视图控制器代码: 有一些重要的注意事项: 我们可以从表视图底层表示逻辑中抽象视图控制器。 但是,视图控制器将继续了解表视图的存在。 这是一个问题,因为我们不能例如在不修改控制器的情况下用UICollectionView替换它。 视图控制器通过强烈引用它来拥有表视图驱动程序。 视图控制器负责实例化表视图驱动程序并将其自身分配为其委托。 视图控制器调用表视图驱动程序的高级方法。 视图控制器是表视图驱动程序的委托。 结论 我们知道,应该通过将视图控制器封装在诸如视图模型或演示者或交互器之类的组件中,将其与业务逻辑隔离开来,但是视图控制器将继续负责底层的表示逻辑。 在本文中,我讨论了一系列方法中的第一个,我们可以使用这些方法将视图控制器拆分为一堆组件,这些组件将只负责演示的一小部分。 第一种方法涉及使用一个对象,该对象处理表视图(或集合视图)表示逻辑,并向表视图公开简化的抽象层接口。 在以下文章中,我将讨论其他方法,例如表示控件和自定义视图(以编程方式以及使用xibs的方式)。 如果您以其他方式执行此操作,我将很高兴听到它。 请在下方留下你的意见! 谢谢!

类型擦除

下标不知道要打什么 前情提要 会想要打这篇是因为因为最近在看ReSwift跟Redux时发现ReSwift的源代码中有很多AnySubscriber,AnySubscription,SubscriptionBox之类奇怪的型态,而仔细看的话可以发现这些型态下面也有Subscriber,Subscription之类没有任何的型态。而造成的原因是什么呢?在解释前我们先来看一下例子吧! 会想要打这篇的另外一个原因是因为之前有看到跟Type Erasure有关的文章,但当时的我不太了解为什么要这样做,而最近看ReSwift时实在看太多type Erase了,于是决定把它搞懂。 先看个例子 只能这样了吗? 不,我才不要这样就放弃呢。 那我们只好把Pokemon这个形态给藏起来,不让swift编译器发现我们在干不法勾当。 如果我们不能使用Pokemon protocol当类型态,那我们能不能使用class将它包起来呢?可以!但应该怎么做呢?其实你在写swift时应有发现些东西叫做AnySequence,AnyIterator等等的东西,其实你仔细想想,Sequence是个协议,他不能当作型态使用,但有时我们在宣告阵列时他会是AnySequence型态。翻找一下swift源代码可以发现apple在实作这些wrapper的思路与实作方式,我们来看一下apple怎么写: ///一个类型擦除的序列。 /// ///`AnySequence`的实例将其操作转发到基础数据库 ///具有相同“元素”类型的序列,隐藏了 ///基础序列。 // @ _ versioned @_fixed_layout 公共结构AnySequence :序列{ ///创建一个新的序列,该序列将操作包装并转发到`base`。 @_inlineable public init (_ base:S) 哪里 S.Element ==元素{ self._box = _SequenceBox(_base:基本) … } 可以看到AnySequence是把Sequence的操作进一步的拉出来的wrapper而已。我们需要做的事是做个init,并且检查Sequence中的Element跟初始化时的S.Element是否为同一型态,然后把操作拉出来即可(apple使用另一层wrapper:box把比较杂乱的代码藏起来了,打开AnySequenceBox可以看到进一步的实作)。 那我们现在也来做一样的事吧: 抓到法律的突破后,我们就有了看似真的AnyPokemon型态了,于是我们很开心的把神奇宝贝农场改成: let pokemonRanch:[AnyPokemon] = [] 但别忘记AnyPokemon也算是某种程度的泛型型态,我们必须告诉他Power是什么: let pokemonRanch:[AnyPokemon ] = [] OK,这样写就没有error了。 但我们应该怎么把神奇宝贝放进去呢呢? let pokemon牧场:[AnyPokemon […]

Swift中的Optionals!

我第一次使用Optionals时,这对我来说很难理解。 作为一个新程序员,我不知道如何正确使用它或何时使用它。 但是,在进一步使用之后,我开始欣赏Swift团队在创建Optionals中所做的工作。 Optional是一个值包装器,您可以将其应用于任何类型(与在目标类中使用nil和指针Objective-C只能在类上使用的情况不同),在其中声明值的存在或不存在。 通过使用Optional声明您的类型,如果您的类型有可能不返回任何值,则仅返回nil。 如果我们没有在类型上使用Optional,并且返回值为nil,它将导致您的应用程序崩溃。 可选的只是一个枚举,带有2个案例的状态为.Some或.None。 我喜欢将“可选”视为一个神秘盒子,而您的返回值就是其中的礼物。 除非打开它,否则您将永远不知道会得到什么。 此框包含有价值的东西或什么都不包含。 声明可选 var fire:字符串? 为了简单地声明一个Optional,我们要做的就是在我们的类型后面放一个(?)。 解包可选 通过在我们的类型上声明Optional,返回值也将是可选的。 var fire:字符串? 火=🔥 打印(火) // Optional(“🔥”)/ n 为了利用Optional内部的值,我们可以采用几种方法来对其进行拆包。 可选装订 如果让realFire == fire { print(“ Fire值是\(realFire)”) } 其他{ 打印(“这里什么也没有”) } 在这里,我使用if-let语句来解开我的Optional。 我在这里要说明的是,如果有一个值,则打印“ realFire”的值。 “ realFire”只是fire中的值的占位符名称,您可以随意命名。 守卫让realFire =火 其他{不打印“} print(“ Fire值是\(realFire)”) 在这里,我使用了一个让卫的语句来解开我的Optional。 两者之间的区别在于,我们首先声明else语句。 guard-let语句的优点是与函数结合使用,如果没有值,我们可以轻松地中止该函数。 我们的价值也存在于代码块之外。 与if-let语句不同,我们的值仅存在于代码块内部。 if-let语句的主要问题是厄运金字塔。 厄运金字塔是当我们要访问多个Optionals内部的值时。 为了获得该值,我们将必须使用多个if-let语句进入所需的层。 使用Guard-let语句将使您免于键入那么多行代码,并使代码更具可读性。 强制展开 […]

使您的Swift编程再上一个台阶

从表面上看,Swift是一种平易近人,易于使用的语言,每个人都可以开始理解。 在作为开发人员的那一天,您可能会遇到不满意代码的情况。 也许您正在阅读别人的代码,却不知道发生了什么。 也许您听到有人在谈论地图,并且想知道它是否可以改善您的生活(可以)。 您已经准备好接受一些更高级的主题。 从这里开始… 先进的斯威夫特 函数式编程,惰性变量,模式匹配和面向协议的编程—这些只是构成Swift专业开发人员工具包的一部分,并有助于更快地交付出色的代码。 然后再次! 理查德·福克斯(Richard Fox)是Proppeller Labs的好主意,并于2016年7月在Forward Swift上进行了17分钟的演讲。 在我的谈话的第一部分中,通过推断来投射数字类型。 然后,我将向您展示struct序列化示例,该示例演示通过映射函数推断类型。 我的最后一个示例将带您通过推断准系统实现将在发出网络请求的上下文中创建的associatedtype。 泛型和推论 Yeeeeeees。 您开始在《黑客帝国》中看到类似Neo的东西。 (第一个。其他不是。)模式。 他们一直在那里。 您可能已经用其他语言看过它们,并且可以开始在Swift中感知它们。 这是通过Swift镜头获得的有关常见模式的一些信息。 再次! 尼克·奥尼尔(Nick O’Neill)是我一段时间以来见过的最好的演讲者之一。 他将Objective-C中iOS编程的历史与Swift社区产生的新想法联系在一起。 本演讲将涵盖一些您可能会在Objective-C和其他语言中看到的常见模式,以及通过原生Swift的镜头使用清晰简洁的代码来开发等效模式。 发现本机Swift模式 您现在已经开悟了。 您周围的一切……1和0。 你没有纠缠,一无所有。 在远处的某个地方,您会听到函子这个词,并且您意识到自己的旅程才刚刚开始。 更多主题供您参考: Max Firtman-适用于设计师的iOS布局 Paul Hudson —面向协议的编程 Paul Hudson-iOS 10速成班 如果您正在寻找更多的初学者内容,请务必查看上一篇文章。