Tag: swift

通过混淆敏感字符串来提高iOS应用的安全性[Swift]

在开发新的iOS应用程序时,开发人员通常只专注于UI / UX并急于将其发布到AppStore。 但是,他们忘记了一项非常重要的事情,即安全性 。 可能有些人甚至认为IPA文件本身已受到很好的保护,没有人可以对其造成任何伤害。 好吧,如果您这么认为,那将是非常错误的,您应该继续阅读…… 攻击者只需要越狱的iPhone ,即可将其连接到调试模式,然后就可以拦截所有敏感字符串。 敏感字符串为: REST API凭证 OAuth凭证 密码 不希望公众知道的URL(即私有后端API端点) 钥匙与秘密 您是否真的想公开这样的信息那么容易? 解决方案 混淆器 –该库对硬编码的安全敏感字符串进行混淆,并将其转换为字节数组。 换句话说,您不必解码硬编码的字符串通过应用程序,而是必须解码字节数组才能显示该字符串。 如此简单,并且使攻击者无法获取您的敏感信息。 只需单击本段开头的超链接,将文件添加到项目中,就可以开始了。 用法 导入混淆器 定义盐键: 令o =混淆器(withSalt:[AppDelegate.self,NSObject.self,NSString.self]) Salt键可以是您喜欢的任何格式,但是请记住,它将用作字符串编码和解码的唯一值。 最佳实践是像示例中那样使用本机类的组合。 2.生成字节数组 让字节= o.bytesByObfuscatingString(字符串:“ 555555556ABC”) 打印(字节)/ * [110,97,80,70,65,122,87,83,67,50,33,34] * / 在这里,您将获得提供的字符串的字节数组,并且应该将该值存储在保留常量的类中。 完成所有字符串后,只需注释bytesByObfuscatingString,因为您将不再需要它(至少在添加一些新的敏感字符串之前不需要)。 我建议将所有字符串都保留在一个结构中,并将原始值也注释在字节数组上方,以用于定向。 结构常数{ / *原始12311456ABC * / 静态让GOOGLE_API_KEY:[UInt8] = [106、102、86、66、69、123、87、80、52、49、32] / *原始555555556ABC * / 静态让FACEBOOK_API_KEY:[UInt8] […]

突出显示Xcode中的警告

在Swift Development中,我们通常使用TODO注释作为将来的重构的占位符-Xcode将在其文件结构下拉列表中方便地显示对应的部分,如下所示: 但是,Xcode无法提醒我们类似这种情况的警告或错误消息。 以前,编译器可以突出显示Objective-C环境中的#warning或#error注释,以便开发人员注意。 Xcode是否有办法在Swift中获得与Objective-C类似的效果? 答案是肯定的。 我们可以在构建阶段中添加一个简单的运行脚本 ,如下所示: TAGS =“ TODO:| FIXME:| WARNING:” ERRORTAG =“错误:” 找到“ $ {SRCROOT}” \(-name“ * .h” -or -name“ * .m” -or -name“ * .swift” \)-print0 | xargs -0 egrep –with-filename –line-number –only-matching“($ TAGS)。* \ $ |($ ERRORTAG)。* \ $” | perl -p -e“ s /($ TAGS)/警告:\ $ 1 /” | […]

我的第一个🥇iOS应用:照片📸滤镜应用(iOS应用)

我是一位JavaScript开发人员,希望在Xcode iOS应用程序开发中投入我的精力。 我一夜之间就构建了这个应用程序,🦉您也可以! 为了获得更多乐趣,我创建了一个Youtube视频 。 要点:要构建iOS应用,我们需要Mac Book和Xcode。 选择哪个项目时,请使用Single View App。 Ctrl +拖动很神奇 目标:构建照片滤镜应用App 步骤1)安装xcode 我在Google上搜索了以下视频:如何在Mac OS X上安装Xcode。在安装Xcode的过程中,我意识到我已经拥有Xcode。 对我表示敬意! 🙂 开始使用苹果公司的First Swift App Video在Xcode IDE上进行Swift编码。 通过观看某人向我展示循序渐进视频的视频,我可以最轻松地学习。 创建一个新的Xcode项目 单视图应用程序(Xcode的内置模板) 产品名称:滤光片 组织标识符(捆绑ID *): com.google(使用您自己的ID) 注意:有关如何创建自己的ID的指南。 如果您拥有(或希望拥有)网站名称google.com,则将您的捆绑包ID:com.google(此格式称为反向DNS格式),就像把购物车放在马的前面一样,将com放在Google的前面) 有关捆绑包ID的更多信息,请访问:https://help.apple.com/xcode/mac/current/#/deve21d0239c 语言:斯威夫特 点击下一步。 保存您的项目。 我把我的保存在文档文件夹下。 现在,我们进入了设置视图。 查看左侧面板。 左侧列出了组成PhotoFilters应用程序的文件 通过拖放将照片添加到PhotoFilters文件夹中。 注意:请使用彩色照片,因为我们将通过添加随机滤镜来更改照片的色调。 谢谢希瑟 的提示。 我最初有一张黑白照片,但效果不佳。 接下来,设计应用程序:转到Main.storyboard 故事板是我们可以直观地编辑Web界面的地方。 用户故事1 :PhotoFilter应用程序应具有查看功能以显示照片。 在iOS中,“图像视图”是在屏幕上绘制图像的对象(obj)。 转到对象(obj)库并搜索“图像视图” 将“图像视图” obj拖动到视图控制器中并居中。 注意蓝色虚线。 […]

为UITableView创建粘性标头

*本教程使用Swift 2.3 我是Rep的产品和工程负责人,Rep是一个有影响力的市场,品牌和有影响力的人可以在市场营销活动中进行协作。 我决定分享如何在应用程序中构建此功能。 (对于这里的任何产品猎人,请随时追捕我们:)!) 一段时间以来,我一直在寻找一种简单的解决方案,并且严格避免出现可疑的骇客程序。 在使用XCode几个小时之后,我想出了一个很棒的方法来解决这个问题。 我将为文章提要构建UI。 外观如下: 现在,进入一些代码。 让我们添加标题,背景图像视图,文章图标和背景Alpha层。 我以编程方式使用自动布局对所有视图进行布局,但是可以根据需要随意创建视图。 我们首先需要添加所需的初始化程序和属性: 类CategoryHeaderView:UIView { var imageView:UIImageView! var colorView:UIView! var bgColor = UIColor(红色:235/255,绿色:96/255,蓝色:91/255,alpha:1) var titleLabel = UILabel() var articleIcon:UIImageView! init(frame:CGRect,title:String){ self.titleLabel.text = title.uppercaseString super.init(frame:框架) } 需要初始化吗?(编码器aDecoder:NSCoder){ fatalError(“ init(coder :)尚未实现”) } } 接下来,使用autolayout以编程方式对所有视图进行布局,并在init()末尾调用此setUpView()函数。 我们开始从后到前布置视图。 顺序为imageView,colorView,titleLabel,articleIcon。 func setUpView(){ self.backgroundColor = UIColor.whiteColor() imageView = UIImageView() imageView.translatesAutoresizingMaskIntoConstraints = false […]

iOS Touch ID身份验证教程

苹果在iPhone 5s中引入了TouchID,用户无需输入密码就可以使用指纹来解锁iPhone中任何功能的设备。 在OS 7中,Apple并未向开发者发布FingerPrint API,但在OS 8中,Apple向我们提供了在您的iOS App中使用此功能的API。 在本教程中,我将解释如何在iOS应用程序中使用此功能。 本地认证框架 要添加TouchID功能,您必须在项目中添加LocalAuthentication Framework。 转到项目设置>常规,然后向下滚动到链接的框架和库部分。 单击+号并添加LocalAuthentication.framework 。 2.认证视图 对于TouchID,我们将创建一个登录按钮,并在按钮的onClick上提供TouchID身份验证屏幕,以供用户解锁功能。 @IBAction func clickLoginButton(_ sender:Any){self.authenticateUSerTouchID()} 3. TouchID验证的成功与失败 func authenticateUserTouchID(){让上下文:LAContext = LAContext()//声明一个NSError变量。letmyLocalizedReasonString =“访问您的Home ViewController需要验证。” var authError:NSError? ){context.evaluatePolicy(.deviceOwnerAuthentication,localizedReason:myLocalizedReasonString){成功,评估错误,如果成功// //如果触摸ID身份验证成功,请导航到下一个视图控制器 { DispatchQueue.main.async {print(“系统验证成功”)let storyBoard:UIStoryboard = UIStoryboard(名称:“ Main”,bundle:nil)让homeVC = storyBoard.instantiateViewController(withIdentifier:“ HomeViewController”)为! //其他如果触摸ID身份验证失败,则打印错误MSG, {HomeViewControllerself.navigationController?.pushViewController(homeVC,animation:true)}} else // 如果让错误=错误{让消息= self.showErrorMessageForLAErrorCode(错误。代码)打印(消息) } }}}} 4.在Touch ID身份验证失败时打印错误消息 func showErrorMessageForLAErrorCode(errorCode:Int)->字符串{ var […]

Swift 4的可编码协议

在WWDC 2017上,Apple引入了一种特殊的新方法来处理应用程序开发中的重复任务:JSON处理。 到目前为止,依靠第三方库(即SwiftyJSON,JSONShootout)来完成工作是非常普遍的,但是,随着Apple新的Codable协议的引入,许多情况本来可以很好地处理。 新的Codable协议实际上是另外两个协议的Encodable Decodable : Encodable & Decodable 。 这意味着,如果您认为合理的话,您也可以决定将两者分开实施。 让我们从一个示例开始: 假设您正在从咖啡店下载菜单。 您的Coffee模型看起来像这样。 通过简单地实现上述协议,您已经免费获得了一些好东西。 通过实例化JSONEncoder您可以轻松地将咖啡对象转换为Data. 由此,如果您从中初始化一个String ,您已经可以看到模型的JSON表示形式。 你有它。 现在,对于解码器,我们将使用编码器上的outputFormatting属性,以演示Swift 4的另一个不错的小功能,称为多行字符串文字。 通过将编码器的outputFormatting定义为.prettyPrinted我们可以在控制台上很好地呈现JSON,这对于处理更复杂的对象特别有用。 现在,要从JSON数据实例化Coffee,我们将复制打印对象并粘贴到新的字符串变量中,如下所示: 请注意,通过使用此新的“多行字符串”功能,我们能够以这样的方式表示字符串,并带有换行符,而不必转义双引号。 您只需要小心正确地排列顶部和底部的三重引号,一切就可以正常工作。 从那里开始反向过程,将字符串转换为输入数据,然后使用JSONDecoder解析代码并从中构建新的Coffee实例。 太酷了吧?

服务器端Swift-配置文件

在前两篇文章中,我描述了如何向服务器端Swift HTTP服务器添加MVC模式(带有单元测试)。 在本文中,我将展示如何向应用程序添加对配置文件的支持。 配置框架 在ASP.NET Core MVC应用程序中,Microsoft添加了对读取配置文件(以及环境变量,命令参数等)的支持,语法和想法看起来很酷。 下面是可用于读取Microsoft框架中的配置的代码示例。 我想在我的Swift应用程序中实现类似的构造。 决定哪些参数最重要(基于执行方法的顺序)非常重要。 我想订购: file -> system environment -> command parameters 。 首先,我认为我必须自己创建这些类,但是后来我发现IBM创建了一个非常好的库。 IBM-Swift /配置 配置–用于Swift应用程序的分层配置管理器 github.com 这确实是一个很好的框架,可以满足我的所有要求。 它与Microsoft解决方案非常相似。 读取配置 要从我想支持的所有地方读取配置,我们必须将以下代码添加到我们的main.swift文件中。 将BasePath.pwd指定为relativeFrom参数很重要。 它是当前工作目录( PWD )的相对路径。 我的整个main.swift文件现在看起来像这样: 使用IBM的框架读取配置后,我将配置设置转录为自己的对象-该对象仅将我在应用程序中使用的配置存储为属性。 因此,我将在应用程序中使用真实的类属性,而不是字符串键。 我将拥有智能感知和更轻松的重构。 为此,我创建了ConfigurationManager类的简单扩展。 仅根据管理器的属性创建Configuratio对象。 我的Configuration对象真的很简单。 它存储了我可以在整个应用程序中使用的所有配置属性。 我的configuration.json对应于上述类,如下所示: 我们必须将该文件放在Package.swift文件附近。 当我们在Xcode中工作时,这一点很重要,因为此文件夹是当前工作文件夹,并且ConfigurationManager会正确找到此文件。 重建可执行文件后,我们的配置文件必须放在该文件附近。 依赖注入 现在,我已将所有配置存储在专门为此目的创建的对象中。 现在,我希望有一种方法可以在需要访问配置设置的所有地方使用该配置。 当然,最好的解决方案是依赖注入。 我将在我的依赖项容器中注册我的配置对象,并且我可以在任何需要的地方解析配置。 可以按照以下代码进行注册。 我正在将配置注册为单例。 现在我们可以例如通过注入构造函数来解析配置: 因此,在我的TaskRepository我注入了配置对象,并且可以使用该对象中的所有属性。 现在,我已经实现了可用于存储对数据库的访问信息的机制。 在下一篇文章中,我将使用该信息来准备连接以及从实际数据库(使用某些ORM框架)读取/写入对象。 […]

NSKeyValueObserving

Доброговременисуток,Дорогиедрузья! (нет) С. Key-Value Observing (KVO) 。 Key-Value Observing этоважнаяконцепция,которойоченьнемногиеразработчикипользуются。 APIэтойконцепциидостаточнопрост。 Онпозволяетуведомлятьобъектыприизменениисостояниядругогообъекта。 Этозвучиточеньполезно! Key-Value Observing реализуетсяпосредствомпротоколаNSKeyValueObserving。 ,тотпротокол,какуказановдокументации🍏,являетсянеофициальным。 КлассNSObjectужереализуетпротоколNSKeyValueObservingилюбойкласс,которыйнаследуетсяотNSObject такжереализуетэтотпротокол。 UIKitнереализоо Foundation (Военинреализуютэтотпротокол)和Воеклассы。 Ноэтоможноисправить😬。 c Key-Value Observing на примере。 Xcodeисоздадим Single View Application注释。 Послесоздадимдвафайла(класса),которыебудутнаследоватьсяотNSObject: Имплементируем Configuration : О键值Key-Value Observing проста。 Когдаобъектдобавляетсявкачественаблюдателядляопределенноооне Несмотрянато,чтоAPIпротоколаNSKeyValueObserving Swift 3 невелик,оннемногоулучшился。 Смыслвтом, updatedAt 。 在ViewController ,请在ViewController添加一个уведомленобизменении。 Key-Value Observing ViewController Key-Value Observing 。 […]

Swift’te嵌套函数Kullanımı

Swift’teaşağıdakigibifonksiyonlarımızvar。 func birSeyYap(){ } func baskaBirSeyDahaYap(){ } Bu iki fonksiyonuiçeyazdığımızdabuna嵌套函数diyoruz。 Nasılmı? func birSeyYap(){ func baskaBirSeyDahaYap(){ } } 常见问题解答Birincisiningövdesiolmuşdurumda。 Başkabirörneğebakalım。 func isimAl(_ isim:String){ func selamSoyle(){ 打印(“ Selam \(isim)!”) } } isimAl(“ Ali”) Yukarıdakikodbloğunuçalıştırdığımdabeklediğimsonucualamıyorum。 Çünkü,ikinci fonksiyonutanımladımamaçağırmadım。 func isimAl(_ isim:String){ func selamSoyle(){ 打印(“ Selam \(isim)!”) } selamSoyle() } isimAl(“ Ali”) Peki bu selamSoyle fonksiyonunubaşkabir yerde kullanabilir miyim diyedüşünüyorumamaaklıma范围geliyor。 […]

Swift编程基础概述

Swift是一种用于IOS,macOS,watchO和tvO的新编程语言。 它也可以用于后端和前端开发,也可以用作脚本语言。 与其他任何编程语言一样,swift也使用变量通过标识名称来存储和引用值。 除普通类型外,Swift还引入了新类型,例如元组,枚举,结构,可选(无值)等。 Swift是一种类型安全的语言 ,它有助于弄清我们编写和工作的类型。 类型安全性有助于我们在开发过程中尽早发现并修复错误。 常量和变量 : 常量和变量将名称与特定类型值相关联。 如果未在声明中分配值,则需要为其指定类型,以便将来使用该属性。 常量的值一经设置就无法更改,因为将来可以将变量设置为新值(不同)。 “ let”用于定义常量属性,“ var”用于变量属性。 我们可以在一行中声明多个常量或变量,以逗号分隔。 2.类型注释: 在swift中,存在类型推断,因此当我们声明具有值的属性时,swift会将该值的类型分配给该属性。 因此,指定类型是可选的,但有时需要告诉编译器我们将用于该属性的特定类型。 要提供类型注释,我们需要在冒号“:”之后指定类型,后跟空格,然后是属性名称。 3.命名常量和变量: 常量和变量名称几乎可以包含任何字符,包括Unicode字符。 一旦声明了某种类型的常量或变量,就不能再用相同的名称声明它,或将其类型更改为另一种类型。 我们也不能将常量更改为变量或将变量更改为常量。 4.打印,评论,分号, 我们可以迅速使用全局函数“ print(_:seperator:terminator :)”将一个或多个值打印到适当的输出。 我们可以在SDK的调试控制台上看到打印输出。 分隔符和终止符参数具有默认值,因此我们可以在调用函数时将其省略。 我们使用注释在代码文件中包含不可执行的代码,作为对自己或团队成员的注释或提醒。 编译器将忽略所有注释。 单行注释以两个正斜杠(//)开头。 多行注释以正斜杠后跟星号(/ *)开头,以星号后接正斜杠(* /)开头 我们还可以为大型代码块编写嵌套的多行注释。 我们不需要在swift语句的末尾放置分号(’;’)。 如果需要,可以在语句末尾使用分号。 但是,如果我们想在一行上编写多个单独的语句,则需要分号。 5. Swift中的一些类型 整数 Int,UInt,UInt8,UInt16,UInt32 浮点数 双人,浮动 弦乐 6.类型安全性和类型推断: Swift是一种类型安全的语言。 类型安全的语言鼓励您清楚代码可以使用的值的类型。 编译器类型在编译代码时进行检查,并将所有不匹配的类型标记为错误。 如果我们没有指定所需的值类型,则Swift会使用类型推断来得出适当的类型。 通过类型推断,编译器只需检查您提供的值,即可在编译我们的代码时自动推断出特定表达式的类型。 当我们不指定任何类型时,Swift类型推断将提供顶级类型。 例如,即使您提供浮点类型,它也倾向于使用Double。 […]