Tag: 保留部分权利

场景

今天,我想谈谈“场景”,我的名字是一个简单的结构,用于将View / ViewController / ViewModel集合的相关位收集在一起。 让我们通过看一个例子来开始,然后我们将逐步进行介绍。 struct MenuScene:场景 { typealias依赖关系= HasAppBroker和HasStore typealias控制器= MenuViewController typealias视图= MenuView typealias交互器= MenuInteractor 让config = PresentationConfig.menu 让控制器:控制器= MenuViewController() 让视图:视图 init(有依赖关系:依赖关系) { self.view = self.controller.menuView Interactor.configureBindings(场景:自我, 依赖关系:依赖关系) } } 它符合具有一些关联类型的Scene协议-Controller , View和Interactor ,并且如您在init的最后一部分所看到的那样, interactor具有某些依赖性。 插入器只是具有单个暴露的静态函数configureBindings的结构的名称。 依赖关系是通过一系列协议创建的,每个协议一个。 在这种情况下,为HasAppBroker和HasStore 。 协议HasAppBroker { var appBroker:AppBroker {获取} } 协议HasStore { var store:存储{get} } 我们将它们组合在一起以创建Dependencies类型。 然后,只要我们发布到场景init中的所有内容都符合那些协议,就可以满足相关性。 视图设置为我们要处理的主视图; […]

ReactiveKit的扩展集合

傻瓜发信号 扩展布尔 { func trueSignal(或失败:NSError)-> Signal { 保护自己else {返回Signal.failed(fail)} 返回Signal.just(true) } } 将布尔转换为故障 信号 。 2.可选信号 扩展名可选 { func valueSignal(或失败:NSError)-> Signal { 切换自我{ case .some(let value):返回Signal.just(值) 案例.none:返回Signal.failed(失败) } } 将Optional转换为故障 信号 。 3.尝试/捕获信号 func TrySignal (有趣:@escaping()throws-> T)-> Signal { 返回信号{ 做{ 让res =尝试fun() Observer.completed(with:res) }将let错误捕获为NSError { 观察者失败(错误) } 返回NonDisposable.instance } } 将try / catch转换为信号 4.不 […]

Coisas简单:Abrindo url dentro do app iOS c / Swift

不存在的事实,存在的主体,“简单的”和“犯罪行为”。 Mesmo com toda afrustaçãoedecepçãoqueurge com qualquer coisa que seja que tenha virado o mais puro caos,eu aprendi aproveitar and canalizar essamotivaçãopara algo e eis que vem o post de hoje。 Vamosentãopegar是一个法式面包,也可以像巧克力或巧克力那样用碗装。 简单的平面图: Carregar um网站usando HTTP,无HTTP O app deve funcionar em 8.3+ 问题: WKWebView可以替代UIWebView,可以在8.0 MAS上通过接口构建器自定义视图,或者通过11.0版的常规更新来替代视图。 错误:类不可用:iOS 11.0之前的WKWebView(以前版本中的NSCoding支持被破坏) 2.在iOS 9.0上使用HTTP的一部分,请使用NSAppTransportSecurity com禁止任何致命负载。 Mãosnocódigo Crie um projeto qualquer,pode […]

使用Swift和Django Rest Framework将图像或文件上传到Django

最近几个月,我一直在开发开源Swift应用程序。 我需要使用rest框架将图像以及发布数据上传到Django。 虽然,有一些使用AF网络的Objective-C解决方案,但是我找不到一个很好的Swift解决方案。 使用Alamofire和Django rest框架非常简单。 我将解释以下步骤。 出于解释目的。 我将创建一个Django Model和序列化器类。 餐厅模型 REST API的餐厅序列化器 我们将在urls.py中添加rest api端点,并在views.py中添加逻辑。 在您应用的urls.py中添加以下内容。 url(r’^ api / v1 / list / new / $’,views.RestaurantList.as_view()) 我们都站在Django一方。 现在,是时候编写一些快速代码了。 首先,创建一个Podfile并添加pod’Alamofire’,’〜> 4.3.0’。 安装Pod之后,让我们创建一个多部分表单上传请求。 我不会编写用于从照片库中选择图像的其他代码。 您可以参考主存储库。 为此,您应该将Alamofire的上载api与多种格式的数据一起使用,因为我们要上载图像以及发布数据参数。 Django rest框架将负责其余的工作! 始终在其他参数之前为图像/文件添加multipartFormData 如有任何疑问,请随时在评论部分提问! 对于本博客,我假设:Swift 3.0,Xcode 8,Python 3.5,Django 1.10,Django Rest framework 4.0和Alamofire 4.0版本

其他一些ReactiveKit扩展

在上一篇文章(ReactiveKit的扩展集合)之后,还有更多… 对信号的承诺 导入ReactiveKit 导入PromiseKit 扩展承诺 { 公共函数toSignal()-> Signal { 返回Signal { self.then {elem-> Void in Observer.completed(with:elem) } .catch {错误 rator.failed(错误为NSError) } 返回NonDisposable.instance } } } 在我正在从事的项目中,有一段时间,我们同时使用PromiseKit和ReactiveKit,此扩展对于将PromiseKit Promise转换为ReactiveKit信号非常有用,从而提供了帮助迁移的桥梁。 2.顺序信号 func serialSignals (_信号:[Signal ], 已完成:[ReactiveKit.Result ] = []) -> SafeSignal <[ReactiveKit.Result ]> { 守卫信号=信号。第一 否则{返回Signal.just(已完成)} 让newSignals = signal.count> 0吗? Array(signals [1 …]):[] 返回信号 .map {ReactiveKit.Result.success($ 0)} .flatMapError […]

踢您的手动迭代习惯

当约翰·巴科斯(John Backus)于1977年在他的ACM图灵奖演讲中问“编程是否可以从冯·诺伊曼风格中解放出来?”时,他肯定比40年后仍为for(i = 0; i < n; i++)写作的人寄予更高的希望。 冯·诺依曼(Von Neumann)编程语言使用变量来模仿计算机的存储单元。 控制语句详细说明其跳转和测试指令; 和赋值语句模仿其获取,存储和算术。 赋值语句是编程语言的von Neumann瓶颈,使我们可以一次单词的方式思考,就像计算机的瓶颈一样。 到2017年,主要的编程语言已经吸收了函数式编程中最实用的思想。 我在这里说服您,使用高阶函数来处理数据集合通常可以使您的意图比手动迭代更清晰。 从描述如何执行计算作为循环增加计数器的副作用,或者通过从键集中索引到字典开始,我们早就应该进行下一步了。 这种命令式风格要求代码的人工阅读者在脑海中模拟计算机的执行。 那是一件坏事! 取而代之的是在抽象阶梯上上移一个梯级,并根据功能组成描述您的计算工作:过滤,转换和减少输入流。 在我遇到的大多数情况下,数据存储在数组或列表中的事实是出于方便。 存储在其中的数据没有真正排序。 数组通常只是最易于键入的集合,因为所有语言都内置了语法糖。 最好将集合一般认为是容纳某些元素的容器。 在处理它们时,请开始考虑符合给定条件的元素集-这就是过滤器应用程序。 是否需要为每个元素计算一些派生值? 这种转换称为映射。 需要整个集合中的一些总价值吗? 那就是缩小或折叠。 学习这些概念,并使用它们更清楚地表达您的意图。 当您将计算作为增加索引的副作用时,了解它需要您逐步执行所有命令。 当您通过功能组合来表达自己的意图时,隐藏错误的空间就更少了。

开始Swift编程第3部分-运算符,可选和Nil值

在上一篇文章中,我们介绍了值类型,引用类型并以集合类型结束。 Swift编程入门第2部分—值类型,引用类型,指针和集合类型 之前,我们讨论过变量,常量和类型。 medium.com 今天,我们仍将继续介绍基础知识,但是好消息是在今天之后,您将能够编写一个解决您的数学问题的程序,无论是幼儿园的数学课程,还是使用公式进行的高级财务计算。 初步资料 您应该了解操作顺序(PEMDAS)的概念 如果数学课对您来说太早了,请按以下步骤操作: 括号(从内到外) 从左到右的指数 从左到右的乘法 从左到右划分 从左到右加法 从左到右的减法 而已! 经营者 只要达到三年级,您就已经在编程中看到了大多数操作员。 让我们看看您已经知道的那些。 加,减,乘和除的一种简便方法是将运算符追加到赋值运算符(您仍然可以使用加法运算符使用此方法来连接字符串)。 可选值和零值 好的,我将尝试使其变得容易,但可能会伤到您的大脑。 很好,这意味着您将学习。 当我谈到变量实例化和声明时,我希望您回想一下本系列的第一部分。 我有点掩饰了声明,而是给了您一些实例化新变量的例子。 我很抱歉,这只是为了让您免于一切,直到您准备好为止。 我们可以像这样声明变量

适用于iOS的OWASP:M1-平台使用不正确,第1部分

此故事描述了iOS开发人员如何应对OWASP Mobile Top 10 2016中的M1类别漏洞。该类别涵盖了平台功能的滥用或平台安全控件的使用失败。 在第1部分中,我们将介绍Apple提供的加密工具以及iOS的其他一些与隐私相关的功能。 文件数据保护 Secure Enclave — A7和更高版本处理器中的协处理器,使用加密的内存和硬件随机数生成器为数据保护密钥管理和Touch ID提供加密操作。 UID —唯一标识符,融合到处理器和Secure Enclave中的AES 256位密钥,对于每个设备都是唯一的。 允许将数据绑定到设备。 文件系统上的所有文件均受数据保护技术保护(可用于文件和数据库API,包括NSFileManager,CoreData,NSData和SQLite): 每次在数据分区上创建文件时,Data Protection都会创建一个新的256位密钥(“每个文件”密钥),并将其提供给硬件AES引擎以对该文件进行加密。 每个文件密钥都用几个Data Protection类密钥之一包装(在Secure Enclave中),并与数据保护类的表示法一起存储在文件的元数据中。 所有文件的元数据都使用文件系统密钥加密,该文件系统密钥是在首次安装iOS或用户擦除设备后创建的。 删除此密钥,用户可以使所有文件不可解密。 数据保护类密钥受UID保护,对于某些类,还受用户密码保护 文件密钥永远不会暴露给处理器。 它们仅在跨系统运行时才用AES引擎和Secure Enclave已知的临时密钥包装。 应在项目设置(包括在权利中)中启用“文件数据保护”,但是默认情况下,对于所有应用程序,所有数据都会被加密,直到首次解锁。 钥匙串数据保护 iOS钥匙串 -存储在文件系统上的SQLite数据库,用于处理密码和其他简短但敏感的数据位。 securityd守护程序根据其“ keychain-access-groups”,“ application-identifier”和“ application-group”权利来确定每个应用程序可以访问哪些钥匙串项目。 从iOS9开始,钥匙串密码数据一直保存在Secure Enclave中(在iPhone 5S和更高版本上)。 钥匙串中有五组项目:通用密码,Internet密码,身份,证书和密钥。 除其他字段外,每个钥匙串项目均包含: 钥匙串组访问(kSecAttrAccessGroup) –允许开发人员的应用访问设备上共享的钥匙串项目; 应用程序必须共享可以在权利中设置的相同捆绑包种子ID。 数据保护等级 (kSecAttrAccessible)   —下一节将详细介绍。 iCloud钥匙串(kSecAttrSynchronizable)-允许用户在iOS设备和Mac计算机之间安全地同步其钥匙串项目,而无需将该信息暴露给Apple。 默认情况下,第三方应用添加的钥匙串项目不会同步。 该值应与兼容的数据保护类一起使用(一个不带… ThisDeviceOnly后缀)。 管理元数据,例如创建和上次更新的时间戳,版本号,使用保护类密钥包装的每个项目密钥, SHA-1散列的属性(例如帐户和服务器名称)用于查询项目而不解密每个项目 […]

我用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, […]

戴夫·托马斯(Dave Thomas)的数据修补Kata的快速解决方案,第1部分

戴夫·托马斯(Dave Thomas)的数据修补Kata的快速解决方案,第1部分 我正在Swift中解决Dave Thomas的代码问题,并将分享我的思考过程和解决方案。 以下是我对“数据整理” kata [项目回购]的第1部分的解决方案。 挑战在于分析一个混乱的,真实世界的数据集。 在weather.dat中,您将找到2002年6月在新泽西州莫里斯敦的每日天气数据。下载此文本文件,然后编写程序以输出温度分布最小(最大温度为第二列)的天数(第1列)。 ,最小的第三列)。 为了摆脱不需要的列,removeUnneededColumns()在每行上循环并仅保留前三个单元格。 该方法可以正常工作,但是很丑陋,需要改进(有什么建议吗?)。 注意,并非我们的所有数据点都是“干净的”,有些包含垃圾信息,例如“ *”。 为了在cleanData()中解决此问题,我们创建了一组无效字符并将其删除。 让invalidCharachters = NSCharacterSet(charactersInString:“ 0123456789。”)。invertedSet 要注意的另一件事(我在此kata之前就很模糊)是,当您在Swift中嵌套了高阶函数时,就无法使用简写语法(例如array.map {$ 0 * 2}),您需要列出参数并使用“ in”关键字 气象记录评估员 现在,我们已经加载了数据,对其进行了整理,对其进行了清理,并将其转换为WeatherRecords数组,我们需要找到温度变化最小的日期。 由于WeatherRecord结构具有计算的属性temperatureDelta: var temperatureDelta:Double { 返回maximumDailyTemperature — minimumDailyTemperature } 我们需要做的就是遍历记录并找到增量最小的记录。 minElement()方法将执行此操作(请注意,由于我们不使用嵌套闭包,因此我们将返回使用更简洁的$ 0,$ 1语法)。 执行者 现在,我们拥有解决此kata所需的所有组件,我们只需要将它们放在一起并获得正确的答案。 我们将使用一个Executor结构来执行此操作,该结构使用先前方法的输出来调用每个方法并返回答案。 execute()的单元测试还充当集成测试,用于验证一切是否按预期进行。 我将在本系列的其他kata后面编写我的解决方案和思考过程。 请让我知道什么有用,什么没用。 另外,我很想听听您关于如何改进代码任何部分的想法。