Tag: iOS应用程序开发

Criptografia para dispositivos iOS

苏马里奥 Neste发布了Vamos Discutir的声音: Segurançados Sistemas苹果。 安全飞地。 Aplicaremos没有使用iOS。 数据保护。 Demonstração做数据保护trabalhando com arquivos。 简介 苹果公司在苹果公司的股份购买权,或者存在于苹果公司的股票。 请在iOS上使用possuem或posposem,然后在comadod上添加is fos semper um ponto positivo和semper citado。 Essasafirmaçõessãoverdadeiras? 像pessoas semper falaram isso dos produtos苹果一样有动机吗? 犯罪或刑事诉讼法? Todos estestópicosserãoabordados aqui,sevocêtiveralgumadúvidasobre criptografia ou outraquestãosobre essestópicospode sana-las aqui na 3xbit Academy 。 Segurançados Sistemas苹果 软件和硬件的安全性,以及iOS设备的基本组件,包括软件的处理过程,以及软件的安全性,以及软件的安全性。 苹果公司对产品的响应是一种易于使用的发行方式,它可以集成硬件和软件,并且可以在iOS设备上分配适当的成本,而在iOS上则要花费很多时间。公证人制度的必要条件。 旨在简化软件安装和安装的软件,软件的硬件和软件,以及软件的通用性。 Entsãocom isso podemos响应者nossa primeira pergunta,或说lembra:“操作系统在iOS上还是在seguros上?”。 Podemos dizeratéaqui que sim,在科摩罗动员代表,在sóque […]

IOS面试常见问题解答(2018年9月)第2部分

iOS最新面试题 在本文中,我要向iOS开发人员添加最近问到的新问题,让我们开始吧。 Q1。 什么是NSZombie? 当您的iPhone应用程序因“错误访问”而崩溃时,您将遇到麻烦–内存错误,您试图在已删除的对象上调用方法。 Instruments拥有对NSZombie的支持-通过向您显示导致崩溃的对象的每个分配,保留,释放和自动释放的完整历史记录,可以轻松地找到错误的来源! 哇。 它是内存调试的辅助工具。 具体来说,当您设置NSZombieEnabled时,只要对象达到保留计数0,而不是将其释放,它就会将自身变形为NSZombie实例。 每当此类僵尸收到消息时,它都会记录警告,而不是以无法预测的方式崩溃或行为。 这样,您就可以调试细微的过度发布/自动发布问题,而无需使用高级工具或在干草堆搜索中费尽心思。 这个名称是一个相当明显的玩法,因为当对象达到保留计数0时,它们通常被视为“死”。在这种设置下,它们继续以奇怪的半衰期存在-既没有生命,也没有死亡。 就像真正的僵尸一样,除了它们的大脑吃得更少。 Q2。 什么是线程清理和静态分析? 线程清理程序将帮助您查找数据争用和其他并发错误。 静态分析器已扩展为搜索可定位性问题,检查为空性以及在MRR代码中查找内存泄漏。 Q3。 什么是延期调用? 编写示例代码? 使用libdispatch,计时器的最简单形式是DispatchQueue.asyncAfter 。 这是“延迟调用”的一种形式,它仅延迟函数但不返回引用,因此不提供取消的可能性。 基本的调用after可能看起来像这样: DispatchQueue.global()。asyncAfter(最后期限:DispatchTime.now()+ .seconds(10)){ //一些延迟的代码 } Q4。 什么是调度源? 调度源是一种基本数据类型,可协调特定底层系统事件的处理。 大中央调度支持以下类型的调度源: 计时器调度源生成定期通知。 UNIX信号到达时, 信号分发源会通知您。 描述符源会通知您各种基于文件和套接字的操作,例如: 当数据可供读取时 何时可以写入数据 在文件系统中删除,移动或重命名文件时 文件元信息更改时 流程调度源会通知您与流程相关的事件,例如: 进程退出时 当进程发出fork或exec类型的调用时 当信号传递到过程时 Mach端口调度源会通知您与Mach相关的事件。 自定义调度源是您定义并触发自己的源。 Q5。 什么是应用程序稀疏? App Store和操作系统通过根据用户特定设备的功能量身定制应用程序交付,从而以最小的占用空间优化了iOS,tvOS和watchOS应用程序的安装。 这种称为应用程序细化的优化,使您可以创建使用最多设备功能,占用最少磁盘空间并容纳Apple可以应用的将来更新的应用程序。 更快的下载速度和更多空间可用于其他应用程序和内容,从而提供更好的用户体验。 切片 切片是为不同目标设备创建和交付应用程序包变体的过程。 变体仅包含目标设备所需的可执行体系结构和资源。 […]

iOS自动版式4

4.kısımdayız! Bukısımdakod ile自动布局nasılyapılıronuinceleyeceğiz。 Eğergözatmadıysanızbundanönceki3yazıyagözatmanızıtavsiye ederim。 iOS自动版面3 Merhabalar Auto Layout的版本3和版本。 Eğeröncekiikibölümedahaöncehiçdenk gelmediyseniz bu… medium.com iOS自动版面2 iPhone 10(NamıdiğerEKS)重装了。 medium.com iOS自动版式1 Tümbu cihazlarda tekilgörünümüyaratmak bu kadar zor mu吗? medium.com 自动版式kullanırkenbirşeyleryaparken hepdiğeralternatiflerden bahsettik。 yinebugüncode ile Auto Layout yaparken 3yöntemdenbahsedeceğim。 布局锚 布局锚bu serinin2。yazısında伪代码olarak yervermiştim。 Burada oyazıdaki伪密码子tam code哈利尼göreceğiz Yukarıdakigrafikte bir view in olabilecektümanchorlara yer verdim。 Soldansağaveyasağdansolayazılıpokunan dilleriçin领先ve尾随anchorların左ve右anchorlarlardoğruve tersorantılıolarakdeğiştiğindenyukarıdakişemadayine durumagöreilgili deyererrere。 Tümanchorlarıgördüktensonraöncekiyazılardanaşinaolduğumuz约束denklemini伪kod […]

Swift中XCTest和XCUITest的网络存根选项

原始文章:原始文章已发布在我的个人博客XCBlog上,继续阅读 此处 以获得更好的图形。 要阅读有关iOS DevOps和iOS CI / CD的更多有趣文章,请 在此处 访问我的博客 。 不要害怕没有广告! 每个iOS应用程序都要求数据显示在应用程序中。 不幸的是,我们无法将所有数据放入我们的iOS应用程序中。 iOS开发人员必须提出网络请求,才能从互联网获取此数据并在应用程序中使用它。 苹果提供了各种库和框架(例如URLSession,NSURLProtocol)来处理网络层,并且有一些第三方框架(如Alamofire)可用于处理网络请求。 但是,由于在测试网络层时使用了不同的方法,因此以网络请求形式测试异步代码变得非常复杂。 在这篇详细的文章中,我们将探索在Swift中测试网络层的所有可用选项,并涵盖可与XCTest框架一起使用的网络存根库的详细信息。 Swift中的网络测试 使用Swift编写的iOS应用的网络测试可以根据项目需求在单元,集成或UI级别执行。 单元和集成测试通常是快速而稳定的,而UI测试则是缓慢而脆弱的。 根据我在互联网上阅读的内容,人们正在使用各种方法在iOS中进行网络测试,其中一些常见方法如下 在单元测试或集成测试中使用协议模拟类 模拟是脆弱而艰苦的,到Swift时模拟变得更加困难。 Swift中没有可用的成熟模拟库来生成类似Java,Ruby,Python或其他语言的模拟。 开发人员必须手动编写所有模拟,并将测试代码与生产代码紧密耦合。 这里有一篇很棒的关于iOS网络测试的文章,以了解有关如何使用协议进行模拟的更多信息。 这种方法无疑使该应用程序更具可测试性,但是它涉及编写很多协议和模拟类。 在Swift中,我们需要模拟我们需要测试的大多数类和方法。 对于iOS开发人员而言,这将是繁重的工作,很快便陷入混乱。 记录和播放网络请求 Swift具有一些库,这些库使我们能够记录网络请求并进行回放,从而避免单元测试通过网络层。 它们将记录的数据存储在文件中,并且该数据被重用而不是进行网络调用。 最受欢迎的库是DVR,可对iOS应用发出虚假的NSURLSession请求。 还有另一个库Szimpla可以执行类似的操作。 您可以在这里在Szimpla上观看会议,在Realm学院中在DVR上观看会议。 使用库存根网络请求 网络层还有另一种方法,它是进行网络调用而不是模拟URLSession并返回存根或静态响应而不是真实响应。 使用存根,我们仍然可以实现网络测试的目标,并且不必将测试代码与生产代码紧密耦合。 我们将看到可用于通过Swift存根网络请求的库的详细信息。 一些最受欢迎的库是用于XCTest(unit)测试的OHHTTPStubs,Mockingjay,Hippolyte。 使用XCUITest框架与UI进行交互 用户界面测试贯穿网络层,涵盖了网络测试的所有方面。 苹果有XCUITest框架来涵盖Xcode UI测试。 我们可以使用一些库来为UITest存根网络。 一些流行的库是Swifter,SBTUITestTunel和XCUITest(UITest)的Embassy。 上面提到的所有方法都各有利弊,因此选择适合项目需求的方法至关重要。 在这篇文章中,我们将看到如何为单元和用户界面测试配置网络层。 Git定位应用 我们将在整个演示中使用GitHub API。 我们将向URL https://api.github.com/users/shashikant86发出网络请求,并从API获取位置并显示在应用程序中。 您可以通过在浏览器中访问JSON响应来查看它。 […]

在Swift 3中获取Facebook页面帖子

大家好…。 大家都知道Facebook SDK登录并使用Facebook SDK获取用户详细信息,例如用户名,电子邮件和电话号码等。 在本教程中,我将向您介绍如何使用Facebook Graph API从公共Facebook页面获取公共帖子,以及如何进一步获取帖子附件。 请记住,您必须先注册您的应用程序Facebook Developer Account。 https://developers.facebook.com/ 在此,我将使用Facebook SDK。 和SwiftyJSON将json映射到模型类中。 众所周知,在开始编码之前,请打开xcode并创建一个单视图应用程序。 现在,您必须在该项目中安装两个库。 我将使用可可豆荚来安装这些库。 在项目中轻松创建一个pod文件,然后在podfile中写入以下行 吊舱’FBSDKCoreKit’ pod’FBSDKLoginKit’ pod’SwiftyJSON’,’〜> 3.1′ FBSDK登录套件还需要我们需要访问令牌才能获取Facebook页面数据,因此首先需要通过以下代码使用Facebook登录。 在开始编码之前,我们需要在View Controller上创建一个UIButton,然后在UIView Controller类内然后在IBAction内创建该按钮的IBAction。编写以下代码以使用Facebook SDK登录。 我正在使用上面的Facebook Page的ID来获取公开帖子。 您可以关注此页面。 它归我所有。 宣传也很重要。 毕竟,我必须在我的Facebook帖子上增加喜欢的次数。 https://www.facebook.com/pg/SandsHellCreations/ 现在回到工作,毕竟我们必须完成任务。 您可以获得我们必须解析的以下类型的json结果。 为了解析数据,我将创建SwiftyJSON helper文件,我们将在解析和创建模型类中使用该文件。 因此,在名为SwiftyJSON Helper的项目中创建一个新的.swift扩展文件,并在其中写入以下代码。 这仅包含用于重整代码的操作符重载。 现在创建一个名为FBModel.swift的swift文件,并将以下代码粘贴到其中,以将数据从json映射到Model类。 现在创建一个以下变量,以将帖子数据存储在View Controller类中。 var data:FBModel? 我们已在getPosts()函数中将json解析数据分配给此变量。 另一件事是,我们需要在分页对象中检查json是否存在下一个命名值,那么我们必须在此图形API中实现分页。 因为在一个API Hit中,我们仅获得25个公开帖子的数据。 这种情况我们已经在getPosts()函数中处理过。 如果帖子多于25条,则要获取所有帖子,我们需要应用分页。 如果发布数超过25,则json中的分页对象内仅存在下一个变量值。 然后编写以下函数来获取分页剩余的帖子数据。 在此,我们获得剩余的帖子,并将这些帖子附加到已经存储了先前帖子的数据变量中。 […]

在几分钟内通过RxSwift将MVC iOS应用重构为MVVM

MVC是Apple在开发iOS应用程序时向开发人员推荐的应用程序体系结构。 它提供了视图,模型和控制器之间的清晰分隔。 控制器位于中间,充当视图和模型之间的粘合剂。 从模型到视图的几乎所有逻辑数据转换都被扔到控制器内部。 随着功能和需求的增长,视图控制器在逻辑,状态管理,数据转换等所有方面变得非常庞大,它将紧密耦合在一起,并且很难作为一个整体进行测试。 尽管并非总是如此,但是如果我们认真地正确管理它。 有关更好的MVC,请参见Dave De Long博客文章。 更好的MVC,第2部分:修复封装 关于“修复”模型视图控制器的系列文章的第2部分:更好的MVC,第1部分:问题,更好的MVC,第2部分:修复… davedelong.com MVVM简介 模型视图视图模型是一种应用程序体系结构,最初由Microsoft于2005年通过其.NET框架首次发明,以构建事件驱动的用户界面。 MVVM作为一种体系结构提供了许多主要职责,例如: 作为提供应用程序状态表示形式的接口。 作为从模型显示的数据转换的管道,将显示到视图中。 使用MVVM,所有从模型进行的数据转换(例如,格式化日期要在UILabel显示为文本)将由视图模型实现,并作为属性公开给控制器。 View Controller的职责是配置属性,将视图模型中的属性绑定到视图中,并将所有操作从视图发送回视图模型。 这样,应用程序状态将始终在视图和视图模型之间保持同步。 有几个重要的规则适用: 模型归视图模型所有,并且对视图模型一无所知。 View Model由View Controller拥有,它对Controller一无所知 控制器拥有视图模型,并且对该模型一无所知。 MVVM提供了更好的业务逻辑封装和来自模型的数据转换,并且作为一个单元进行测试也非常容易。 并非所有的View Model都需要提供对其属性的绑定,它仍然可以是一个轻量级的对象,可以用来通过数据转换配置视图,正如我们稍后在构建应用程序时所看到的。 有几个绑定选项可用,例如使用键值观察和闭包。 在本文中,我们将使用RxSwift库提供可观察到的反应性序列来构建我们的MVVM应用程序。 我们将建立什么 在本文中,我们将把使用MVC作为其应用程序体系结构的当前iOS应用程序重构为MVVM。 这是一个电影信息应用程序,它使用具有以下主要功能的电影数据库(TMDb)API: 按最新趋势,最受欢迎和最近的时间获取电影列表。 使用搜索栏搜索电影。 我们将看到MVVM体系结构将如何帮助我们构建更轻便的视图控制器和一些各自负责的视图模型。 请注册并从TMDb获取您的API密钥。 https://www.themoviedb.org/documentation/api 您可以在下面的GitHub存储库中克隆入门项目: alfianlosari / MovieInfoStarterProject 电影信息MVVM启动项目。 通过在… github.com 上创建一个帐户为alfianlosari / MovieInfoStarterProject开发做出贡献 入门项目 入门项目使用情节提要来配置其视图控制器。 偷看Main.storyboard文件以查看配置。 该应用程序的初始视图控制器是一个带有两个子控件的Tab Bar控制器,每个子控件都嵌入到导航控制器中。 […]

伪造XCTest中Firebase实时数据库API的响应

我在工作中使用Firebase实时数据库,当我在寻找有关模拟使用Firebase实时数据库的单元测试时,发现了这篇文章(用日语编写)。 Firebase实时数据库をiOSで扱う际の模拟について考えてみた 松。松馆(@d_date)です。 medium.com 还写到,不仅仅是模拟实时数据库,而且它是如此有用。 这次,我试图考虑一种更简单的方法来模拟XCTest中的实时数据库的响应。 希望对不想做复杂事情的人有所帮助。 这个应用程式程式码的作用如下: 正在将DatabaseRefenrece的实例传递给构造函数。 使用observeSingleEvent API一次获取“样本”路径的数据。 对响应中的快照进行一些操作,然后将结果传递给完成模块。 该应用程序的所有单元测试代码如下所示。 让我们一一看。 让我们从测试用例开始。 在第一行创建目标类的实例。 那时,将MockDatabaseReference(它是DatabaseReference类的模拟对象)作为构造函数参数传递。 稍后我将解释该模拟类。 此外,请使用XCTestExpectation,因为从实时数据库获取数据应该是异步操作。 这是之前提到的DatabaseReference类的模拟对象。 这次,应用程序代码使用了observeSingleEvent API,因此覆盖了该功能以及子功能。 覆盖子函数的原因是,如果应用程序代码使用子 API来请求特定的路径数据,则该API返回另一个新的DatabaseReference实例,那么我们就无法模拟响应。 因此,这一次,覆盖子 API并返回模拟对象本身,以便应用程序代码在实现模拟时可以请求任何路径。 如果要更改响应数据取决于请求的路径,则可以通过重写子 API并为每个路径返回DatabaseReference的不同模拟对象,来做到这一点,如下所示: 最后,重写DataSnapshot类,它是实际的响应数据。 DataSnapshot的value属性最初是只读属性,因此我们无法使其令人满意。 因此,重写它并返回我们要用作测试数据的数据。 通过在MockDatabaseReference类的observeSingleEvent中使用此MockSnapshot对象,我们最终可以使Firebase Realtime Database API根据需要返回数据。

SwiftLint最简单的配置

一种基于Swift样式指南的,用于实施Swift样式和约定的工具。 SwiftLint帮助我们在项目中编写了更好的代码,对于我们和团队来说,我们不必担心同一行或下一行中的方括号,查看具有1000行或强制展开变量的控制器。 这篇文章是关于使用自定义规则和cocoapods以最简单的方式将其放入项目中的工具的。 首先… 在Mac中安装homebrew:https://brew.sh /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 2.在终端中安装SwiftLint: brew install swiftlint 3.在您的Podfile中添加SwiftLint: Pod’SwiftLint’ 如果您的项目中没有cocoapods,我强烈建议您签出:https://medium.com/@AyunasCode/how-to-install-cocoapods-52c523f73a63 4.让我们去Xcode! 4.1在打开项目的情况下,转到导航器。 4.2单击您的项目名称。 4.3单击目标,然后转到构建阶段选项卡。 4.4单击+图标 4.5添加脚本阶段: “ $ {PODS_ROOT} / SwiftLint / swiftlint” 5.好的,清理并构建您的项目,然后…屏住呼吸,如果您是人类,您的项目现在会有大量的警告甚至错误(强制展开),但是请耐心等待! Podfile的框架创建了很多这样的内容,在警告和空格之间加上了括号和单词之间的空格。 保持冷静和.swiftlint.yml 该文件将控制规则以及swiftlint框架的透明性,从而解决几乎所有不需要的警告。 还记得Brew安装吗? 我们是本教程的第一步吗? 你需要这个朋友 6.在项目中添加一个名为.swiftlint.yml的新空文件。 如果.swiftlint.yml没有正确缩进,则此命令将不起作用,并且终端将显示所有先前的警告 在框架中进行此更改后,您所需要做的就是在Xcode中构建项目,并修复所有与Swift Style Guide无关的内容。 我希望本文能帮助开发人员加快此配置过程,并帮助您处理编写代码的方式。 将来对您和您的团队都更好!

如何动态更改自定义应用程序图标

今天,我将讨论如何在iOS主屏幕上更改应用程序图标。 所以您可能会问我,此功能的用例是什么? 您可以为每个用户个性化应用程序图标,图标本身可以一目了然地提供有用的信息,具体取决于您如何自定义它。 对于我来说,实习项目的任务之一就是实现此功能,以便每个漫画的客户都可以选择在用户的主屏幕上显示其特定的漫画。 这不仅将为我们的客户提供价值,而且还将在我们的应用程序中提供价值,并允许用户选择其他应用程序图标。 顺便说一句,在这里免费下载该应用程序,以获取日常的网络漫画! “对于某些应用程序,自定义功能可以唤起个人联系并增强用户体验。”- Apple 我遇到了这个网站,在更改应用程序图标之前,我看到了此漂亮的通知要呈现给用户,因此我想重新创建它,以下是我的尝试: 我是怎么做的? 在MLB.com的“蝙蝠”应用程序上,对我来说,它像是一个弹出视图,下面有一层阴影。 因此,对于我的实现,我决定先在视图控制器上添加带有模糊效果的视觉效果视图 ,然后在现有视图控制器之上添加UIView 。 然后,我在视图控制器导航栏上添加了UIBarButtonItem ,并将按钮更新为在Icons8上找到的设置图标。 我没有将UIView直接放置在View Controller上,而是将其拖动到顶部作为View Controller的扩展,这样您可以更好地设计弹出视图,并且外观类似于以下内容(左:拖动UIView右上方:创建扩展名之后)

对iPhone应用程序开发人员的需求增加的主要原因

iPhone应用程序开发是许多独立开发人员无法掌握的任务。 随着它的普及度飙升,企业别无选择,只能雇用iPhone应用程序开发公司。 不到十年前,企业移动应用程序才是新事物。 他们为大型企业提供了扩大竞争差距和提升品牌价值的机会。 如今,企业移动应用程序已变得越来越必要。 如果您的企业不使用移动应用程序,则有可能远远落后于竞争对手。 随着越来越多的公司开始其数字化转型之旅,对应用程序开发人员的需求猛增。 根据CIRP发布的数据,iPhone在美国的市场份额在2017年第四季度增长了5%,达到近40%。 因此,租用iPhone应用程序的需求增加了。 大多数公司通过在Android和iPhone应用程序开发人员之间进行选择来开始这一旅程。 毕竟,这两个操作系统主导着企业应用程序开发领域。 但是,您需要首先考虑其他事项。 首选不是iPhone与Android 在确定是否应该聘请Android团队或聘用iPhone应用程序开发人员之前,重要的是要选择采用传统的应用程序开发路线还是通过使用移动应用程序开发平台创建移动解决方案。 传统的应用程序开发过程包括定义应用程序功能,然后从头开始对每个功能进行编码。 另一方面,移动应用程序开发平台包含大量预先开发的模块。 所需的模块可以通过简单的拖放方法包含在您的企业解决方案中。 移动应用程序开发平台带有用户友好的仪表板和强大的工具,可创建完全根据您的独特业务流程,需求和生态系统定制的移动解决方案。 这些平台不仅减少了开发时间和成本,而且还使您免于冗长的测试和错误修复,因为这些模块均无错误。 由于此类平台可帮助您创建比传统iPhone应用程序开发快10倍的应用程序 ,而成本仅为一小部分,因此您可以在数周内准备好Android和iPhone版本的移动解决方案。 雇用iPhone应用程序开发人员的需求不断增加 随着移动解决方案成为各行各业企业不可或缺的一部分,雇用iPhone应用开发人员的需求激增。 以下是公司开始使用iPhone进行数字化之旅的一些原因: 目标观众 在美国和英国拥有雇员或客户的公司可能会选择iPhone应用程序开发人员来开始创建其移动解决方案,因为发达市场中越来越多的人已经可以使用iPhone设备。 此外,iphone应用程序开发公司创建的移动应用程序供高层管理人员或高端客户使用,因为苹果产品在该细分市场中得到了更广泛的使用,因此他们可能会选择iPhone。 《福布斯》援引一份报告称,iPhone用户更为富裕,其中41%的人的年收入超过10万美元。 品牌价值 开发企业移动应用程序是为了满足业务目标。 这取决于解决方案是B2E(企业对雇员)还是B2C(企业对消费者)。 对于B2E,目标可能是更高的效率,更高的生产率,增强的灵活性以及达到更大的人才库,而对于B2C,目标可能包括销售增长,改善的客户支持和更高的客户保留率。 当主要目标是建立品牌时,考虑到苹果的品牌价值,公司可能会选择雇用iPhone应用程序开发人员。 用户体验 将用户体验放在首位的公司可能会选择iPhone,因为该操作系统以提供简单而吸引人的界面而闻名。 通过严格的指导方针,Apple确保了高度直观和引人入胜的用户体验。 而且,iPhone设备更具凝聚力,为整体体验增加了价值。 依靠硬件 如果某个应用严重依赖智能手机的硬件,那么雇用iPhone应用开发人员可能是一个不错的选择。 苹果的产品以其最先进的硬件组件而闻名。 这也以直观,创新和现代的感觉增加了用户体验。 因此,如果您的应用程序将主要由对价格不敏感的企业领导人,高层管理人员,高层管理人员或客户使用,并且如果您的主要目标是建立品牌并提供出色的用户体验,那么请选择雇用iPhone应用开发者。 为了缩短周转时间,请选择功能强大的移动应用程序开发平台来创建可针对您的独特业务需求和目标进行高度定制的高质量应用程序。 有关更多查询,请联系我们的iOS专业知识 。