在我的安全系列#1中,移动安全。 我已经介绍了移动安全性的基本知识。 现在,让我们弄脏双手。 让我简要介绍一下如何在iOS钥匙串系统中创建和存储加密密钥。 开始使用 加密密钥应存放在安全的地方。 密钥存储不当会导致数据泄露。 在iOS中,有两个框架可确保加密密钥的安全性。 本地认证框架 安全框架 在本文中,我将介绍两者并解释它们如何通过结合使用这两个框架来保护加密密钥。 本地认证框架 本地身份验证框架用于管理生物识别,例如TouchID和FaceID。 本地身份验证框架不允许应用访问系统内部的生物特征数据。 它就像在应用程序和硬件支持的安全区域之间进行通信的代理一样。 本地身份验证框架使应用程序需要用户存在才能访问敏感信息,例如加密密钥。 LAContext是本地身份验证框架中的类,用于桥接应用程序和保护安全区域。 LAContext()。evaluatePolicy( LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason:“原因”){(成功,错误)在 //处理返回 } 但是,以上方法不足以保护敏感数据。 它只是提示您评估用户的指纹或面部。 为了保护敏感数据,我们应该通过安全框架将敏感数据存储到钥匙串中。 安全框架 安全框架提供了一些方法来生成加密密钥,将系统密钥链中的密钥存储和检索为Keychain Item 。 要生成密钥对,我们可以调用以下方法: // 1.创建密钥访问控制 守护让accessControl = SecAccessControlCreateWithFlags( kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, [.privateKeyUsage,.biometryCurrentSet], 零) 其他{ fatalError(“无法设置访问控制”) } // 2.创建关键属性 let属性:[String:任何] = [ kSecClass作为字符串:kSecClassKey, kSecAttrKeyType作为字符串:kSecAttrKeyTypeRSA kSecAttrKeySizeInBits作为字符串:2048, kSecPrivateKeyAttrs作为字符串:[ kSecAttrIsPermanent as String:true, kSecAttrApplicationTag作为字符串:“ […]
在旧版本的Xcode中,只需简单地将SSL证书拖放到模拟器中并按照提示进行操作,直到安装完成,即可完成SSL证书的安装。 除了将SSL证书拖放到模拟器之外,您还需要执行另一步。 常规->关于->证书信任设置->为特定证书“启用对根证书的完全信任”
但是您应该访问RadioPublic for iOS中的新主页。 你不能再回家了。 好吧,如果Thomas Wolfe为iOS使用RadioPublic的1.4版,那么世界将有一个不同的书名可供阅读。 “再次回家。”没错。 再次尝试在RadioPublic中回家。 它更有用。 强调 另外,还有一个新的重点部分,重点介绍了我们认为您应该了解的不同片段,播客和播放列表。 这是发现您可能不熟悉的新播客的一种好方法。 您关注的节目中闻所未闻的剧集 快速捷径可查看您所观看的节目中的最新剧集,并一键点击即可进入完整列表。 显示您收听最多和最受欢迎的播放列表 有时,您只是想快速找到喜欢的节目。 现在,您可以在首页上看到您最多听的节目。 在您聆听时,本节将更新,并为您提供一种快速点按的方式来获取您的收藏夹。 我们还一直在策划和收集一些很棒的人的播客播放列表。 如何以大胆的方式查看和探索人们认为您应该听到的其他播客和剧集。 库快捷方式 此外,您现在还将看到您的节目的快捷捷径-这些是您关注的播客和播放列表。 现在,我们还在首页上提供了指向您公开播放列表的链接。 这使您可以访问已添加到公共播放列表中的所有剧集。 我们还将您的听力历史记录提升到了主屏幕,因此您可以快速访问所有最近听到的情节。 我们如何处理此更新? 请通过help@radiopublic.com与我联系。
GCD或运营 每当我问这两种排队任务方法之间的区别时,我都会得到类似的响应: 随便使用GCD 使用GCD进行简单的单个异步调用 但在以下情况下使用“ 操作” 你想取消他们 您想要一次执行更多任务 当您要在依赖关系中执行它们时 当您想优先执行时 这些建议听起来像GCD会缺少Operations的某些核心功能,但有人反复说Operations或多或少是围绕GCD的包装。 好吧,后者当然是正确的,而且运营似乎没有什么特别之处,您对GCD所做的事情实际上并不多,实际上,很多事情都以一种更轻松的方式,更易读,尽管个人偏见可能会起到一定的作用。与我们生活中的一切息息相关。 我可以在某种程度上说,Operations不能完全实现通过封装进行简单分配的任务,因为至少就我个人而言,仅使用GDC似乎更容易实现太多事情。 误解 但是,我认为应该对操作存在一些真正的误解: 1.取消应用程序并不会发生。 开发人员必须实现取消并在属性上设置KVC才能实现这一点, OperationQueue只是侦听它。 取消的实现方式与您在GCD中执行的方式相同。 这里没有魔术! 例如,如果需要取消异步URLSession ,则必须使用KVC更改状态以通知OperationQueue ,但是您仍然必须自己实现取消URLSession 。 实际上,您在这里还需要进行其他操作。 2.也可以使用 DispatchGroup 轻松地原子地执行任务组 ,这并不是OperationQueues能够单独执行的,实际上,使用GCD 可以使任务组更短,更容易且更精简。 3.再次依赖,当使用OperationQueue时,不要只是开箱即用。 需要预先将操作链接为从属链接,并完成isFinish的所有开销,并且需要实现其余样板,以便该机制起作用。 我会说,在GCD的串行队列上使用Dispatch更具可读性,更容易理解,特别是在存在更多后续任务的情况下。 但是,如果要同步的任务本身本质上是异步的,则GCD变得更加易于使用。 如果只有一个附加的依赖关系,那么我们可以嵌套第二个任务。 如果还有更多,那么使用DispatchGroups是一件很容易的事情…… 当依赖关系可能在单个任务和任务组之间时,还有很多要显示的东西,这就是GCD在操作性方面比操作性更出色的地方。 不过,这并不是经常发生的用例,因此,这并不是一个巨大的优势。 缺点 但是,恕我直言,使用Operations存在一些实际缺点,我不想重复样板代码的开销,我相信这是大多数人在比较这些方法时唯一提到的事情。 这里还有更多重要的事情要提到: Operations是NSOperations ,正在为所有子类带来动态分配。 目前还没有Swift的对手,并且有理由相信不会因为这里提到的接下来的几件事 他们使用KVC和KVO ,这在Swift中仍然是未知的概念,并且极不可能在不久的将来实现。 我们没有Operation结果的无状态返回,因为Operation的completementBlock无效。 因此,我们需要在Operation上创建可读的属性(状态),以便将结果传回。 任何一种附加状态都会导致附加的内存管理复杂性 Operations可以吸引开发人员“统一”使用它们,即使是琐碎的任务,也可以包装简单的代码以“遵循方法”…… 单元测试中的复杂性更高,需要制作一些帮助程序OperationQueue模拟以能够正确测试它 有时它们只是成为所有业务逻辑的转储,几乎违反了所有SOLID原则。 如果有的话, Operations应该大部分都是样板,仅带有1+个方法调用和1+个结果属性,恕我直言。 同样,在观看WWDC […]
钛酸钡是一种白色的无机化合物,化学式为BaTiO3。 它于1945年被发现,原因是 机械和化学稳定性以及良好的电性能 关于这种化学物质的很多研究已经完成。 钛酸钡具有立方结构,并且是一大批通式为ABO3的化合物的成员 钙钛矿家族,它是第一个被发现的铁电钙钛矿。 钛酸钡纳米粒子及其应用领域 在许多重要的应用领域中都可以使用钛酸钡纳米粒子。 由于钛酸钡具有铁电特性,因此是一种出色的光折变材料。 钛酸钡纳米粒子显示出高密度的光学数据存储。 钛酸钡纳米粒子的这一特性使它们可用于光学计算,光学图像处理,压电设备,热电传感器,激光器,非线性光学设备,模式识别,介电放大器和其他光电设备。 钛酸钡纳米颗粒也可用于多功能结构电容器。 我们的BaTiO3(钛酸钡)纳米粒子的技术特性,99.95%,45nm,立方产品 纯度%99.95彩色白色平均粒径(nm):45比表面积(m2 / g).20.50真密度(g / cm3).5.90晶体立方立方形貌球形Ba / Ti1.00 通过单击下面的链接,您可以找到99.95%,45nm,立方的BaTiO3(钛酸钡)纳米颗粒 : https://nanografi.com/nanoparticles/batio3-barium-titanate-nanoparticles-99-95-45nm-cubic/ 我们的BaTiO3(钛酸钡)纳米粒子的技术特性,99.95%,370nm,四方产品 纯度%99.95色白平均粒径(nm):370比表面积(m2 / g).2.80真密度(g / cm3).5.90结晶度四方形貌球形Ba / Ti1.00 通过单击以下链接,您可能会发现BaTiO3(钛酸钡)纳米颗粒,99.95%,370nm,四方晶 : https://nanografi.com/nanoparticles/batio3-barium-… 我们的BaTiO3(钛酸钡)纳米粒子的技术特性,99.95%,90nm立方产品 纯度%99.95彩色白色平均粒径(nm):90比表面积(m2 / g).10.50真密度(g / cm3).5.90晶体立方立方形貌球形Ba / Ti1.00 通过单击以下链接,您可以找到99.95%,90nm立方晶的BaTiO3(钛酸钡)纳米颗粒 : https://nanografi.com/nanoparticles/batio3-barium-… 我们的BaTiO3(钛酸钡)纳米粒子的技术特性,99.95%,280nm,四方产品 纯度%99.95彩色白色平均粒径(nm):280比表面积(m2 / g).3.80真密度(g / cm3).5.90结晶度四方形貌球形Ba / Ti1.00 通过单击以下链接,您可能会发现BaTiO3(钛酸钡)纳米颗粒,99.95%,280nm,四方晶 : […]
终极史诗般的战斗模拟器 在PC上免费下载Ultimate Epic Battle Simulator,Ultimate Epic Battle Simulator是一款非常早期的模拟动作游戏,没有限制! 在本文中了解免费下载和安装Ultimate Epic Battle Simulator的最佳方法,并确保与您的朋友共享此站点。 有关如何下载和安装最终EPIC BATTLE模拟器的提示 ·单击下载按钮或下面的徽标,您应该重定向到MEGA。 ·单击“下载并通过Web浏览器安装”,或者单击“使用MEGA Sync下载”开始下载。 (对于网络浏览器下载,您应该使用chrome并安装MEGA扩展名,您可以在此处获得)。 ·在完成Ultimate Epic Battle Simulator的下载和安装后,右键单击.zip文件,然后单击此“解压缩到Ultimate Epic Battle Simulator.zip”(要完成此操作,您必须具有WinRAR,您可以在此处下载)。 ·双击Ultimate Epic Battle Simulator文件夹,然后进行UEBS-Beta安装。 ·尽情玩乐! 如果遇到任何问题,请转到此处的网站“疑难解答”部分,并确保以控制器的身份运行游戏,并拥有适用于您游戏的最新图形驱动程序。 终极史诗般的战斗模拟器免费下载 单击下面的下载按钮,开始免费下载Ultimate Epic Battle Simulator。 这是游戏的早期测试版。 不要忘记将游戏作为控制器运行。
我一直喜欢Cucumber风格在iOS上进行UI测试。 但是我真的不喜欢在计算机上管理15000个红宝石版本,更不用说确保团队运行相同的版本,gem(我在看着你calabash-ios )等等。 我也希望它简单:只需读取代码,然后按“运行测试”即可。 因此,我决定在Swift中编写一个简单的Gherkin解析器。 我希望测试的结构如下: 方案:导入按钮起作用 鉴于我在主屏幕上 当我点击“导入”时 然后打开导入屏幕 func I_am_on_the_home_screen(){ … } func the_import_screen_opens(){ … } 该方案位于最上方,执行功能位于其下方。 请注意,没有“ I_tap_Import”功能,我希望tap和type具有足够的通用性,以使我的框架能够理解它。 解析中 POC版本基本上是在进行字符串比较和模式匹配,但是您可以想象,这不是非常有效和灵活。 对于“真实”版本,我使用了解析器组合器。 观看Swift讨论解析数学表达式的视频时,解析器组合器引起了我极大的兴趣。 联机有一些解析器组合器的介绍,因此在这里我不会做太多详细介绍,但是它的大致工作原理是这样的:基本解析器(例如,字符)使用…悬念…组合器组合在一起! 创建更复杂的解析器( 字符串解析器= n × 字符解析器),并且可以应用一些逻辑来创建语法(字符串是直到行尾的每个字符) 我花了几天的时间来“获取”它,但是一旦我将所有内容放到白板上,一切都变得有意义。 简而言之,它解析场景时忽略了前导和尾随空格。 当有一个“ tap ”关键字时,它将使用加引号的字符串作为参数来调用预建的tap函数(例如, Given I tap on “continue”调用app.buttons[“continue”].tap() 当有’ type ‘关键字时,它将使用加引号的字符串作为参数来调用预构建类型函数(例如, Given I type “hello” in field “id”调用app.textFields[“id”].typeText(“hello”) )) 如果没有关键字,它将调用带下划线的分隔线命名函数(例如, Then I […]
如何从照片创建PDF! 这是一个旧教程。 因此,可能有所不同。 所以要注意。 如果您被卡在某处或无法解决,请给我您的反馈。 有关详细信息,请单击并查看下面的图像! 下载应用程序和创建扫描的pdf文件的步骤! 1.打开游戏商店。 2.找到“ camscanner”。 3.下载并打开。 4.单击相机图标。 5.选择单张模式或批处理模式(一次多张照片)。 6.拍照,然后单击确定MARK。 7.文件页边距将被自动检测。 如有必要,手动进行编辑。 8.单击pdf图标,将其转换为pdf。 9.在手机/设备内存的camscanner文件夹中找到转换后的pdf文件。 10.将pdf文件上传到iSr。 问候
测试覆盖范围的扩大是Zendesk Mobile SDK团队的一项持续任务。 有什么比在每次拉动请求中都提示的更好的方法来帮助实现这一点。 让我们知道我们是否正在朝着目标迈进。 早在2014年,我们的iOS SDK就开始使用Xcode 5进行工作。那时,它是一个静态库。 从那以后,它经历了许多更改和Xcode版本。 如今,这是一个由等量的Swift和Objective C编写的动态框架。Xcode项目会迅速收集灰尘,而将新工具集成到旧项目中的工作很少能顺利进行。 我们最近将危险集成到我们的项目中。 危险使代码检查的某些方面自动化。 我们一直将它用于简单的任务,例如警告我们代码中遗留的待办事项或格式错误的提交消息。 设置既简单又易于使用,它具有大量可用的插件。 Slather生成测试覆盖率报告,并旨在加入CI。 还有一个危险插件。 将其添加到我们的项目看起来很简单。 gem install danger-slather 在我们要报告测试覆盖率的方案的危险文件配置slather上添加一行。 添加另一行以显示输出。 推送至GitHub,等待Travis完成。 错误:无法加载覆盖率。 找不到覆盖率数据。 总覆盖率:NaN% 无论如何,这似乎太不可思议了。 错误消息很清楚。 我们要么没有生成代码覆盖率数据,要么Slather无法找到它。 首先,我们需要检查是否正在生成覆盖率数据。 这是在要覆盖数据的方案的测试设置中完成的。 另外,可以将enableCodeCoverage传递给xcodebuild。 在这一点上,我们假设coverage数据与构建输出位于同一位置。 我们正在将OBJROOT传递给xcodebuild,并且可以在那里看到构建输出。 我们已经将Slather配置为在同一目录中查找二进制文件以对其进行覆盖。 我们仍然No coverage directory found从Slather No coverage directory found 。 我们使用bundle show slather slather查看了Slather的代码,发现它正在运行: build_command =“ xcodebuild#{projectOrWorkspaceArgument}#{schemeArgument} -showBuildSettings 此命令获取方案中包含的所有信息。 OBJROOT不会选择将OBJROOT或任何其他环境变量传递给xcodebuild。 […]
使用分析发现下一个市场 下面的Google Analytics(分析)信息中心显示了针对应用开发者的有趣数据。 红色圆圈 -具有部分翻译的国家因此需要完成翻译,以免混淆用户。 蓝色圆圈 -拥有用户但不支持本地化的国家/地区。 这是您的下一个目标! 绿色圆圈 -支持拥有用户和本地化的国家。 检查DAU和MAU以查看它们是否对当前翻译满意。 圆的半径指定活动用户的大小。 如果将鼠标悬停在每个圆圈上,则可以看到DAU(每日活动用户)和MAU(每月活动用户)。 仪表板上的蓝色大球表示潜在的市场,因为您的应用程序中不支持其母语的用户已经存在。 提供他们的本地语言支持应该使他们感到高兴,您可以在这些国家迅速成长。 通过AppStore评分和用户反馈检查翻译质量 Analytics(分析)资讯主页中的其他重要指标是App Store评分和用户反馈。 App Store评分显示每种语言对应用程序的评分。 您需要从AppSettings页面在App Store中注册您的应用ID,才能启用此功能。 用户反馈选项卡显示来自用户的评分摘要。 (有关如何获得用户反馈的信息,请参见下一部分。) 这两个指标可帮助您检查当前本地化的质量。 如果您发现一种语言的收视率较低,则可以认为翻译质量不佳(因为该应用的功能较差,其他语言的收视率也很差。) 听到用户的声音 InAppTranslation具有用户反馈UI。 在您认为合适的地方(例如从“设置”页面)致电以下代码以征询用户的意见,该应用程序会显示一个简单的警报视图,要求用户对翻译质量进行投票。 如果用户在警报视图上单击“是”,则计数为正反馈;如果用户单击“否”,则显示如下视图,要求用户报告错误的翻译。 在此视图中,显示了日语翻译的列表以及原始的英语单词和短语。 用户可以选择自己不满意的翻译。 用户反馈选项卡显示更多详细信息。 您可以看到总体不良反馈率(“否”答案与“是”和“否”答案总数的比率)和每种翻译的不良反馈计数。 如果您发现某些翻译收集了不好的反馈,则可能需要重新翻译。