{"id":355918,"date":"2024-05-20T23:18:42","date_gmt":"2024-05-20T23:18:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=355918"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=355918","title":{"rendered":"<span>\u0414\u0435\u0431\u0430\u0433\u0433\u0438\u043d\u0433 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 Xcode. \u0417\u0430\u0447\u0435\u043c?<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0427\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u044c\u0448\u0435?<\/h2>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0434\u0435\u0431\u0430\u0433 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u044b\u043b \u0434\u0430\u0432\u043d\u043e \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7ce\/1d5\/2f0\/7ce1d52f0656770c04957b4ff071253e.png\" width=\"1600\" height=\"1256\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ce\/1d5\/2f0\/7ce1d52f0656770c04957b4ff071253e.png\"\/><\/figure>\n<p>\u041d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0442\u0430\u043c \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043a\u0440\u044b\u0442 #IF DEBUG\u2019\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0444\u0438\u0447\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0434\u043e\u0431\u0430\u0432\u043e\u043a\u00a0\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u0432\u0441\u0451 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0441 \u0448\u0435\u0441\u0442\u0435\u0440\u0451\u043d\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430\u0447\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u043c\u0435\u043d\u044f\u0442\u044c? \u0412\u0435\u0434\u044c \u0432\u0441\u0435 \u00ab\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u00bb.<\/p>\n<p>\u0428\u0443\u0442\u043a\u0430, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u0434\u043e \u0432\u0441\u0451 \u043c\u0435\u043d\u044f\u0442\u044c. \u0412\u0435\u0434\u044c \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u043b\u044f SSL-Pinning. \u0415\u0451 \u0441\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0441\u0442\u0430\u043b\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0410 \u0432\u0441\u0435 \u043f\u0440\u043e\u043a\u0441\u0438, \u043f\u043e \u0442\u0438\u043f\u0443 \u0421harlie \u0438\u043b\u0438 Proxyman \u043d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u2014 \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0438 \u043d\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<p>\u0410 \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u2014\u00a0\u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u0438 \u043a\u043b\u044e\u0447\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441? \u041b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c08\/43f\/111\/c0843f111063d96462f8082b95b65122.png\" width=\"1600\" height=\"1216\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c08\/43f\/111\/c0843f111063d96462f8082b95b65122.png\"\/><\/figure>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u043d\u043e \u00ab\u043a\u0443\u0434\u0430 \u0435\u0433\u043e\u00bb? \u041f\u043e\u043b\u0435\u0437\u043b\u0438 \u043c\u044b \u0432 \u043d\u0430\u0448\u0435 \u0441\u0442\u0430\u0440\u043e\u0435 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e, \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0442\u0443\u0434\u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0435\u0449\u0451 \u0432\u0441\u0451 \u0434\u0435\u0431\u0430\u0433\u043e\u043c \u0437\u0430\u043a\u0440\u044b\u0442\u043e. \u041d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u00ab\u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438?\u00bb \u0413\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0445\u044d\u0448\u0442\u0435\u0433\u0443 #debugging-tool \u043d\u0430 GitHub. \u0417\u0434\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<p>\u041d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u043e.<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0430\u0436\u0434\u043e\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435<\/strong>. \u041a\u043e\u0434 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0447\u0443\u0436\u0430\u044f \u2014\u00a0\u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u00ab\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u00bb, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0445 \u0444\u043e\u0440\u043a\u0430\u0442\u044c<\/strong>. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u044b \u0442\u0435\u0440\u044f\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043c\u0435\u0440\u0436\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Objective-C<\/strong><em>,<\/em> \u0430 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 99% \u043d\u0430 Swift. \u0422\u0430\u0449\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043a\u0443\u0447\u0443 \u043a\u043e\u0434\u0430 Objective-C \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0de\/cce\/84d\/0decce84d3a5a9a85362ab33204ca8d4.png\" width=\"1600\" height=\"943\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0de\/cce\/84d\/0decce84d3a5a9a85362ab33204ca8d4.png\"\/><\/figure>\n<p>\u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041d\u043e \u043a\u0430\u043a \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c?<\/p>\n<ul>\n<li>\n<p>\u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u043e\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u2014 \u0447\u0442\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u043f\u0440\u043e\u0434 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u0432\u0441\u0451 \u0434\u0435\u0431\u0430\u0433\u043e\u043c \u043d\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0448\u044c.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c \u0443\u0434\u043e\u0431\u043d\u043e, \u0438\u043d\u0430\u0447\u0435 \u0438\u043c \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0433 \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ad6\/a87\/35f\/ad6a8735f1184749e45db6c59bb9fb39.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 YARCH, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\" title=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 YARCH, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\" width=\"1600\" height=\"895\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ad6\/a87\/35f\/ad6a8735f1184749e45db6c59bb9fb39.png\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 YARCH, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c<\/figcaption><\/div>\n<\/figure>\n<h2>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c?<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432.\u00a0<\/p>\n<ul>\n<li>\n<p>\u0414\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043b\u0438\u043d\u043a\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u043b\u0435\u0439\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043c\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <code>#IF DEBUG<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0448\u0443 \u0434\u0438\u0437\u0430\u0439\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0438 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0441\u0432\u043e\u044e \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<p>\u0414\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c.\u00a0<\/p>\n<p><strong>\u041f\u0435\u0440\u0432\u043e\u0435 \u2014 \u044d\u0442\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0437\u0430\u0436\u0430\u0442\u0438\u0435<\/strong>. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0434\u0435\u0432\u0430\u0439\u0441\u0435, \u043c\u043e\u0436\u043d\u043e \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435.<\/p>\n<figure class=\"bordered\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/013\/303\/1d3\/0133031d3988c24d46727ea7558eff05.gif\" width=\"266\" height=\"539\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/013\/303\/1d3\/0133031d3988c24d46727ea7558eff05.gif\"\/><\/figure>\n<p><strong>\u0412\u0442\u043e\u0440\u043e\u0435 \u2014 \u043f\u043e\u0442\u0440\u044f\u0441\u0442\u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d.<\/strong><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a17\/3f7\/8a8\/a173f78a835cc5bbdaf954bc09609028.gif\" width=\"500\" height=\"477\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a17\/3f7\/8a8\/a173f78a835cc5bbdaf954bc09609028.gif\"\/><\/figure>\n<p><strong>\u0422\u0440\u0435\u0442\u044c\u0435 \u2014\u00a0\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435<\/strong> <strong>\u2014\u00a0\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448 Shift + &lt;\u2014.\u00a0<\/strong><\/p>\n<p>\u0423 <code>UIResponder<\/code> \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>keyCommands<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448 \u0438 \u044d\u043a\u0448\u0435\u043d.\u00a0<\/p>\n<pre><code class=\"swift\">override public var keyCommands: [UIKeyCommand]? { \u00a0\u00a0\u00a0\u00a0let debugMenuCommand = UIKeyCommand( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0input: UIKeyCommand.inputLeftArrow, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0modifierFlags: .shift, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0action: #selector(handleGestureRecognizer) \u00a0\u00a0\u00a0\u00a0) \u00a0\u00a0\u00a0\u00a0return [debugMenuCommand] }<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043c\u044b \u043d\u0430 \u044d\u0442\u043e\u0442 \u044d\u043a\u0448\u0435\u043d \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e.\u00a0<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u043b\u0438 \u2014 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f.\u00a0<\/p>\n<h2>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u00a0<\/h2>\n<h4>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c<\/h4>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/87d\/fa5\/fef\/87dfa5fef5b8d170be93404052f65873.png\" width=\"1600\" height=\"1188\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/87d\/fa5\/fef\/87dfa5fef5b8d170be93404052f65873.png\"\/><\/figure>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p>\u0423 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0435\u0441\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0432 Postman, \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0436\u0435 \u043f\u0440\u0438\u0448\u0435\u043b \u0441\u044e\u0434\u0430 \u00ab\u043a\u043d\u043e\u043f\u043a\u0438 \u043a\u0440\u0430\u0441\u0438\u0442\u044c\u00bb, \u0430 \u043d\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 Postman \u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u0435\u0440\u043d\u043e? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043f\u0438\u0448\u0435\u0442 \u0442\u0435\u0441\u0442\u0435\u0440\u0443, \u0430 \u0442\u043e\u0442 \u2014 \u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u043e \u2014 \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u0442, \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043e\u0442\u0432\u0435\u0442\u0438\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438 \u0442\u0435\u043f\u0435\u0440\u044c\u00a0\u0432\u0441\u0435 \u044d\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u2014 \u0432\u043e\u0442 \u0432\u0430\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0432\u043e\u0442 \u0432\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 UI, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e, \u043d\u0430\u0436\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0432\u0441\u0451.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/827\/7f1\/9b8\/8277f19b85f448975f62d55ebbeb8c2d.png\" width=\"1600\" height=\"1109\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/827\/7f1\/9b8\/8277f19b85f448975f62d55ebbeb8c2d.png\"\/><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u0432 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0437\u043e\u043d\u0443, \u0432 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u043e\u0439 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d53\/a74\/e3f\/d53a74e3f46f0b707623ee0818bd8199.png\" width=\"1600\" height=\"1240\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d53\/a74\/e3f\/d53a74e3f46f0b707623ee0818bd8199.png\"\/><\/figure>\n<h4>Feature toggles<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 feature toggles.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/510\/bf8\/ce9\/510bf8ce97c33b1aea5b029d4112d072.png\" width=\"1600\" height=\"1357\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/510\/bf8\/ce9\/510bf8ce97c33b1aea5b029d4112d072.png\"\/><\/figure>\n<p>\u0412\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f feature toggles \u0443 \u043d\u0430\u0441 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0420\u0430\u043d\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c feature toggle, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f feature \u0444\u043b\u0430\u0433\u043e\u0432, \u0438 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u043d\u0443\u0436\u043d\u0430. \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 UI, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 feature toggles. \u041e\u043d \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043b\u044e\u0431\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430. \u0422\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c feature toggle, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0439\u0442\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0412\u0441\u0451, \u043e\u043d \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0438\u0442, \u043a\u0430\u043a \u044d\u043a\u0440\u0430\u043d \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f.<\/p>\n<figure class=\"float bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9ad\/02c\/852\/9ad02c852fb8a593f6756624992c9384.gif\" width=\"884\" height=\"1786\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9ad\/02c\/852\/9ad02c852fb8a593f6756624992c9384.gif\"\/><\/figure>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0437\u0430 \u0441\u0447\u0451\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043a\u0443\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f feature toggles \u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ac1\/de7\/c0e\/ac1de7c0e7a707b8cce961cbe3e1b69a.png\" width=\"1982\" height=\"1568\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac1\/de7\/c0e\/ac1de7c0e7a707b8cce961cbe3e1b69a.png\"\/><\/figure>\n<h4>\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/h4>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a7a\/91f\/e05\/a7a91fe0551f4c02b2c9a9ca19de2762.png\" width=\"1600\" height=\"1161\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a7a\/91f\/e05\/a7a91fe0551f4c02b2c9a9ca19de2762.png\"\/><\/figure>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, Apple \u043d\u0435 \u0434\u0430\u0451\u0442 API \u043a \u0441\u0432\u043e\u0435\u043c\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0443, \u0430 \u043b\u043e\u0433\u0438 \u043d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043a\u043b\u0438\u043a\u0431\u0435\u0439\u0442\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 \u0438 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u0435\u0432\u0430\u0439\u0441\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Proxyman \u0434\u043b\u044f iOS. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c VPN \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0435\u0431\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 VPN, \u0430 Proxyman \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442. \u041d\u043e \u0442\u0430\u043a \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043f\u0440\u043e\u0434\u0430, \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u0438\u0437-\u0437\u0430 SSL Pinning.\u00a0<\/p>\n<p>\u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0434\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0430\u0436\u0435 \u0441 \u043f\u0440\u043e\u0434\u0430, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f SSL Pinning, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430, \u0437\u0430\u0439\u0442\u0438 \u0432 \u043f\u0440\u043e\u0434. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u0442\u0430\u043a\u043e\u0439 \u0434\u0435\u0431\u0430\u0436\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0435\u0442\u0435\u0441\u044c \u0432 \u043f\u0440\u043e\u0434, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ce5\/f1c\/439\/ce5f1c439b77a8a0c5a233c58a11f152.png\" width=\"1600\" height=\"1205\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ce5\/f1c\/439\/ce5f1c439b77a8a0c5a233c58a11f152.png\"\/><\/figure>\n<p>\u0412 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e: \u0437\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u043d\u043e \u0432\u0441\u0435 \u0445\u0435\u0434\u0435\u0440\u044b, \u0443\u0440\u043b\u044b, \u0431\u043e\u0434\u0438.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f6a\/67a\/249\/f6a67a249206b25edba4b39dd04b5bfe.png\" width=\"1600\" height=\"1206\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f6a\/67a\/249\/f6a67a249206b25edba4b39dd04b5bfe.png\"\/><\/figure>\n<p>\u0423 \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0430\u043d\u0430\u043b\u043e\u0433 Cmd+F, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c, \u043a\u0430\u043a \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c curl&#8217;\u043e\u043c, \u0442\u0430\u043a \u0438 \u0432\u0441\u0435\u043c \u043b\u043e\u0433\u043e\u043c. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438 \u0447\u0430\u0441\u0442\u043e \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0434\u0435\u0432\u0430\u0439\u0441\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0443\u0442 \u0438 \u0432 Telegram \u0441\u043a\u0438\u0434\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043b\u043e\u0433, \u0430 \u043e\u043d \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2bf\/dca\/742\/2bfdca74281736072209559e07ccd4e2.png\" width=\"1600\" height=\"859\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2bf\/dca\/742\/2bfdca74281736072209559e07ccd4e2.png\"\/><\/figure>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Alamofire. \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u0441\u0435\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 EventMonitor, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f Alamofire.<\/p>\n<p>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u2014\u00a0<a href=\"https:\/\/github.com\/Alamofire\/Alamofire\/blob\/master\/Documentation\/AdvancedUsage.md#adding-eventmonitors\"><u>AdvancedUsage.md<\/u><\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430.<\/p>\n<pre><code class=\"swift\">public func request(_ request: DataRequest, didParseResponse response: DataResponse&lt;Data?, AFError>)<\/code><\/pre>\n<p>\u0412 \u0442\u0435\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b EventMonitor, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043e\u0431\u044a\u0435\u043a\u0442 <code>Session<\/code> \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"swift\">public convenience init(configuration: URLSessionConfiguration = URLSessionConfiguration.af.default,                         delegate: SessionDelegate = SessionDelegate(),                         rootQueue: DispatchQueue = DispatchQueue(label: \"org.alamofire.session.rootQueue\"),                         startRequestsImmediately: Bool = true,                         requestQueue: DispatchQueue? = nil,                         serializationQueue: DispatchQueue? = nil,                         interceptor: RequestInterceptor? = nil,                         serverTrustManager: ServerTrustManager? = nil,                         redirectHandler: RedirectHandler? = nil,                         cachedResponseHandler: CachedResponseHandler? = nil,                         eventMonitors: [EventMonitor] = []) \/\/ &lt;- \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448 EventMonitor \u0432 \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043b\u043e\u0433\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 UI, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043b\u043e\u0433\u043e\u0432.\u00a0<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0438\u0441\u043a \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u043b\u043e\u0433\u0443. \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u043a \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0447\u0430\u0441\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0435\u0451 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>UITextView<\/code>. \u0414\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u043e\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 <code>NSRange<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439.\u00a0<\/p>\n<pre><code class=\"swift\">guard let regex = try? NSRegularExpression(pattern: searchText, options: [.ignoreMetacharacters, .caseInsensitive]) else {     return nil } let ranges = regex.matches(in: textForHighlight.string, range: .init(location: .zero, length: textForHighlight.length))     .map { $0.range }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 <code>NSRange<\/code> \u043d\u0430\u0434\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u043e\u043c. \u042d\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c <code>NSMutableAttributedString<\/code> \u043f\u0443\u0442\u0451\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043a \u0441\u0442\u0440\u043e\u043a\u0435.<\/p>\n<pre><code class=\"swift\">ranges.forEach { textForHighlight.addAttribute(.backgroundColor, value: UIColor.orange, range: $0) }<\/code><\/pre>\n<p>\u0410 \u0434\u043b\u044f \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043a \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>scrollToVisible(_ range: NSRange)<\/code> \u0443 <code>UITextView.<\/code><\/p>\n<pre><code class=\"swift\">textView.scrollRangeToVisible(range)<\/code><\/pre>\n<h4>SSL-Pinning<\/h4>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441 \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u044d\u0440\u0430 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3bd\/05a\/1fa\/3bd05a1fa563718673d8a1b9d47b51b3.png\" width=\"1600\" height=\"1381\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3bd\/05a\/1fa\/3bd05a1fa563718673d8a1b9d47b51b3.png\"\/><\/figure>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u043c\u0435\u043d\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c SSL-\u043f\u0438\u043d\u043d\u0438\u043d\u0433. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0444\u0438\u0447\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/35f\/ca1\/e95\/35fca1e95590d037b78440624e9ae7c9.png\" width=\"1600\" height=\"1216\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/35f\/ca1\/e95\/35fca1e95590d037b78440624e9ae7c9.png\"\/><\/figure>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0446\u0435\u043b\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u2014 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<h4>\u0410\u0411 \u043b\u043e\u0433\u0438<\/h4>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5e3\/458\/97a\/5e345897a4179f86680beaef784d9c63.png\" width=\"1600\" height=\"1141\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5e3\/458\/97a\/5e345897a4179f86680beaef784d9c63.png\"\/><\/figure>\n<p>\u042d\u0442\u043e \u043d\u0430\u0448\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043b\u043e\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u043e\u0433\u0438\u0440\u0443\u044e\u0442 \u0432\u0441\u044f\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043a\u043e\u0434\u0435, \u0431\u0443\u0434\u044c \u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430, \u0438\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0438.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9e2\/2a4\/4ae\/9e22a44ae48564dcb697070838573ac4.png\" width=\"2108\" height=\"1594\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e2\/2a4\/4ae\/9e22a44ae48564dcb697070838573ac4.png\"\/><\/figure>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0410\u0411 \u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442, \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044f Xcode. \u041f\u0440\u044f\u043c \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044f Xcode.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0432\u0441\u0435 \u0432\u0438\u0434\u044b \u043b\u043e\u0433\u043e\u0432 \u0437\u0430 \u0441\u0447\u0451\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430.<\/p>\n<pre><code class=\"swift\">public func LogDebug(     _ message: @autoclosure () -> Any,     asynchronous async: Bool = true,     file: StaticString = \"\",     function: StaticString = \"\",     line: UInt = 0,     logClient: LoggerFacadeProtocol = LoggerClientDefault.shared ) {     logClient.logDebug(message(), asynchronous: async, file: file, function: function, line: line) } <\/code><\/pre>\n<p>\u0423 \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0442\u0430\u043a\u0430\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0442\u0438\u043f\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043b\u043e\u0433\u0430: Verbose, Debug, Info \u0438 \u0442.\u0434. \u0412\u044b\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0436\u043d\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a.<\/p>\n<pre><code class=\"swift\">\/\/ \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043b\u043e\u0433 \u0442\u0438\u043f\u0430 Debug, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 ABLogDebug(#function, asynchronous: true) <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043b\u043e\u0433\u043e\u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432 \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d.<\/p>\n<p><code>LoggerClientDefault<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043d\u0435\u043a\u0438\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043b\u043e\u0433\u0438 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u0445 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c.<\/p>\n<h4>\u041b\u043e\u0433\u0438 \u043f\u0443\u0448\u0435\u0439<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0448\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cc0\/e74\/ac5\/cc0e74ac560037f45da79553811c1161.png\" width=\"1600\" height=\"1130\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cc0\/e74\/ac5\/cc0e74ac560037f45da79553811c1161.png\"\/><\/figure>\n<p>\u042d\u0442\u043e \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0437\u0430 \u0441\u0447\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <code>UNUserNotificationCenter<\/code>, \u0443 \u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>getDeliveredNontification<\/code>. \u041e\u043d \u0432\u0435\u0440\u043d\u0451\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0443\u0448\u0430\u0445. <\/p>\n<pre><code class=\"swift\">func getNotifications() {     UNUserNotificationCenter.current().getDeliveredNotifications { [weak self] notifications in         self?.presenter.presentNotifications(notifications)     } } <\/code><\/pre>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c breakpoint\u2019\u044b, \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0432 \u043f\u0443\u0448 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442, \u0430 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0443\u0448-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435.<\/p>\n<h4>\u041b\u043e\u0433\u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c.\u00a0<\/p>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u044c\u0448\u0435 (\u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0438 \u0443 \u043c\u0435\u043d\u044f): \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432\u0435\u0441\u044c \u0444\u043b\u043e\u0443, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e <strong>\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0434\u0435\u043d\u044c<\/strong> \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u0436\u0435 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0414\u0430, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u043e \u0441\u0443\u0442\u043e\u043a \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b2\/a33\/e0d\/2b2a33e0d920eea88b28fd039294225a.png\" width=\"1600\" height=\"1166\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2b2\/a33\/e0d\/2b2a33e0d920eea88b28fd039294225a.png\"\/><\/figure>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 (\u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 Facade). \u0422\u0443\u0442 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0443\u0434\u0430-\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f. \u0412\u0441\u0435 \u0438\u0445 \u0434\u0438\u043c\u0435\u043d\u0448\u0435\u043d\u044b, \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0438 \u0443\u0445\u043e\u0434\u044f\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0422\u0435\u043f\u0435\u0440\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0435 \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0444\u043b\u043e\u0443 \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e. \u0412\u0441\u0451, \u043e\u043d \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0451 \u0432\u0438\u0434\u0438\u0442, \u043d\u0435 \u043d\u0430\u0434\u043e \u0436\u0434\u0430\u0442\u044c \u0441\u0443\u0442\u043a\u0438.<\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u0440\u0435\u0448\u0430\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 ? \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0441\u0442\u043e\u0440\u0430\u0434\u0436, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u043b\u043e\u0433.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0442\u043e\u0440\u0430\u0434\u0436, \u0432 \u043d\u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0434\u0438\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e storage \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f.\u00a0<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b \u2014 \u0444\u0438\u0447\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a20\/da5\/faf\/a20da5faf694f7aaec6a856ca057a396.png\" width=\"1600\" height=\"1127\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a20\/da5\/faf\/a20da5faf694f7aaec6a856ca057a396.png\"\/><\/figure>\n<h4>UserDefaults \u0438 Keychain<\/h4>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 UserDefaults \u0438 Keychain, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/951\/5f9\/957\/9515f99575f2cb19b79d5f8065e9f032.png\" width=\"1600\" height=\"1138\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/951\/5f9\/957\/9515f99575f2cb19b79d5f8065e9f032.png\"\/><\/figure>\n<p>\u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Keychain, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043d\u0430\u0434\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c breakpoint, \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0432\u0441\u0451 \u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c, \u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u0432\u0430\u0439\u0441\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 Keychain \u0438\u043b\u0438 UserDefaults.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e UserDefaults \u0438 Keychain.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9ba\/485\/c46\/9ba485c46d7efb89c4b66ad0540de7de.png\" width=\"1600\" height=\"1214\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9ba\/485\/c46\/9ba485c46d7efb89c4b66ad0540de7de.png\"\/><\/figure>\n<p>\u0414\u043b\u044f UserDefaults \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u044b \u043a\u043b\u044e\u0447, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443 \u0434\u043e\u043c\u0435\u043d\u0430. \u0410 \u0434\u043b\u044f Keychain \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432\u0441\u0435 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f UserDefaults \u0438 Keychain, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435?<\/p>\n<p>\u0421 UserDefaults \u043c\u044b \u0440\u0435\u0448\u0430\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0442\u0430\u043a. \u0412\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043d\u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u0432 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d <code>UserDefaults.standart<\/code>, \u043b\u0438\u0431\u043e \u0432 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>suitName<\/code>. \u0412\u0441\u0435 <code>suitName<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u043e\u043c. \u0418\u043c\u0435\u044f \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 <code>suitName<\/code> \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <code>UserDefaults<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0438\u043c\u0435\u0435\u0442\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u044f \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0432 <code>UserDefaults<\/code> \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0438 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u0438 \u043f\u0430\u0440\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u0435\u0442\u043e\u0434\u0443 <code>dictionaryRepresentation<\/code> \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>UserDefaults<\/code>.<\/p>\n<p>\u0412\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a.<\/p>\n<pre><code class=\"swift\">let userDefaults = [     userDefaults.standard,     userDefaults(suiteName: \"name1\"),     userDefaults(suiteName: \"name2\")     \/\/... ].compactMap { $0 } userDefaults.forEach {     let dictionary = $0.dictionaryRepresentation()     \/\/ \u041a\u0430\u043a\u0430\u044f-\u043b\u0438\u0431\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>\u0412 Keychain \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0442\u044b \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0430\u043c. \u041c\u044b \u0432\u0437\u044f\u043b\u0438 \u0442\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<pre><code class=\"swift\">\/\/\/ \u041a\u043b\u0430\u0441\u0441\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 Keychain (\u043f\u0440\u0438\u043c\u0435\u0440) static let keychainClasses = [     kSecClassInternetPassword,     kSecClassCertificate ] <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 Keychain. \u0415\u0433\u043e \u043d\u0430\u0434\u043e \u043e\u0431\u043e\u0433\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e.<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/security\/ksecreturnattributes\"><u>kSecReturnAttributes<\/u><\/a> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e <code>Keychain Item<\/code>.\u00a0<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/security\/ksecmatchlimit\"><u>kSecMatchLimit<\/u><\/a> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441. \u041c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043f\u043e\u0434 \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <a href=\"https:\/\/developer.apple.com\/documentation\/security\/ksecmatchlimitall\">kSecMatchLimitAll<\/a>.\u00a0<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/security\/ksecreturndata\"><u>kSecReturnData<\/u><\/a> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0434\u043e \u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 <code>CFData<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435,\u00a0 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e <code>Keychain Item<\/code>. <\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"swift\">\/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0435\u043c \u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438  let keychainAttributes = [     kSecReturnAttributes: kCFBooleanTrue as Any,     kSecMatchLimit: kSecMatchLimitAll,     kSecReturnData: kCFBooleanTrue as Any, ]          let queries = Constants.keychainClasses.map { secItemClass in     var keychainQuery = keychainAttributes     keychainQuery[kSecClass] = secItemClass     return keychainQuery } <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Keychain \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f.<\/p>\n<pre><code class=\"swift\">public func SecItemCopyMatching( query: CFDictionary,  result: UnsafeMutablePointer&lt;CFTypeRef?>?) -> OSStatus<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 Keychain \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<pre><code class=\"swift\">func getKeychainItems() {     let keychainAttributes = [         kSecReturnAttributes: kCFBooleanTrue as Any,         kSecMatchLimit: kSecMatchLimitAll,         kSecReturnData: kCFBooleanTrue as Any,     ]              let queries = Constants.keychainClasses.map { secItemClass in         var keychainQuery = keychainAttributes         keychainQuery[kSecClass] = secItemClass         return keychainQuery     }              \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 Keychain     let keychainDictionaries = Constants.keychainQueries.flatMap { query in         var result: CFTypeRef?         if SecItemCopyMatching(query as CFDictionary, &amp;result) != errSecItemNotFound,             let dictionaries = result as? [AnyHashable] {                 return dictionaries.compactMap { $0 as? [CFString: Any] }             }             return []         }     \/\/ \u041f\u0430\u0440\u0441\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0438\u0447\u0435\u0439\u043d\u0430 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438     let storingModels = keychainDictionaries.compactMap { dictionary in         \/\/ \u0422\u0443\u0442 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434     } } <\/code><\/pre>\n<h4>\u0421\u043f\u0438\u0441\u043e\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043f\u043e\u0434\u043e\u0432.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c6c\/63e\/846\/c6c63e846b7c07639dd869eeee3fed11.png\" width=\"1600\" height=\"918\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c6c\/63e\/846\/c6c63e846b7c07639dd869eeee3fed11.png\"\/><\/figure>\n<p>\u0412\u0441\u0435 \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044b \u043f\u043e\u0441\u043b\u0435 <code>pod install<\/code> \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0438 \u043c\u044b \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f, \u0438 \u0435\u0441\u0442\u044c \u043b\u0438 \u0442\u0430\u043c \u043d\u0430\u0448\u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0432 \u043d\u0451\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f. \u0412\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0442\u043e, \u0447\u0442\u043e \u043f\u0430\u0440\u0441\u0438\u043c <code>Podfile.lock<\/code> \u2014 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u044d\u0442\u043e \u0437\u0430 \u0441\u0447\u0451\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>Podfile.lock<\/code>. \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">PODS: -> \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0443\u043d\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0430\u0445 \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445     - PodName1 (1.0.0) -> \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0430 \u0438 \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u044f         - PodDependency1 -> \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0430         - PodDependency2 -> \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0430         \u2026     - PodName2(1.0.0) -> \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0430 \u0438 \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u044f     \u2026  DEPENDENCIES: -> \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0443\u043d\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043f\u043e\u0434     -> PodName1 (from \u2018somewhere\u2019) -> \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0430 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0442\u043e\u043c, \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d. \u0412 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u043a\u0430\u043a \u043f\u0443\u0442\u044c \u0434\u043e podspec \u0432 \u0433\u0438\u0442\u0435, \u0442\u0430\u043a \u0438 \u043f\u0443\u0442\u044c \u0434\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 (.\/Modules\/ModuleName)     -> PodName2 (from \u2018somewhere\u2019)     \u2026  SPECREPOS: -> \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0443\u043d\u043a\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043f\u0435\u043a\u0430\u0445 \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0432\u044b\u043a\u0430\u0447\u0435\u043d\u044b     https:\/\/github.com\/CocoaPods\/Specs.git: -> \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439         - YandexMaps -> \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u043a\u0438         - AnotherMaps         \u2026     \u2026  EXTERNAL SOURCES -> \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0443\u043d\u043a\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0431\u044b\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d     PodName1:         :podspec: https::\/url\/0.0.18.0-1\/PodName.podspec -> \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0434 \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043f\u043e \u043f\u043e\u0434\u0441\u043f\u0435\u043a\u0435     PodName2:         :path: .\/Modules\/ModuleName -> \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0434 \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043f\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438     \u2026 CHECKOUT OPTIONS: -> \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0443\u043d\u043a\u0442\u0430 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043f\u043e\u0434\u0430\u0445, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e \u0442\u0435\u0433\u0443, \u043a\u043e\u043c\u043c\u0438\u0442\u0443 \u0438\u043b\u0438 \u0432\u0435\u0442\u043a\u0435     PodName1:         :commit: 40726099a7230ab7b8dcf93d454c37cf0c219d9a -> \u0422\u0435\u0433 \u043a\u043e\u043c\u043c\u0438\u0442\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043f\u043e\u0434         :git: \u201cssh:\/\/git@git\/some_project.git\u201d -> \u0413\u0438\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430     PodName2:         :tag: 1.0.0 -> \u0422\u0435\u0433 \u043f\u043e\u0434\u0430         :git: \u201cssh:\/\/git@git\/some_project.git\u201d -> \u0413\u0438\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430     \u2026  SPEC CHEKSUMS: -> \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0443\u043d\u043a\u0442\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0434\u0430     PodName: e4f20a721e545d5eb5f6df78d9980664a22fe4c4 -> \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0430 \u0438 \u0435\u0433\u043e \u0447\u0435\u043a \u0441\u0443\u043c\u043c\u0430     \u2026  PODFILE CHEKSUM: 824d4145fa440921208d56c678286b4f1382e910 -> \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441 \u0447\u0435\u043a \u0441\u0443\u043c\u043c\u043e\u0439 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0434 \u0444\u0430\u0439\u043b\u0430  COCAPODS: 1.0.0 -> \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 CocoaPods  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0435\u0433\u043e \u0438 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0435. \u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u043c \u0440\u0435\u0448\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<h4>\u0421\u0447\u0435\u0442\u0447\u0438\u043a FPS<\/h4>\n<p>\u042d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0431\u0430\u0440\u0435 \u0432 \u0432\u0438\u0434\u0435 UIWindow. \u041e\u043d \u043a\u0440\u0430\u0441\u0438\u0442\u0441\u044f \u0432 \u0446\u0432\u0435\u0442\u0430, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0445\u043e\u0440\u043e\u0448\u0438\u0439 FPS \u0438\u043b\u0438 \u043d\u0435\u0442.\u00a0<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/99c\/3bf\/e69\/99c3bfe69438fd98434a60a4a2ac0a58.gif\" width=\"229\" height=\"463\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/99c\/3bf\/e69\/99c3bfe69438fd98434a60a4a2ac0a58.gif\"\/><\/figure>\n<p>\u0421\u0447\u0451\u0442\u0447\u0438\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435. \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p>\u041c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a FPS \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430 <code>CADisplayLink<\/code>. \u0415\u043c\u0443 \u043f\u0440\u044f\u043c\u043e \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u044d\u043a\u0440\u0430\u043d. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0435\u0433\u043e \u0432\u043e\u0442 \u0442\u0430\u043a.<\/p>\n<pre><code class=\"swift\">private var displayLink: CADisplayLink?  func startTracking() {     if displayLink != nil { stopTracking() }     displayLink = CADisplayLink(         target: self,         selector: #selector(updateFromDisplayLink(_:))     )     displayLink?.add(to: .main, forMode: .common) }  func stopTracking() {     displayLink?.invalidate()     displayLink = nil } <\/code><\/pre>\n<p>\u0410 \u0441\u0430\u043c \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043a\u0430\u0434\u0440\u044b \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0432\u043e\u0442 \u0442\u0430\u043a.<\/p>\n<pre><code class=\"swift\">@objc func updateFromDisplayLink(_: CADisplayLink) {     \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u044f\u043c \u0432\u0440\u0435\u043c\u044f, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434\u0443     guard lastNotificationTime != .zero else {         lastNotificationTime = CFAbsoluteTimeGetCurrent()         return     }     \/\/ \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430     numberOfFrames += 1     \/\/ \u0412\u044b\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0440\u043c\u0435\u043d\u0438, \u043f\u0440\u043e\u0441\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043e\u0431\u043d\u0443\u043b\u0435\u043d\u0438\u044f \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043a\u0430\u0434\u0440\u043e\u0432     let currentTime = CFAbsoluteTimeGetCurrent()     let elapsedTime = currentTime - lastNotificationTime     \/\/ \u0415\u0441\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0435, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u0441     \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0434\u0440\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u0441\u0447\u0451\u0442\u0430     if elapsedTime >= Constants.notificationDelay {         notifyUpdateForElapsedTime(elapsedTime)         lastNotificationTime = 0.0         numberOfFrames = 0     } } <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>UIWindow<\/code>, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0432 Status Bar. \u0410 \u043a\u0430\u043a\u0438\u0435 \u0438\u0434\u0435\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443 \u0432\u0430\u0441?<\/p>\n<h4>\u041a\u0440\u0430\u0448<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/375\/eae\/4ea\/375eae4ead729064a0e3bdb83dc9da1c.png\" width=\"1600\" height=\"1263\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/375\/eae\/4ea\/375eae4ead729064a0e3bdb83dc9da1c.png\"\/><\/figure>\n<p>\u041a\u0440\u0430\u0448 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442 \u2014 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c fatalError \ud83d\ude42 \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u043e\u0433\u0438 \u043a\u0440\u0430\u0448\u0435\u0439, \u0443\u0445\u043e\u0434\u044f\u0442 \u043b\u0438 \u043a\u0440\u0430\u0448\u0438 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0423\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>\u0421 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0432\u0441\u0451.<\/p>\n<h4>\u0425-FEATURE-NAME<\/h4>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ec6\/96c\/319\/ec696c319382a78de52068fa22e76c6c.png\" width=\"1600\" height=\"1214\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ec6\/96c\/319\/ec696c319382a78de52068fa22e76c6c.png\"\/><\/figure>\n<p>\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0434\u0438\u043d\u0430\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0436\u0435 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u043c\u043e\u0433\u0443\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u044d\u043d\u0434\u043f\u043e\u0439\u043d\u0442. \u041a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0447\u0442\u043e-\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438, \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a \u0444\u0440\u043e\u043d\u0442 \u043d\u0430 \u044d\u0442\u043e \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442, \u043d\u0430\u0434\u043e \u0440\u0430\u0441\u043a\u0430\u0442\u0438\u0442\u044c. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u0438\u043d \u0431\u044d\u043a\u044d\u043d\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b, \u0440\u0430\u0441\u043a\u0430\u0442\u0438\u043b, \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u043e\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0438 \u0432\u0437\u044f\u043b \u0438 \u043f\u0435\u0440\u0435\u043a\u0430\u0442\u0438\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p>\u0420\u0435\u0448\u0438\u043b\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0431\u044d\u043a\u0435\u043d\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0445\u0438\u0434\u0435\u0440 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u2014 \u0425-FEATURE-NAME. \u042d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 \u0432\u0435\u0442\u043a\u0438 \u0438\u0437 \u0433\u0438\u0442\u0430 \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u00ab\u0432\u0435\u0442\u043a\u0443\u00bb, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0444\u0440\u043e\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0445\u0438\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0432 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e. \u041c\u0438\u0434\u043b \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u0442\u044c, \u043a\u0443\u0434\u0430 \u0435\u043c\u0443 \u043d\u0430\u0434\u043e \u0441\u0445\u043e\u0434\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u044d\u043d\u0434\u043f\u043e\u0439\u043d\u0442\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e0\/72f\/de7\/8e072fde7cb146d865ec145bb1c3894c.png\" width=\"1600\" height=\"1139\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8e0\/72f\/de7\/8e072fde7cb146d865ec145bb1c3894c.png\"\/><\/figure>\n<h4>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u044d\u043a\u0440\u0430\u043d\u0430<\/h4>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6e9\/4c2\/8f8\/6e94c28f85629df45c6c3a11961d6562.png\" width=\"1600\" height=\"1198\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6e9\/4c2\/8f8\/6e94c28f85629df45c6c3a11961d6562.png\"\/><\/figure>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e, \u043a\u0430\u043a \u0438 \u0443 \u0432\u0441\u0435\u0445, \u043d\u0430\u0448\u0438\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0435\u0440\u0441\u0442\u043a\u0438 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044d\u043a\u0440\u0430\u043d\u0430\u0445, \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0438\u043c\u0435\u0442\u044c \u043b\u0438\u0431\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432. \u0412 \u043e\u0431\u0449\u0435\u043c \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u0441\u0430\u043c\u0438 \u0437\u043d\u0430\u0435\u0442\u0435.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435? \u041f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0451\u043c \u0441\u0430\u043c\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u0443 \u043d\u0435\u0433\u043e \u0444\u0440\u0435\u0439\u043c <code>UIWindow<\/code>.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1be\/370\/24b\/1be37024bc3693e7360425b83cc8dab2.png\" width=\"1600\" height=\"1266\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1be\/370\/24b\/1be37024bc3693e7360425b83cc8dab2.png\"\/><\/figure>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0435: \u0437\u0434\u0435\u0441\u044c (\u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443) 12 iPhone, \u043f\u043e\u0442\u043e\u043c \u0432\u043e\u0441\u044c\u043c\u043e\u0439 \u0438 SE, \u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e iPhone 14 Pro.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e22\/b20\/156\/e22b201567ca0cd28f641b5f0f3d6ae7.png\" width=\"1600\" height=\"973\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e22\/b20\/156\/e22b201567ca0cd28f641b5f0f3d6ae7.png\"\/><\/figure>\n<p>\u041d\u043e \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0433\u043b\u0430\u0434\u043a\u043e \u2014 \u043c\u044b \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u0439\u043c\u0430\u043b\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u0438 \u0432\u044c\u044e\u0445\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0441\u0432\u043e\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u044b \u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u0448\u0438\u0440\u0438\u043d\u0443 \u044d\u043a\u0440\u0430\u043d\u0430, \u0430 \u0432\u044c\u044e\u0445\u0430 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b\u0430 \u0441\u0432\u043e\u044e \u0441\u0442\u0430\u0440\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443\u2026\u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0430\u0442\u044c \u0438 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u043d\u043e \u0434\u0443\u043c\u0430\u044e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b. <br \/>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0435\u0441\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u044d\u043a\u0440\u0430\u043d\u0430. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c \u0435\u0433\u043e \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443. \u0421 \u044d\u0442\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u043a\u0440\u0430\u043d\u0430<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>additionalSafeAreaInsets<\/code> \u0443 <code>rootViewController<\/code>  \u0432 0<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>setNeedsLayout()<\/code> \u0438 <code>layoutIfNeeded()<\/code> \u0443 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 <code>UIWindow<\/code> \u0438 \u0443 <code>UIView<\/code> \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>additionalSafeAreaInsets<\/code><\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c <code>additionalSafeAreaInsets<\/code> \u0443 \u0432\u0441\u0435\u0445 <code>UINavigationController<\/code><\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c layout \u0443 \u0432\u0441\u0435\u0445 view, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 <code>scrollView<\/code> \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b NavigationBar<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u2014\u00a0\u044d\u0442\u043e \u043f\u0440\u044f\u043c\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f (\u043b\u0438\u0431\u043e \u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0431\u043b\u043e\u043a \u043f\u043e\u043f\u043e\u0437\u0436\u0435). \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0443\u0436\u043d\u0430.<\/p>\n<h4>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0444\u0438\u0447\u0438<\/h4>\n<p>\u0418\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/737\/bc8\/da9\/737bc8da9afc39ff7645a0152abb3fd4.png\" width=\"1600\" height=\"1259\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/737\/bc8\/da9\/737bc8da9afc39ff7645a0152abb3fd4.png\"\/><\/figure>\n<p><strong>\u041f\u0435\u0440\u0432\u0430\u044f \u2014 \u0442\u0435\u0441\u0442\u044b webview. <\/strong>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c URL \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u043e\u043d \u043e\u0442\u043a\u0440\u043e\u0435\u0442 WebView. \u041d\u0435 \u0445\u043e\u0442\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u043a\u0430\u043a-\u0442\u043e \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441: \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 URL \u2014\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u0440\u043b \u0434\u043b\u044f webview \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435.<\/p>\n<p><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u043a\u0438<\/strong>. \u041e\u043d\u0430 \u043f\u043b\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043e\u0447\u0435\u0432\u0430\u043b\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e. \u0415\u0439, \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e, \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u041d\u0443 \u0435\u0441\u0442\u044c \u0438 \u0435\u0441\u0442\u044c \u2014\u00a0\u043f\u0443\u0441\u0442\u044c \u043b\u0435\u0436\u0438\u0442, \u043a\u0443\u0448\u0430\u0442\u044c \u043d\u0435 \u043f\u0440\u043e\u0441\u0438\u0442.\u00a0<\/p>\n<p><strong>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u044d\u0448\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/strong>. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0447\u0430\u0441\u0442\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0430 \u0434\u0438\u0437\u0430\u0439\u043d\u0430\u0445 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u0430 \u043f\u0435\u0440\u0435\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0438\u0445 \u043f\u043e\u0434 \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0443\u043c\u0435\u044e\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u0418 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0443\u0442 \u0435\u0451 \u0438\u0437 \u043a\u044d\u0448\u0430 \u0438 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442, \u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430-\u0442\u043e \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f.\u00a0<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0442\u0430\u043a\u0443\u044e \u0444\u0438\u0447\u0443, \u0447\u0442\u043e \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b \u0447\u0438\u0441\u0442\u0438\u043c \u043a\u044d\u0448\u0438 \u0443 SDWebImage \u0438 \u0443 Nuke, \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p><strong>\u0412\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/strong>. \u0427\u0430\u0441\u0442\u043e \u043d\u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u0441\u0442\u043e\u0438\u0442 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0431\u043e\u0440\u043a\u0430, \u0430 \u0442\u044b \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u0448\u044c, \u043a\u0430\u043a\u043e\u0439 \u043e\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u0438. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0448\u044c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u0438 \u0432\u0441\u044f \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0437\u0434\u0435\u0441\u044c. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 <code>Bundle.main<\/code>. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f<\/p>\n<h2>\u041a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e?<\/h2>\n<p>\u0412\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0434\u0451\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u0445\u0446\u0435\u043b\u0435\u0439. \u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0432 \u043a\u0432\u0430\u0440\u0442\u0430\u043b\u0435 \u0443 \u043d\u0430\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043e \u043d\u0430 80 \u0438 20: 20% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u2014 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, 80% \u2014 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u044b\u0435. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 20% \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8a4\/614\/618\/8a46146183764b36bc0776036c027439.png\" alt=\"\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0440\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u0438\u0437 Jira.\" title=\"\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0440\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u0438\u0437 Jira.\" width=\"1600\" height=\"420\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a4\/614\/618\/8a46146183764b36bc0776036c027439.png\"\/><\/p>\n<div><figcaption>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0440\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u0438\u0437 Jira.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0435 \u043e\u0431\u0440\u0435\u043c\u0435\u043d\u044f\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u0432 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0432 \u043f\u0440\u043e\u0434. \u0417\u0430\u0447\u0435\u043c, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438?<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/82d\/76c\/9d6\/82d76c9d6df217005bd13f7eb75e71c8.png\" width=\"1586\" height=\"852\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/82d\/76c\/9d6\/82d76c9d6df217005bd13f7eb75e71c8.png\"\/><\/figure>\n<p>\u0423 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0434\u0438\u0437\u0430\u0439\u043d \u0440\u0435\u0432\u044c\u044e (\u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e) \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0430\u043c \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0437\u0430\u0439\u043d \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0435\u0441\u0442\u044c \u2014 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442 \u0434\u0438\u0437\u0430\u0439\u043d \u043d\u0430 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c. \u041c\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0441\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0438\u0444\u043a\u043e\u0439.<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong>. \u041a\u0430\u0436\u0434\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u2014 QA \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0439\u0434\u0443\u0442, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u044f\u0442, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430\u0434\u043e \u0438 \u044d\u0442\u0438\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<blockquote>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435.<\/p>\n<\/blockquote>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u043f\u043e\u0434\u043d\u044f\u043b\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e iOS 14, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u043e\u0432\u044b\u043c API \u043e\u0442 Apple \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439. \u0418 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0451 \u043d\u0430\u0448\u0435 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 DiffableDataSource \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u043a\u0430\u043a \u044d\u0442\u043e \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 Apple.<\/p>\n<p>\u0418\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0430 UIWindow, \u0447\u0442\u043e\u0431\u044b \u0438\u0437 iPhone 14 Pro \u0441\u0434\u0435\u043b\u0430\u0442\u044c iPhone SE. \u0412\u0440\u044f\u0434 \u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u044d\u0442\u043e \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u043c \u043a\u043e\u0434\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/337\/e68\/215\/337e6821553dd80eaa3d8f24a8920f8d.png\" width=\"1600\" height=\"1486\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/337\/e68\/215\/337e6821553dd80eaa3d8f24a8920f8d.png\"\/><\/figure>\n<p>\u0418\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0440\u0430\u0448. \u0412 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u043c \u043a\u043e\u0434\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043a\u0440\u0430\u0448\u0438 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u043e\u0437\u0438\u0442\u044c.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u043e\u043d \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2014 \u0442\u0430\u043a\u0430\u044f \u043a\u043d\u043e\u043f\u043e\u0447\u043a\u0430 \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/61e\/8d7\/23b\/61e8d723b28396dfa1da94b076e65632.png\" width=\"1600\" height=\"1365\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/61e\/8d7\/23b\/61e8d723b28396dfa1da94b076e65632.png\"\/><\/figure>\n<p>\u0422\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0438 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e11\/7bc\/62d\/e117bc62da62b2930c2faafe05952828.png\" width=\"1600\" height=\"808\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e11\/7bc\/62d\/e117bc62da62b2930c2faafe05952828.png\"\/><\/figure>\n<p>\u0422\u0430\u043a\u0430\u044f \u0444\u0438\u0447\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u00ab\u0410 \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u043a\u0430\u043a \u044f \u043c\u043e\u0433\u0443 \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f?\u00bb<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u0432\u0430\u0440\u0442\u0430\u043b \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c \u043e\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u0430\u0434\u0430\u0447\u043a\u0438 \u0432 \u0431\u044d\u043a\u043b\u043e\u0433\u0435 \u043f\u043e \u044d\u0442\u043e\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/93d\/7a5\/eb0\/93d7a5eb05d8ea6c6f2aa8aad29a19a6.png\" width=\"1600\" height=\"779\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/93d\/7a5\/eb0\/93d7a5eb05d8ea6c6f2aa8aad29a19a6.png\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u044e\u0434\u0435\u0439 \u043d\u0430\u0434\u043e, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c? \u041d\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u2014 \u0412\u043b\u0430\u0434 \u2026. \u041e\u043d \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c SSL-Pinning \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b \u0431\u044d\u043a\u043b\u043e\u0433 \u0437\u0430\u0434\u0430\u0447, \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u043b \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u0432\u0430\u0440\u0442\u0430\u043b\u0435 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u0430\u043c\u043e \u0441\u0435\u0431\u044f \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6bb\/14e\/1f3\/6bb14e1f323c97d78786cd6d7ea7748f.png\" width=\"1430\" height=\"596\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6bb\/14e\/1f3\/6bb14e1f323c97d78786cd6d7ea7748f.png\"\/><\/figure>\n<h2>\u0418\u0442\u043e\u0433\u0438 \u043a\u0440\u0430\u0442\u043a\u043e<\/h2>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 Xcode \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439.<\/p>\n<p><strong>\u041c\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0438 \u0436\u0438\u0437\u043d\u044c \u043d\u0430\u0448\u0438\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c. <\/strong>\u041e\u043d\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0433\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0435\u0449\u0435\u0439 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u0438, \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c.<\/p>\n<p><strong>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u0435\u0431\u0430\u0433\u0433\u0438\u043d\u0433 \u0431\u0435\u0437 Xcode<\/strong>. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440, \u043a\u043e\u0433\u0434\u0430 \u0435\u043c\u0443 \u043b\u0435\u043d\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c Xcode.<\/p>\n<p><strong>\u0423 \u043d\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447<\/strong>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u044d\u043a\u0440\u0430\u043d\u0430. \u041d\u0430\u0448\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0433\u043e\u0442\u043e\u0432\u044b \u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0437\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043b\u044f \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u2014\u00a0\u0438\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u042f \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043b \u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0442\u0435\u043c\u0443 \u00ab\u0427\u0442\u043e \u0442\u0435\u0431\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0432 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/707\/72c\/46e\/70772c46e95aff0669990c98ebc4bd20.png\" width=\"1600\" height=\"674\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/707\/72c\/46e\/70772c46e95aff0669990c98ebc4bd20.png\"\/><\/figure>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0434\u0443\u044e\u0442.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0432 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e? <\/p>\n<p>P.S: <br \/>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <a href=\"https:\/\/youtu.be\/1HhcVIoQUYM?si=8jvteTP3368D1-l1\">\u0432\u0438\u0434\u0435\u043e\u0432\u0435\u0440\u0441\u0438\u044f<\/a> \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u0430, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0439 \u043d\u0430 Alfa Mobile Meetup  #2.<\/p>\n<details class=\"spoiler\">\n<summary>P.P.S \u043f\u0440\u043e \u043d\u043e\u0432\u043e\u0439 (\u0441 \u0433\u0438\u0444\u043a\u043e\u0439).<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u0448\u0435 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u043d\u0435 \u0441\u0442\u043e\u044f\u043b\u043e \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0438 \u0432 \u043d\u0451\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u043a\u0440\u0443\u0442\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0440\u0435\u0437\u0438\u043d\u043e\u0432\u0430\u044f \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0435\u0442\u0441\u044f too much. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0447\u0435\u0433\u043e-\u0442\u043e \u0442\u0438\u043f\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u043d\u0438\u0436\u0435 \u0438\u043b\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u044d\u043a\u0440\u0430\u043d\u0430, \u0442\u043e \u0434\u0430\u0439\u0442\u0435 \u0437\u043d\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c8a\/82d\/9dd\/c8a82d9dd3308cf09b9f22eae0193c0b.gif\" width=\"320\" height=\"692\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c8a\/82d\/9dd\/c8a82d9dd3308cf09b9f22eae0193c0b.gif\"\/><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<hr\/>\n<p>\u041f\u043e\u0434\u0431\u043e\u0440\u043a\u0443 \u0441\u0442\u0430\u0442\u0435\u0439 \u0438\u0437 \u0431\u043b\u043e\u0433\u0430, \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/alfa\/articles\/739568\/\">\u041a\u0430\u043a \u043a\u0430\u0442\u0438\u0442\u044c \u0444\u0438\u0447\u0438 \u0431\u0435\u0437 \u0440\u0435\u043b\u0438\u0437\u043e\u0432. \u0427\u0430\u0441\u0442\u044c 1: \u043f\u0440\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/alfa\/articles\/742932\/\">\u041a\u0430\u043a \u043a\u0430\u0442\u0438\u0442\u044c \u0444\u0438\u0447\u0438 \u0431\u0435\u0437 \u0440\u0435\u043b\u0438\u0437\u043e\u0432. \u0427\u0430\u0441\u0442\u044c 2: \u043f\u0440\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 Server Driven UI<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/alfa\/articles\/728322\/\">\u0425\u043e\u0447\u0443 \u0432 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443: \u043a \u0447\u0435\u043c\u0443 \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/alfa\/articles\/743368\/\">100 \u0434\u043d\u0435\u0439 \u0438\u0437 \u0436\u0438\u0437\u043d\u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0430: \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043e\u043d\u0431\u043e\u0440\u0434\u0438\u043d\u0433 \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/alfa\/articles\/750348\/\">\u0420\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e Swift Runtime \u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/alfa\/articles\/750844\/\">\u0411\u044b\u0442\u044c \u0438\u043b\u0438 \u043d\u0435 \u0431\u044b\u0442\u044c \u0442\u0438\u043c\u043b\u0438\u0434\u043e\u043c \u2013 \u0432\u043e\u0442 \u0432 \u0447\u0451\u043c \u0432\u043e\u043f\u0440\u043e\u0441<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b<a href=\"https:\/\/t.me\/alfadigital_jobs\"><u>\u00a0Alfa Digital<\/u><\/a>\u00a0\u2014 \u0442\u0430\u043c \u043c\u044b \u043f\u043e\u0441\u0442\u0438\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043e \u043c\u0438\u0442\u0430\u043f\u0430\u0445 \u0438 \u0441\u0442\u0430\u0436\u0438\u0440\u043e\u0432\u043a\u0430\u0445, \u0432\u0438\u0434\u0435\u043e \u0441 \u043c\u0438\u0442\u0430\u043f\u043e\u0432, \u043a\u0440\u0430\u0442\u043a\u0438\u0435 \u0432\u044b\u0436\u0438\u043c\u043a\u0438 \u0438\u0437 \u0441\u0442\u0430\u0442\u0435\u0439, \u0438\u043d\u043e\u0433\u0434\u0430 \u0448\u0443\u0442\u0438\u043c.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/763596\/\"> https:\/\/habr.com\/ru\/articles\/763596\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0427\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u044c\u0448\u0435?<\/h2>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0434\u0435\u0431\u0430\u0433 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u044b\u043b \u0434\u0430\u0432\u043d\u043e \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0442\u0430\u043c \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043a\u0440\u044b\u0442 #IF DEBUG\u2019\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0444\u0438\u0447\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0434\u043e\u0431\u0430\u0432\u043e\u043a\u00a0\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u0432\u0441\u0451 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0441 \u0448\u0435\u0441\u0442\u0435\u0440\u0451\u043d\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430\u0447\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u043c\u0435\u043d\u044f\u0442\u044c? \u0412\u0435\u0434\u044c \u0432\u0441\u0435 \u00ab\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u00bb.<\/p>\n<p>\u0428\u0443\u0442\u043a\u0430, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u0434\u043e \u0432\u0441\u0451 \u043c\u0435\u043d\u044f\u0442\u044c. \u0412\u0435\u0434\u044c \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u043b\u044f SSL-Pinning. \u0415\u0451 \u0441\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0441\u0442\u0430\u043b\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0410 \u0432\u0441\u0435 \u043f\u0440\u043e\u043a\u0441\u0438, \u043f\u043e \u0442\u0438\u043f\u0443 \u0421harlie \u0438\u043b\u0438 Proxyman \u043d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u2014 \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0438 \u043d\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<p>\u0410 \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u2014\u00a0\u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u0438 \u043a\u043b\u044e\u0447\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441? \u041b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u043d\u043e \u00ab\u043a\u0443\u0434\u0430 \u0435\u0433\u043e\u00bb? \u041f\u043e\u043b\u0435\u0437\u043b\u0438 \u043c\u044b \u0432 \u043d\u0430\u0448\u0435 \u0441\u0442\u0430\u0440\u043e\u0435 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e, \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0442\u0443\u0434\u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0435\u0449\u0451 \u0432\u0441\u0451 \u0434\u0435\u0431\u0430\u0433\u043e\u043c \u0437\u0430\u043a\u0440\u044b\u0442\u043e. \u041d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u00ab\u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438?\u00bb \u0413\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0445\u044d\u0448\u0442\u0435\u0433\u0443 #debugging-tool \u043d\u0430 GitHub. \u0417\u0434\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<p>\u041d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u043e.<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0430\u0436\u0434\u043e\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435<\/strong>. \u041a\u043e\u0434 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0447\u0443\u0436\u0430\u044f \u2014\u00a0\u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u00ab\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u00bb, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0445 \u0444\u043e\u0440\u043a\u0430\u0442\u044c<\/strong>. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u044b \u0442\u0435\u0440\u044f\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043c\u0435\u0440\u0436\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Objective-C<\/strong><em>,<\/em> \u0430 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 99% \u043d\u0430 Swift. \u0422\u0430\u0449\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043a\u0443\u0447\u0443 \u043a\u043e\u0434\u0430 Objective-C \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><\/figure>\n<p>\u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041d\u043e \u043a\u0430\u043a \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c?<\/p>\n<ul>\n<li>\n<p>\u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u043e\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u2014 \u0447\u0442\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u043f\u0440\u043e\u0434 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u0432\u0441\u0451 \u0434\u0435\u0431\u0430\u0433\u043e\u043c \u043d\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0448\u044c.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c \u0443\u0434\u043e\u0431\u043d\u043e, \u0438\u043d\u0430\u0447\u0435 \u0438\u043c \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0433 \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\">\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 YARCH, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c<\/figcaption><\/div>\n<\/figure>\n<h2>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c?<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432.\u00a0<\/p>\n<ul>\n<li>\n<p>\u0414\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043b\u0438\u043d\u043a\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u043b\u0435\u0439\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043c\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <code>#IF DEBUG<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0448\u0443 \u0434\u0438\u0437\u0430\u0439\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0438 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0441\u0432\u043e\u044e \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<p>\u0414\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c.\u00a0<\/p>\n<p><strong>\u041f\u0435\u0440\u0432\u043e\u0435 \u2014 \u044d\u0442\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0437\u0430\u0436\u0430\u0442\u0438\u0435<\/strong>. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0434\u0435\u0432\u0430\u0439\u0441\u0435, \u043c\u043e\u0436\u043d\u043e \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435.<\/p>\n<figure class=\"bordered\"><\/figure>\n<p><strong>\u0412\u0442\u043e\u0440\u043e\u0435 \u2014 \u043f\u043e\u0442\u0440\u044f\u0441\u0442\u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d.<\/strong><\/p>\n<figure class=\"\"><\/figure>\n<p><strong>\u0422\u0440\u0435\u0442\u044c\u0435 \u2014\u00a0\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435<\/strong> <strong>\u2014\u00a0\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448 Shift + &lt;\u2014.\u00a0<\/strong><\/p>\n<p>\u0423 <code>UIResponder<\/code> \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>keyCommands<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448 \u0438 \u044d\u043a\u0448\u0435\u043d.\u00a0<\/p>\n<pre><code class=\"swift\">override public var keyCommands: [UIKeyCommand]? { \u00a0\u00a0\u00a0\u00a0let debugMenuCommand = UIKeyCommand( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0input: UIKeyCommand.inputLeftArrow, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0modifierFlags: .shift, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0action: #selector(handleGestureRecognizer) \u00a0\u00a0\u00a0\u00a0) \u00a0\u00a0\u00a0\u00a0return [debugMenuCommand] }<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043c\u044b \u043d\u0430 \u044d\u0442\u043e\u0442 \u044d\u043a\u0448\u0435\u043d \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e.\u00a0<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u043b\u0438 \u2014 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f.\u00a0<\/p>\n<h2>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u00a0<\/h2>\n<h4>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c<\/h4>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e.\u00a0<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p>\u0423 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0435\u0441\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0432 Postman, \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0436\u0435 \u043f\u0440\u0438\u0448\u0435\u043b \u0441\u044e\u0434\u0430 \u00ab\u043a\u043d\u043e\u043f\u043a\u0438 \u043a\u0440\u0430\u0441\u0438\u0442\u044c\u00bb, \u0430 \u043d\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 Postman \u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u0435\u0440\u043d\u043e? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043f\u0438\u0448\u0435\u0442 \u0442\u0435\u0441\u0442\u0435\u0440\u0443, \u0430 \u0442\u043e\u0442 \u2014 \u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u043e \u2014 \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u0442, \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043e\u0442\u0432\u0435\u0442\u0438\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438 \u0442\u0435\u043f\u0435\u0440\u044c\u00a0\u0432\u0441\u0435 \u044d\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u2014 \u0432\u043e\u0442 \u0432\u0430\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0432\u043e\u0442 \u0432\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 UI, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e, \u043d\u0430\u0436\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0432\u0441\u0451.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u0432 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0437\u043e\u043d\u0443, \u0432 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u043e\u0439 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e).<\/p>\n<figure class=\"full-width\"><\/figure>\n<h4>Feature toggles<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 feature toggles.\u00a0<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f feature toggles \u0443 \u043d\u0430\u0441 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0420\u0430\u043d\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c feature toggle, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f feature \u0444\u043b\u0430\u0433\u043e\u0432, \u0438 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u043d\u0443\u0436\u043d\u0430. \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 UI, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 feature toggles. \u041e\u043d \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043b\u044e\u0431\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430. \u0422\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c feature toggle, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0439\u0442\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0412\u0441\u0451, \u043e\u043d \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0438\u0442, \u043a\u0430\u043a \u044d\u043a\u0440\u0430\u043d \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f.<\/p>\n<figure class=\"float bordered full-width\"><\/figure>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0437\u0430 \u0441\u0447\u0451\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043a\u0443\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f feature toggles \u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.<\/p>\n<figure class=\"full-width\"><\/figure>\n<h4>\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/h4>\n<figure class=\"full-width\"><\/figure>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, Apple \u043d\u0435 \u0434\u0430\u0451\u0442 API \u043a \u0441\u0432\u043e\u0435\u043c\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0443, \u0430 \u043b\u043e\u0433\u0438 \u043d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043a\u043b\u0438\u043a\u0431\u0435\u0439\u0442\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 \u0438 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u0435\u0432\u0430\u0439\u0441\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Proxyman \u0434\u043b\u044f iOS. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c VPN \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0435\u0431\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 VPN, \u0430 Proxyman \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442. \u041d\u043e \u0442\u0430\u043a \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043f\u0440\u043e\u0434\u0430, \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u0438\u0437-\u0437\u0430 SSL Pinning.\u00a0<\/p>\n<p>\u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0434\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0430\u0436\u0435 \u0441 \u043f\u0440\u043e\u0434\u0430, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f SSL Pinning, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430, \u0437\u0430\u0439\u0442\u0438 \u0432 \u043f\u0440\u043e\u0434. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u0442\u0430\u043a\u043e\u0439 \u0434\u0435\u0431\u0430\u0436\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0435\u0442\u0435\u0441\u044c \u0432 \u043f\u0440\u043e\u0434, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e: \u0437\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u043d\u043e \u0432\u0441\u0435 \u0445\u0435\u0434\u0435\u0440\u044b, \u0443\u0440\u043b\u044b, \u0431\u043e\u0434\u0438.\u00a0<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0423 \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0430\u043d\u0430\u043b\u043e\u0433 Cmd+F, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c, \u043a\u0430\u043a \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c curl&#8217;\u043e\u043c, \u0442\u0430\u043a \u0438 \u0432\u0441\u0435\u043c \u043b\u043e\u0433\u043e\u043c. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438 \u0447\u0430\u0441\u0442\u043e \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0434\u0435\u0432\u0430\u0439\u0441\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0443\u0442 \u0438 \u0432 Telegram \u0441\u043a\u0438\u0434\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043b\u043e\u0433, \u0430 \u043e\u043d \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Alamofire. \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u0441\u0435\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 EventMonitor, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f Alamofire.<\/p>\n<p>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u2014\u00a0<a href=\"https:\/\/github.com\/Alamofire\/Alamofire\/blob\/master\/Documentation\/AdvancedUsage.md#adding-eventmonitors\"><u>AdvancedUsage.md<\/u><\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430.<\/p>\n<pre><code class=\"swift\">public func request(_ request: DataRequest, didParseResponse response: DataResponse&lt;Data?, AFError>)<\/code><\/pre>\n<p>\u0412 \u0442\u0435\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b EventMonitor, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043e\u0431\u044a\u0435\u043a\u0442 <code>Session<\/code> \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"swift\">public convenience init(configuration: URLSessionConfiguration = URLSessionConfiguration.af.default,                         delegate: SessionDelegate = SessionDelegate(),                         rootQueue: DispatchQueue = DispatchQueue(label: \"org.alamofire.session.rootQueue\"),                         startRequestsImmediately: Bool = true,                         requestQueue: DispatchQueue? = nil,                         serializationQueue: DispatchQueue? = nil,                         interceptor: RequestInterceptor? = nil,                         serverTrustManager: ServerTrustManager? = nil,                         redirectHandler: RedirectHandler? = nil,                         cachedResponseHandler: CachedResponseHandler? = nil,                         eventMonitors: [EventMonitor] = []) \/\/ &lt;- \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448 EventMonitor \u0432 \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043b\u043e\u0433\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 UI, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043b\u043e\u0433\u043e\u0432.\u00a0<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0438\u0441\u043a \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u043b\u043e\u0433\u0443. \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u043a \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0447\u0430\u0441\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0435\u0451 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>UITextView<\/code>. \u0414\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u043e\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 <code>NSRange<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439.\u00a0<\/p>\n<pre><code class=\"swift\">guard let regex = try? NSRegularExpression(pattern: searchText, options: [.ignoreMetacharacters, .caseInsensitive]) else {     return nil } let ranges = regex.matches(in: textForHighlight.string, range: .init(location: .zero, length: textForHighlight.length))     .map { $0.range }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 <code>NSRange<\/code> \u043d\u0430\u0434\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u043e\u043c. \u042d\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c <code>NSMutableAttributedString<\/code> \u043f\u0443\u0442\u0451\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043a \u0441\u0442\u0440\u043e\u043a\u0435.<\/p>\n<pre><code class=\"swift\">ranges.forEach { textForHighlight.addAttribute(.backgroundColor, value: UIColor.orange, range: $0) }<\/code><\/pre>\n<p>\u0410 \u0434\u043b\u044f \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043a \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>scrollToVisible(_ range: NSRange)<\/code> \u0443 <code>UITextView.<\/code><\/p>\n<pre><code class=\"swift\">textView.scrollRangeToVisible(range)<\/code><\/pre>\n<h4>SSL-Pinning<\/h4>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441 \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u044d\u0440\u0430 \u0434\u0435\u0431\u0430\u0433 \u043c\u0435\u043d\u044e.\u00a0<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u043c\u0435\u043d\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c SSL-\u043f\u0438\u043d\u043d\u0438\u043d\u0433. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0444\u0438\u0447\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0446\u0435\u043b\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u2014 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<h4>\u0410\u0411 \u043b\u043e\u0433\u0438<\/h4>\n<figure class=\"full-width\"><\/figure>\n<p>\u042d\u0442\u043e \u043d\u0430\u0448\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043b\u043e\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u043e\u0433\u0438\u0440\u0443\u044e\u0442 \u0432\u0441\u044f\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043a\u043e\u0434\u0435, \u0431\u0443\u0434\u044c \u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430, \u0438\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0438.\u00a0<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0410\u0411 \u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442, \u0434\u0430\u0436\u0435<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-355918","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/355918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=355918"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/355918\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=355918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=355918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=355918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}