{"id":6099,"date":"2026-07-19T00:47:25","date_gmt":"2026-07-18T21:17:25","guid":{"rendered":"https:\/\/notes.yummybrands.studio\/?p=6099"},"modified":"2026-07-23T02:05:18","modified_gmt":"2026-07-22T22:35:18","slug":"%d8%b3%d8%a7%d8%ae%d8%aa-%d8%a7%d9%be%d9%84%db%8c%da%a9%db%8c%d8%b4%d9%86-%d8%a7%d9%86%d8%af%d8%b1%d9%88%d8%a6%db%8c%d8%af-%d8%b3%d9%88%d9%85","status":"publish","type":"post","link":"https:\/\/notes.yummybrands.studio\/?p=6099","title":{"rendered":"\u0633\u0627\u062e\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u0646\u062f\u0631\u0648\u0626\u06cc\u062f (\u0633\u0648\u0645)"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">\u0628\u062e\u0634 \u0634\u0634\u0645 \u2014 \u0627\u0631\u062a\u0628\u0627\u0637 \u0644\u062d\u0638\u0647\u200c\u0627\u06cc<\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u0686\u0647\u0644\u200c\u0648\u0686\u0647\u0627\u0631\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">WebSocket<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b WebSocket \u0686\u0631\u0627 \u0628\u0647 \u0648\u062c\u0648\u062f \u0627\u0648\u0645\u062f\u061f<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-11-1024x683.avif\" alt=\"\" class=\"wp-image-6142\" srcset=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-11-1024x683.avif 1024w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-11-300x200.avif 300w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-11-768x512.avif 768w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-11.avif 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0635\u0641\u062d\u0647 \u0642\u06cc\u0645\u062a \u06cc\u06a9 \u06af\u0648\u0634\u06cc \u0631\u0648 \u0628\u0627\u0632 \u06a9\u0631\u062f\u06cc. \u062d\u0627\u0644\u0627 \u0642\u06cc\u0645\u062a \u0627\u0648\u0646 \u06af\u0648\u0634\u06cc \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0633\u0624\u0627\u0644 \u0627\u06cc\u0646\u062c\u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0632 \u06a9\u062c\u0627 \u0628\u0627\u06cc\u062f \u0628\u0641\u0647\u0645\u0647 \u0627\u06cc\u0646 \u0627\u062a\u0641\u0627\u0642 \u0627\u0641\u062a\u0627\u062f\u0647\u061f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0648\u0644\u06cc\u0646 \u0631\u0627\u0647\u200c\u062d\u0644\u06cc \u06a9\u0647 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u0647 \u0630\u0647\u0646 \u0645\u06cc\u200c\u0631\u0633\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0631 \u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u06cc\u06a9 \u0628\u0627\u0631 \u0627\u0632 \u0633\u0631\u0648\u0631 \u0628\u067e\u0631\u0633\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00ab\u0642\u06cc\u0645\u062a \u0639\u0648\u0636 \u0634\u062f\u0647\u061f\u00bb<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0631 \u062c\u0648\u0627\u0628 \u0645\u0646\u0641\u06cc \u0628\u0648\u062f\u060c \u067e\u0646\u062c \u062b\u0627\u0646\u06cc\u0647 \u0628\u0639\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0647\u0645\u06cc\u0646 \u0633\u0624\u0627\u0644 \u0631\u0648 \u0628\u067e\u0631\u0633\u0647. \u0628\u0647 \u0627\u06cc\u0646 \u0631\u0648\u0634 <strong>Polling<\/strong> \u0645\u06cc\u06af\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u0634\u06a9\u0644 Polling \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0647\u06cc\u0686 \u0646\u062a\u06cc\u062c\u0647\u200c\u0627\u06cc \u0646\u062f\u0627\u0631\u0646. \u0641\u0631\u0636 \u06a9\u0646 \u0642\u06cc\u0645\u062a \u06cc\u06a9 \u06a9\u0627\u0644\u0627 \u0641\u0642\u0637 \u0631\u0648\u0632\u06cc \u062f\u0648 \u0628\u0627\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0631 \u067e\u0646\u062c \u062b\u0627\u0646\u06cc\u0647 \u06cc\u06a9 \u0628\u0627\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647. \u06cc\u0639\u0646\u06cc \u062f\u0631 \u0637\u0648\u0644 \u06cc\u06a9 \u0631\u0648\u0632\u060c \u0647\u0632\u0627\u0631\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0634\u0646\u06cc\u062f\u0646 \u06cc\u06a9 \u062c\u0648\u0627\u0628 \u0633\u0627\u062f\u0647 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u0634\u0646:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00ab\u0646\u0647\u060c \u0647\u0646\u0648\u0632 \u0647\u06cc\u0686 \u062a\u063a\u06cc\u06cc\u0631\u06cc \u0646\u06a9\u0631\u062f\u0647.\u00bb<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0647\u0645 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0645\u0635\u0631\u0641 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0647\u0645 \u0633\u0631\u0648\u0631 \u0631\u0648 \u0628\u06cc\u0647\u0648\u062f\u0647 \u062f\u0631\u06af\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0647\u0645 \u0628\u0627\u062a\u0631\u06cc \u06af\u0648\u0634\u06cc \u0631\u0648 \u0628\u06cc\u0634\u062a\u0631 \u0645\u0635\u0631\u0641 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0628\u0631\u0627\u06cc \u062d\u0644 \u0647\u0645\u06cc\u0646 \u0645\u0634\u06a9\u0644\u060c WebSocket \u0628\u0647 \u0648\u062c\u0648\u062f \u0627\u0648\u0645\u062f.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">WebSocket \u062f\u0642\u06cc\u0642\u0627\u064b \u0686\u06cc\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WebSocket \u06cc\u06a9 \u0631\u0648\u0634 \u0627\u0631\u062a\u0628\u0627\u0637\u06cc\u0647 \u06a9\u0647 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u062f\u0647 <strong>\u06cc\u06a9 \u0627\u0631\u062a\u0628\u0627\u0637 \u062f\u0627\u0626\u0645\u06cc<\/strong> \u0628\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u0628\u0645\u0648\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u0631\u062a\u0628\u0627\u0637\u200c\u0647\u0627\u06cc \u0645\u0639\u0645\u0648\u0644\u06cc HTTP\u060c \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06cc\u06a9 \u0686\u0631\u062e\u0647 \u06a9\u0627\u0645\u0644 \u062f\u0627\u0631\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647\u060c \u0633\u0631\u0648\u0631 \u062c\u0648\u0627\u0628 \u0645\u06cc\u062f\u0647 \u0648 \u0627\u0631\u062a\u0628\u0627\u0637 \u062a\u0645\u0648\u0645 \u0645\u06cc\u0634\u0647. \u0627\u06af\u0631 \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u062e\u0648\u0627\u06cc\u060c \u0628\u0627\u06cc\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u06cc\u06a9 \u0627\u0631\u062a\u0628\u0627\u0637 \u062c\u062f\u06cc\u062f \u0633\u0627\u062e\u062a\u0647 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u062f\u0631 WebSocket \u062f\u0627\u0633\u062a\u0627\u0646 \u0641\u0631\u0642 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0642\u0637 \u06cc\u06a9 \u0628\u0627\u0631 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0648\u0635\u0644 \u0645\u06cc\u0634\u0647 \u0648 \u0627\u06cc\u0646 \u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0632 \u0645\u06cc\u200c\u0645\u0648\u0646\u0647. \u0627\u0632 \u0627\u0648\u0646 \u0644\u062d\u0638\u0647 \u0628\u0647 \u0628\u0639\u062f\u060c \u0647\u0631 \u06a9\u062f\u0648\u0645 \u0627\u0632 \u062f\u0648 \u0637\u0631\u0641 \u0647\u0631 \u0648\u0642\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0647\u0645\u0648\u0646 \u0644\u062d\u0638\u0647 \u0628\u0631\u0627\u06cc \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0627\u0631\u0633\u0627\u0644\u0634 \u06a9\u0646\u0646\u060c \u0628\u062f\u0648\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u062a\u0635\u0627\u0644 \u062c\u062f\u06cc\u062f\u06cc \u0633\u0627\u062e\u062a\u0647 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647 \u0647\u0645\u06cc\u0646 \u062e\u0627\u0637\u0631 \u0628\u0647 WebSocket \u0645\u06cc\u06af\u0646 \u06cc\u06a9 \u0627\u0631\u062a\u0628\u0627\u0637 <strong>\u062f\u0648\u0637\u0631\u0641\u0647 \u0648 \u062f\u0627\u0626\u0645\u06cc<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0641\u0627\u0648\u062a HTTP \u0648 WebSocket<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u062f\u0648 \u0646\u0641\u0631 \u0628\u0627 \u0647\u0645 \u0646\u0627\u0645\u0647\u200c\u0646\u06af\u0627\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 HTTP \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06cc\u06a9\u06cc \u0627\u0632 \u0627\u0648\u0646\u200c\u0647\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u062f \u0686\u06cc\u0632\u06cc \u0628\u06af\u0647\u060c \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u0646\u0627\u0645\u0647 \u062c\u062f\u06cc\u062f \u0628\u0646\u0648\u06cc\u0633\u0647\u060c \u0627\u0631\u0633\u0627\u0644\u0634 \u06a9\u0646\u0647\u060c \u0645\u0646\u062a\u0638\u0631 \u062c\u0648\u0627\u0628 \u0628\u0645\u0648\u0646\u0647 \u0648 \u0628\u0639\u062f \u0627\u0631\u062a\u0628\u0627\u0637 \u062a\u0645\u0648\u0645 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 WebSocket \u0628\u06cc\u0634\u062a\u0631 \u0634\u0628\u06cc\u0647 \u06cc\u06a9 \u062a\u0645\u0627\u0633 \u062a\u0644\u0641\u0646\u06cc\u0647. \u062a\u0645\u0627\u0633 \u0641\u0642\u0637 \u06cc\u06a9 \u0628\u0627\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u0634\u0647 \u0648 \u0628\u0639\u062f \u0647\u0631 \u062f\u0648 \u0646\u0641\u0631 \u0647\u0631 \u0632\u0645\u0627\u0646 \u0628\u062e\u0648\u0627\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0635\u062d\u0628\u062a \u06a9\u0646\u0646. \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u0628\u0631\u0627\u06cc \u0647\u0631 \u062c\u0645\u0644\u0647 \u062f\u0648\u0628\u0627\u0631\u0647 \u062a\u0645\u0627\u0633 \u062c\u062f\u06cc\u062f\u06cc \u0628\u0631\u0642\u0631\u0627\u0631 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u06cc\u0646 \u062a\u0641\u0627\u0648\u062a \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 WebSocket \u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u06a9\u0647 \u062f\u0627\u0626\u0645\u0627\u064b \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646\u060c \u062e\u06cc\u0644\u06cc \u0633\u0631\u06cc\u0639\u200c\u062a\u0631 \u0648 \u0628\u0647\u06cc\u0646\u0647\u200c\u062a\u0631 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">WebSocket \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u0628\u0647 \u062f\u0631\u062f \u0645\u06cc\u200c\u062e\u0648\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WebSocket \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc <strong>Real-time<\/strong> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647\u061b \u06cc\u0639\u0646\u06cc \u062c\u0627\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0627\u06cc\u062f \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0647\u0645\u0627\u0646 \u0644\u062d\u0638\u0647 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0631\u0633\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062b\u0644\u0627\u064b:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u067e\u06cc\u0627\u0645\u200c\u0631\u0633\u0627\u0646\u200c\u0647\u0627<\/li>\n\n\n\n<li>\u0628\u0627\u0632\u06cc\u200c\u0647\u0627\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646<\/li>\n\n\n\n<li>\u0633\u0627\u0645\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0645\u0639\u0627\u0645\u0644\u0627\u062a\u06cc \u0628\u0648\u0631\u0633<\/li>\n\n\n\n<li>\u0642\u06cc\u0645\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0627\u0631\u0632 \u0648 \u0637\u0644\u0627<\/li>\n\n\n\n<li>\u062f\u0627\u0634\u0628\u0648\u0631\u062f\u0647\u0627\u06cc \u0645\u0627\u0646\u06cc\u062a\u0648\u0631\u06cc\u0646\u06af<\/li>\n\n\n\n<li>\u0648\u06cc\u0631\u0627\u06cc\u0634 \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u0633\u0646\u0627\u062f<\/li>\n\n\n\n<li>\u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u0686\u062a \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u062c\u0647 \u0645\u0634\u062a\u0631\u06a9 \u0647\u0645\u0647 \u0627\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0645\u0646\u062a\u0638\u0631 \u0646\u0645\u06cc\u200c\u0645\u0648\u0646\u0646 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062c\u062f\u06cc\u062f \u0628\u0641\u0631\u0633\u062a\u0647\u061b \u062e\u0648\u062f \u0633\u0631\u0648\u0631 \u0647\u0631 \u0632\u0645\u0627\u0646 \u0627\u062a\u0641\u0627\u0642\u06cc \u0628\u06cc\u0641\u062a\u0647\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0648 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0647 WebSocket \u0627\u062d\u062a\u06cc\u0627\u062c \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0628\u06cc\u0634\u062a\u0631 \u062d\u0627\u0644\u062a\u200c\u0647\u0627\u060c <strong>\u0646\u0647<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0634\u0627\u06cc\u062f \u062f\u0631 \u0646\u06af\u0627\u0647 \u0627\u0648\u0644 \u0641\u06a9\u0631 \u06a9\u0646\u06cc \u0686\u0648\u0646 \u0642\u06cc\u0645\u062a \u06a9\u0627\u0644\u0627\u0647\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646\u060c \u067e\u0633 \u062d\u062a\u0645\u0627\u064b \u0628\u0627\u06cc\u062f \u0627\u0632 WebSocket \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. \u0627\u0645\u0627 \u0627\u06af\u0631 \u06a9\u0645\u06cc \u062f\u0642\u06cc\u0642\u200c\u062a\u0631 \u0646\u06af\u0627\u0647 \u06a9\u0646\u06cc\u0645\u060c \u0645\u06cc\u200c\u0628\u06cc\u0646\u06cc\u0645 \u0686\u0646\u06cc\u0646 \u06a9\u0627\u0631\u06cc \u0627\u0635\u0644\u0627\u064b \u0645\u0646\u0637\u0642\u06cc \u0646\u06cc\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u0635\u062f \u0647\u0632\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0647\u0645\u0632\u0645\u0627\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0631\u0648 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0646. \u0627\u06af\u0631 \u0628\u0631\u0627\u06cc \u0647\u0631 \u06a9\u0627\u0631\u0628\u0631 \u06cc\u06a9 WebSocket \u062f\u0627\u0626\u0645\u0627\u064b \u0628\u0627\u0632 \u0646\u06af\u0647 \u062f\u0627\u0631\u06cc\u0645\u060c \u06cc\u0639\u0646\u06cc \u0635\u062f \u0647\u0632\u0627\u0631 \u0627\u062a\u0635\u0627\u0644 \u062f\u0627\u0626\u0645\u06cc \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647\u061b \u062d\u062a\u06cc \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0641\u0642\u0637 \u06af\u0648\u0634\u06cc \u0631\u0648 \u062f\u0627\u062e\u0644 \u062c\u06cc\u0628\u0634 \u06af\u0630\u0627\u0634\u062a\u0647 \u0648 \u0627\u0635\u0644\u0627\u064b \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0628\u0627\u0632 \u0646\u06a9\u0631\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u0645\u062b\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u060c \u0631\u0627\u0647\u200c\u062d\u0644 \u0628\u0647\u062a\u0631 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0648\u0642\u062a\u06cc \u0642\u06cc\u0645\u062a \u0645\u0647\u0645\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0631\u062f\u060c \u0633\u0631\u0648\u0631 \u0641\u0642\u0637 \u0627\u0632 \u0637\u0631\u06cc\u0642 <strong>Firebase Cloud Messaging (FCM)<\/strong> \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0628\u0641\u0631\u0633\u062a\u0647. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0647\u0645 \u0645\u0635\u0631\u0641 \u0628\u0627\u062a\u0631\u06cc \u06a9\u0645\u062a\u0631\u06cc \u062f\u0627\u0631\u0647\u060c \u0647\u0645 \u0645\u0646\u0627\u0628\u0639 \u0633\u0631\u0648\u0631 \u0631\u0648 \u06a9\u0645\u062a\u0631 \u062f\u0631\u06af\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0647\u0645 \u062f\u0642\u06cc\u0642\u0627\u064b \u0628\u0631\u0627\u06cc \u0686\u0646\u06cc\u0646 \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc\u06cc \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0644\u0628\u062a\u0647 \u0627\u06af\u0631 \u0631\u0648\u0632\u06cc \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u062e\u0648\u0627\u06cc \u06cc\u06a9 \u0635\u0641\u062d\u0647 \u00ab\u0642\u06cc\u0645\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0627\u0631\u0632\u00bb \u06cc\u0627 \u00ab\u062d\u0631\u0627\u062c \u0632\u0646\u062f\u0647\u00bb \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc \u06a9\u0647 \u0647\u0631 \u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0622\u0646 \u0648\u0642\u062a WebSocket \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u0646\u0627\u0633\u0628\u06cc \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0631\u062a\u0628\u0627\u0637 WebSocket \u0686\u0637\u0648\u0631\u06cc \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u0634\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u062e\u0644\u0627\u0641 HTTP \u06a9\u0647 \u0628\u0627 <code>http:\/\/<\/code> \u06cc\u0627 <code>https:\/\/<\/code> \u0634\u0631\u0648\u0639 \u0645\u06cc\u0634\u0647\u060c WebSocket \u0627\u0632 \u067e\u0631\u0648\u062a\u06a9\u0644\u200c\u0647\u0627\u06cc \u062e\u0648\u062f\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ws:\/\/example.com\/socket\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0631 \u0627\u0631\u062a\u0628\u0627\u0637 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u0627\u0632 <code>wss:\/\/<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wss:\/\/example.com\/socket\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0622\u062f\u0631\u0633 \u0648\u0635\u0644 \u0645\u06cc\u0634\u0647\u060c \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a HTTP \u0645\u062e\u0635\u0648\u0635 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u0634\u0647. \u0627\u06af\u0631 \u0633\u0631\u0648\u0631 \u0647\u0645 WebSocket \u0631\u0648 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u06a9\u0646\u0647\u060c \u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u0632 HTTP \u0628\u0647 WebSocket \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u0634\u0647 \u0648 \u0627\u0632 \u0627\u0648\u0646 \u0644\u062d\u0638\u0647 \u0628\u0647 \u0628\u0639\u062f\u060c \u0647\u0631 \u062f\u0648 \u0637\u0631\u0641 \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0647\u0631 \u0632\u0645\u0627\u0646 \u062e\u0648\u0627\u0633\u062a\u0646 \u062f\u0627\u062f\u0647 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u0646.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0631\u062a\u0628\u0627\u0637 WebSocket \u0647\u0645\u06cc\u0634\u0647 \u0628\u0627\u0632 \u0645\u06cc\u200c\u0645\u0648\u0646\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06cc\u06a9\u06cc \u0627\u0632 \u062f\u0648 \u0637\u0631\u0641 \u0627\u0631\u062a\u0628\u0627\u0637 \u0631\u0648 \u0646\u0628\u0646\u062f\u0647 \u06cc\u0627 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0646\u0634\u0647\u060c \u0628\u0644\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0644\u0628\u062a\u0647 \u0627\u06cc\u0646 \u0628\u0647 \u0645\u0639\u0646\u06cc \u0646\u06cc\u0633\u062a \u06a9\u0647 \u0647\u0645\u06cc\u0634\u0647 \u062f\u0627\u062f\u0647 \u0631\u062f\u0648\u0628\u062f\u0644 \u0645\u06cc\u0634\u0647. \u0645\u0645\u06a9\u0646\u0647 \u0686\u0646\u062f \u062f\u0642\u06cc\u0642\u0647 \u0647\u06cc\u0686 \u067e\u06cc\u0627\u0645\u06cc \u0627\u0631\u0633\u0627\u0644 \u0646\u0634\u0647\u060c \u0627\u0645\u0627 \u0627\u062a\u0635\u0627\u0644 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0631\u0642\u0631\u0627\u0631 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u062e\u06cc\u0644\u06cc \u0627\u0632 \u0633\u0631\u0648\u0631\u0647\u0627 \u0647\u0631 \u0686\u0646\u062f \u0648\u0642\u062a \u06cc\u06a9 \u0628\u0627\u0631 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9\u06cc \u0628\u0647 \u0627\u0633\u0645 <strong>Ping<\/strong> \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u0646 \u062a\u0627 \u0645\u0637\u0645\u0626\u0646 \u0628\u0634\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0647\u0646\u0648\u0632 \u0628\u0631\u0642\u0631\u0627\u0631 \u0627\u0633\u062a. \u0627\u06af\u0631 \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u062c\u0648\u0627\u0628 <strong>Pong<\/strong> \u0646\u062f\u0647\u060c \u0633\u0631\u0648\u0631 \u0645\u062a\u0648\u062c\u0647 \u0645\u06cc\u0634\u0647 \u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062f\u0647 \u0648 \u0627\u0648\u0646 \u0631\u0648 \u0645\u06cc\u200c\u0628\u0646\u062f\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 \u0633\u0627\u062f\u0647 \u0627\u0632 \u0627\u062a\u0635\u0627\u0644 WebSocket<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 <strong>OkHttp<\/strong> \u0628\u0631\u0627\u06cc WebSocket \u0647\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 Client \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val client = OkHttpClient()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> client <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">OkHttpClient<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u062a\u0635\u0627\u0644 \u0631\u0648 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val request = Request.Builder()\n    .url(\"wss:\/\/example.com\/socket\")\n    .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> request <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> Request.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    .<\/span><span style=\"color: #6F42C1\">url<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;wss:\/\/example.com\/socket&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>client.newWebSocket(\n    request,\n    socketListener\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">client.<\/span><span style=\"color: #6F42C1\">newWebSocket<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    request,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    socketListener<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0632 \u0627\u06cc\u0646 \u0644\u062d\u0638\u0647 \u0628\u0647 \u0628\u0639\u062f\u060c \u0647\u0631 \u0632\u0645\u0627\u0646 \u0633\u0631\u0648\u0631 \u067e\u06cc\u0627\u0645\u06cc \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u0647\u060c Listener \u0627\u0648\u0646 \u067e\u06cc\u0627\u0645 \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0642\u062a \u06a9\u0646 \u06a9\u0647 \u0647\u062f\u0641 \u0627\u06cc\u0646 \u062f\u0631\u0633 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u0646 \u0645\u0641\u0647\u0648\u0645 WebSocket\u0640\u0647\u060c \u0646\u0647 \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0627\u0645\u0644 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc. \u062f\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u062a\u0635\u0627\u0644\u060c Reconnect\u060c \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u062e\u0637\u0627\u0647\u0627 \u0647\u0645 \u0628\u0647 \u0627\u06cc\u0646 \u0633\u0627\u062e\u062a\u0627\u0631 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u0634\u0646.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u06af\u0631 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0628\u0634\u0647 \u0686\u06cc\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u062a\u0641\u0627\u0648\u062a\u200c\u0647\u0627\u06cc WebSocket \u0628\u0627 HTTP \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0627\u062a\u0635\u0627\u0644 \u062f\u0627\u0626\u0645\u06cc\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06af\u0631 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0628\u0634\u0647\u060c \u0627\u0631\u062a\u0628\u0627\u0637 \u0647\u0645 \u0627\u0632 \u0628\u06cc\u0646 \u0645\u06cc\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0645\u062a\u0648\u062c\u0647 \u0642\u0637\u0639 \u0634\u062f\u0646 \u0627\u062a\u0635\u0627\u0644 \u0628\u0634\u0647 \u0648 \u0647\u0631 \u0632\u0645\u0627\u0646 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0631\u0642\u0631\u0627\u0631 \u0634\u062f\u060c \u0627\u062a\u0635\u0627\u0644 \u062c\u062f\u06cc\u062f\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0647. \u0627\u06cc\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f \u0631\u0648 \u0645\u0639\u0645\u0648\u0644\u0627\u064b <strong>Reconnect<\/strong> \u0645\u06cc\u06af\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0644\u0628\u062a\u0647 \u0646\u0628\u0627\u06cc\u062f \u0628\u0644\u0627\u0641\u0627\u0635\u0644\u0647 \u0648 \u067e\u0634\u062a \u0633\u0631 \u0647\u0645 \u062a\u0644\u0627\u0634 \u0628\u0647 \u0627\u062a\u0635\u0627\u0644 \u0645\u062c\u062f\u062f \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647\u060c \u0686\u0648\u0646 \u0627\u06af\u0631 \u0633\u0631\u0648\u0631 \u0648\u0627\u0642\u0639\u0627\u064b \u0627\u0632 \u062f\u0633\u062a\u0631\u0633 \u062e\u0627\u0631\u062c \u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u0641\u0642\u0637 \u0645\u0646\u0627\u0628\u0639 \u062f\u0633\u062a\u06af\u0627\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0647\u062f\u0631 \u0645\u06cc\u0631\u0647. \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u06cc\u0646 \u0647\u0631 \u062a\u0644\u0627\u0634 \u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u0641\u0627\u0635\u0644\u0647 \u06af\u0630\u0627\u0634\u062a\u0647 \u0645\u06cc\u0634\u0647 \u0648 \u0627\u06af\u0631 \u0686\u0646\u062f \u0628\u0627\u0631 \u067e\u0634\u062a \u0633\u0631 \u0647\u0645 \u0634\u06a9\u0633\u062a \u062e\u0648\u0631\u062f\u060c \u0641\u0627\u0635\u0644\u0647 \u0632\u0645\u0627\u0646\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0648 \u0628\u06cc\u0634\u062a\u0631 \u0645\u06cc\u0634\u0647. \u0628\u0647 \u0627\u06cc\u0646 \u0631\u0648\u0634 <strong>Exponential Backoff<\/strong> \u0645\u06cc\u06af\u0646.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">WebSocket \u0647\u0645\u06cc\u0634\u0647 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u0646\u06cc\u0633\u062a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u0636\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633\u200c\u0647\u0627 \u0628\u0639\u062f \u0627\u0632 \u0622\u0634\u0646\u0627 \u0634\u062f\u0646 \u0628\u0627 WebSocket \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0628\u0631\u0627\u06cc \u0647\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u0628\u0627\u06cc\u062f \u0627\u0632\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646\u060c \u0686\u0648\u0646 \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0648 \u0633\u0631\u06cc\u0639\u0647. \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0646\u06af\u0627\u0647 \u0627\u0634\u062a\u0628\u0627\u0647\u0647. \u0646\u06af\u0647 \u062f\u0627\u0634\u062a\u0646 \u0647\u0632\u0627\u0631\u0627\u0646 \u0627\u062a\u0635\u0627\u0644 \u062f\u0627\u0626\u0645\u06cc \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0647\u0632\u06cc\u0646\u0647 \u062f\u0627\u0631\u0647. \u0647\u0645 \u062d\u0627\u0641\u0638\u0647 \u0628\u06cc\u0634\u062a\u0631\u06cc \u0645\u0635\u0631\u0641 \u0645\u06cc\u0634\u0647\u060c \u0647\u0645 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u062a\u0635\u0627\u0644\u200c\u0647\u0627 \u0633\u062e\u062a\u200c\u062a\u0631\u0647 \u0648 \u0647\u0645 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0642\u0648\u06cc\u200c\u062a\u0631\u06cc \u0644\u0627\u0632\u0645 \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0641\u0642\u0637 \u0647\u0631 \u0686\u0646\u062f \u0633\u0627\u0639\u062a \u06cc\u06a9 \u0628\u0627\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646\u060c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 WebSocket \u0628\u06cc\u0634\u062a\u0631 \u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0635\u062d\u0628\u062a \u06a9\u0631\u062f\u0646 \u0628\u0627 \u0647\u0645\u0633\u0627\u06cc\u0647\u060c \u062a\u0645\u0627\u0645 \u0634\u0628\u0627\u0646\u0647\u200c\u0631\u0648\u0632 \u062a\u0644\u0641\u0646 \u0631\u0648 \u0628\u0627\u0632 \u0646\u06af\u0647 \u062f\u0627\u0631\u06cc\u061b \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u06cc\u06a9 \u062a\u0645\u0627\u0633 \u06a9\u0648\u062a\u0627\u0647 \u0645\u0648\u0642\u0639 \u0646\u06cc\u0627\u0632 \u06a9\u0627\u0645\u0644\u0627\u064b \u06a9\u0627\u0641\u06cc \u0628\u0648\u062f. \u0647\u0645\u06cc\u0634\u0647 \u0628\u0627\u06cc\u062f \u0628\u0628\u06cc\u0646\u06cc <strong>\u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0627\u0631\u062a\u0628\u0627\u0637 \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0627\u062d\u062a\u06cc\u0627\u062c \u062f\u0627\u0631\u06cc \u06cc\u0627 \u0646\u0647<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">WebSocket \u06cc\u0627 REST API\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u06cc\u0644\u06cc\u200c\u0647\u0627 \u0627\u06cc\u0646 \u062f\u0648 \u0631\u0648 \u0631\u0642\u06cc\u0628 \u0647\u0645 \u0645\u06cc\u200c\u062f\u0648\u0646\u0646\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u06a9\u0646\u0627\u0631 \u0647\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0646. \u0641\u0631\u0636 \u06a9\u0646 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0627\u0632 \u0645\u06cc\u0634\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0628\u062a\u062f\u0627 \u0628\u0627 REST API \u0644\u06cc\u0633\u062a \u06a9\u0627\u0644\u0627\u0647\u0627 \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0686\u0648\u0646 \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u062c\u0645 \u0646\u0633\u0628\u062a\u0627\u064b \u0632\u06cc\u0627\u062f\u06cc \u062f\u0627\u0631\u0646 \u0648 \u0641\u0642\u0637 \u06cc\u06a9 \u0628\u0627\u0631 \u0644\u0627\u0632\u0645 \u0647\u0633\u062a \u062f\u0627\u0646\u0644\u0648\u062f \u0628\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u0627\u06af\u0631 \u0628\u062e\u0648\u0627\u06cc \u0647\u0645\u0648\u0646 \u0635\u0641\u062d\u0647 \u0642\u06cc\u0645\u062a\u200c\u0647\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u0647\u060c WebSocket \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u0634\u0647 \u0648 \u0641\u0642\u0637 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u062c\u062f\u06cc\u062f \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u0634\u0646. \u06cc\u0639\u0646\u06cc REST \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631\u0627\u06cc <strong>\u062f\u0631\u06cc\u0627\u0641\u062a \u0648 \u0627\u0631\u0633\u0627\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0645\u0639\u0645\u0648\u0644\u06cc<\/strong> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647\u060c \u0627\u0645\u0627 WebSocket \u0628\u0631\u0627\u06cc <strong>\u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0648 \u0627\u0631\u062a\u0628\u0627\u0637 \u062f\u0627\u0626\u0645\u06cc<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0686\u0647 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc\u06cc \u062a\u0648 WebSocket \u067e\u06cc\u0634 \u0645\u06cc\u0627\u062f\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc \u0631\u0627\u06cc\u062c \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0627\u062a\u0635\u0627\u0644 WebSocket \u0628\u0639\u062f \u0627\u0632 \u0628\u0633\u062a\u0647 \u0634\u062f\u0646 \u0635\u0641\u062d\u0647 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0627\u0632 \u0628\u0645\u0648\u0646\u0647. \u0627\u06af\u0631 \u0635\u0641\u062d\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0627\u0632 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0628\u0633\u062a\u0647 \u0634\u062f\u0647\u060c \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062f\u06cc\u06af\u0647 \u062f\u0644\u06cc\u0644\u06cc \u0628\u0631\u0627\u06cc \u0628\u0627\u0632 \u0646\u06af\u0647 \u062f\u0627\u0634\u062a\u0646 \u0627\u0648\u0646 \u0627\u062a\u0635\u0627\u0644 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0634\u062a\u0628\u0627\u0647 \u0628\u0639\u062f\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0647\u0631 \u0646\u0648\u0639 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0627\u0632 WebSocket \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0634\u0647. \u0627\u06af\u0631 \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0628\u0647 \u0646\u062f\u0631\u062a \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646\u060c REST API \u06cc\u0627 \u062d\u062a\u06cc WorkManager \u0627\u0646\u062a\u062e\u0627\u0628 \u0628\u0647\u062a\u0631\u06cc \u0647\u0633\u062a\u0646. \u0628\u0639\u0636\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647\u200c\u0647\u0627 \u0647\u0645 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0642\u0637\u0639 \u0634\u062f\u0646 \u0627\u062a\u0635\u0627\u0644 \u0631\u0648 \u0641\u0631\u0627\u0645\u0648\u0634 \u0645\u06cc\u200c\u06a9\u0646\u0646. \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0647\u0645\u06cc\u0634\u0647 \u067e\u0627\u06cc\u062f\u0627\u0631 \u0646\u06cc\u0633\u062a \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0642\u0637\u0639 \u0648 \u0648\u0635\u0644 \u0634\u062f\u0646\u200c\u0647\u0627\u06cc \u0645\u0648\u0642\u062a \u0622\u0645\u0627\u062f\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u06af\u0627\u0647\u06cc \u062a\u0645\u0627\u0645 \u0645\u0646\u0637\u0642 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0627\u062e\u0644 Listener \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 WebSocket \u0646\u0648\u0634\u062a\u0647 \u0645\u06cc\u0634\u0647. \u0628\u0647\u062a\u0631\u0647 Listener \u0641\u0642\u0637 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627 \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u0647 \u0648 \u067e\u0631\u062f\u0627\u0632\u0634 \u0627\u0635\u0644\u06cc \u062f\u0627\u062e\u0644 Repository \u06cc\u0627 Use Case \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647 \u062a\u0627 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u062a\u0645\u06cc\u0632 \u0628\u0627\u0642\u06cc \u0628\u0645\u0648\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WebSocket \u06cc\u06a9 \u0631\u0648\u0634 \u0627\u0631\u062a\u0628\u0627\u0637\u06cc \u062f\u0648\u0637\u0631\u0641\u0647 \u0648 \u062f\u0627\u0626\u0645\u06cc \u0628\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0633\u0631\u0648\u0631\u0647 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc <strong>Real-time<\/strong> \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647. \u0628\u0631\u062e\u0644\u0627\u0641 HTTP \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06cc\u06a9 \u0627\u0631\u062a\u0628\u0627\u0637 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c WebSocket \u0641\u0642\u0637 \u06cc\u06a9 \u0628\u0627\u0631 \u0627\u062a\u0635\u0627\u0644 \u0631\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0628\u0639\u062f \u0647\u0631 \u062f\u0648 \u0637\u0631\u0641 \u0647\u0631 \u0632\u0645\u0627\u0646 \u0644\u0627\u0632\u0645 \u0628\u0627\u0634\u0647\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0648 \u0628\u0631\u0627\u06cc \u0647\u0645 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u0645\u062b\u0644 <strong>\u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646<\/strong>\u060c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 WebSocket \u062f\u0631 \u0628\u06cc\u0634\u062a\u0631 \u0628\u062e\u0634\u200c\u0647\u0627 \u0636\u0631\u0648\u0631\u062a\u06cc \u0646\u062f\u0627\u0631\u0647 \u0648 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 <strong>REST API<\/strong>\u060c <strong>WorkManager<\/strong> \u0648 <strong>Firebase Cloud Messaging<\/strong> \u0627\u0646\u062a\u062e\u0627\u0628\u200c\u0647\u0627\u06cc \u0645\u0646\u0627\u0633\u0628\u200c\u062a\u0631\u06cc \u0647\u0633\u062a\u0646. \u0627\u0645\u0627 \u0627\u06af\u0631 \u0631\u0648\u0632\u06cc \u0628\u062e\u0648\u0627\u06cc \u0628\u062e\u0634\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0631\u0648 \u0628\u0647 \u0635\u0648\u0631\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u0647\u060c \u0645\u062b\u0644 \u0642\u06cc\u0645\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0627\u0631\u0632 \u06cc\u0627 \u06cc\u06a9 \u062d\u0631\u0627\u062c \u0632\u0646\u062f\u0647\u060c \u0627\u0648\u0646 \u0648\u0642\u062a WebSocket \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0647\u062a\u0631\u06cc\u0646 \u06af\u0632\u06cc\u0646\u0647 \u0628\u0627\u0634\u0647. \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u0646\u06a9\u062a\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 WebSocket \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f\u0647\u060c \u0627\u0645\u0627 \u0641\u0642\u0637 \u0632\u0645\u0627\u0646\u06cc \u0627\u0631\u0632\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0627\u0631\u0647 \u06a9\u0647 <strong>\u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0627\u0631\u062a\u0628\u0627\u0637 \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0648 \u062f\u0627\u0626\u0645\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u0686\u0647\u0644\u200c\u0648\u067e\u0646\u062c\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">Socket.IO<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b Socket.IO \u0686\u06cc\u0647\u061f<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-12-1024x683.avif\" alt=\"\" class=\"wp-image-6143\" srcset=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-12-1024x683.avif 1024w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-12-300x200.avif 300w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-12-768x512.avif 768w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-12.avif 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u062f\u0631\u0633 \u0642\u0628\u0644 \u0628\u0627 <strong>WebSocket<\/strong> \u0622\u0634\u0646\u0627 \u0634\u062f\u06cc\u0645 \u0648 \u062f\u06cc\u062f\u06cc\u0645 \u06a9\u0647 \u0686\u0637\u0648\u0631 \u0645\u06cc\u0634\u0647 \u06cc\u06a9 \u0627\u0631\u062a\u0628\u0627\u0637 \u062f\u0627\u0626\u0645\u06cc \u0628\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u06a9\u0631\u062f. \u0627\u0645\u0627 \u0627\u06af\u0631 WebSocket \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647\u060c \u067e\u0633 Socket.IO \u0628\u0631\u0627\u06cc \u0686\u06cc\u0647\u061f \u0622\u06cc\u0627 \u0627\u06cc\u0646 \u062f\u0648 \u06cc\u06a9\u06cc \u0647\u0633\u062a\u0646\u061f \u062c\u0648\u0627\u0628 \u06a9\u0648\u062a\u0627\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 <strong>\u0646\u0647<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u06cc\u0644\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633\u200c\u0647\u0627 \u0627\u0648\u0644 \u06a9\u0627\u0631 \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646 Socket.IO \u0641\u0642\u0637 \u06cc\u06a9 \u0627\u0633\u0645 \u062f\u06cc\u06af\u0647 \u0628\u0631\u0627\u06cc WebSocket\u0640\u0647\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0627\u06cc\u0646 \u062f\u0648 \u062f\u0642\u06cc\u0642\u0627\u064b \u06cc\u06a9 \u0686\u06cc\u0632 \u0646\u06cc\u0633\u062a\u0646. WebSocket \u06cc\u06a9 <strong>\u067e\u0631\u0648\u062a\u06a9\u0644 \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f<\/strong> \u0628\u0631\u0627\u06cc \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0627\u0631\u062a\u0628\u0627\u0637\u0647\u060c \u0627\u0645\u0627 Socket.IO \u06cc\u06a9 <strong>\u06a9\u062a\u0627\u0628\u062e\u0648\u0646\u0647<\/strong> \u0627\u0633\u062a \u06a9\u0647 \u0631\u0648\u06cc \u0627\u06cc\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u0645\u06a9\u0627\u0646\u0627\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u06cc\u0639\u0646\u06cc Socket.IO \u0627\u0632 WebSocket \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u0641\u0642\u0637 \u0628\u0647 WebSocket \u0645\u062d\u062f\u0648\u062f \u0646\u06cc\u0633\u062a \u0648 \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc \u062f\u06cc\u06af\u0647\u200c\u0627\u06cc \u0647\u0645 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0686\u0631\u0627 Socket.IO \u0628\u0647 \u0648\u062c\u0648\u062f \u0627\u0648\u0645\u062f\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc WebSocket \u0645\u0639\u0631\u0641\u06cc \u0634\u062f\u060c \u0647\u0645\u0647 \u0645\u0631\u0648\u0631\u06af\u0631\u0647\u0627 \u0648 \u0633\u0631\u0648\u0631\u0647\u0627 \u0627\u0632 \u0627\u0648\u0646 \u0628\u0647 \u062e\u0648\u0628\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0646\u0645\u06cc\u200c\u06a9\u0631\u062f\u0646. \u0628\u0639\u0636\u06cc \u0645\u0631\u0648\u0631\u06af\u0631\u0647\u0627 WebSocket \u0646\u062f\u0627\u0634\u062a\u0646\u060c \u0628\u0639\u0636\u06cc \u0634\u0628\u06a9\u0647\u200c\u0647\u0627 \u0627\u062c\u0627\u0632\u0647 \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0627\u062a\u0635\u0627\u0644 WebSocket \u0631\u0648 \u0646\u0645\u06cc\u200c\u062f\u0627\u062f\u0646 \u0648 \u06af\u0627\u0647\u06cc \u0647\u0645 \u0627\u0631\u062a\u0628\u0627\u0637 \u0646\u0627\u06af\u0647\u0627\u0646 \u0642\u0637\u0639 \u0645\u06cc\u200c\u0634\u062f \u0648 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u0628\u0627\u06cc\u062f \u0647\u0645\u0647 \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644\u0627\u062a \u0631\u0648 \u062e\u0648\u062f\u0634 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0631\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Socket.IO \u0628\u0631\u0627\u06cc \u0633\u0627\u062f\u0647\u200c\u062a\u0631 \u06a9\u0631\u062f\u0646 \u0647\u0645\u06cc\u0646 \u0645\u0633\u0627\u0626\u0644 \u0633\u0627\u062e\u062a\u0647 \u0634\u062f. \u0647\u062f\u0641\u0634 \u0627\u06cc\u0646 \u0628\u0648\u062f \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u0628\u0647 \u062c\u0627\u06cc \u062f\u0631\u06af\u06cc\u0631 \u0634\u062f\u0646 \u0628\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u0631\u062a\u0628\u0627\u0637\u060c \u0641\u0642\u0637 \u0631\u0648\u06cc \u0627\u0631\u0633\u0627\u0644 \u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u067e\u06cc\u0627\u0645\u200c\u0647\u0627 \u062a\u0645\u0631\u06a9\u0632 \u06a9\u0646\u0647. \u0627\u06af\u0631 WebSocket \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0648\u062f \u0627\u0632 \u0627\u0648\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0627\u06af\u0631 \u0646\u0628\u0648\u062f\u060c \u062f\u0631 \u0628\u0639\u0636\u06cc \u0634\u0631\u0627\u06cc\u0637 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0632 \u0631\u0648\u0634\u200c\u0647\u0627\u06cc \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0647 \u062a\u0627 \u0627\u0631\u062a\u0628\u0627\u0637 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0631\u0642\u0631\u0627\u0631 \u0628\u0645\u0648\u0646\u0647. \u0628\u0647 \u0647\u0645\u06cc\u0646 \u062e\u0627\u0637\u0631 \u062e\u06cc\u0644\u06cc\u200c\u0647\u0627 \u0628\u0647 Socket.IO \u0645\u06cc\u06af\u0646 \u06cc\u06a9 <strong>\u0644\u0627\u06cc\u0647 \u0631\u0627\u062d\u062a\u200c\u062a\u0631 \u0631\u0648\u06cc \u0627\u0631\u062a\u0628\u0627\u0637\u200c\u0647\u0627\u06cc Real-time<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Socket.IO \u0628\u0627 WebSocket \u0686\u0647 \u0641\u0631\u0642\u06cc \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0634\u0627\u06cc\u062f \u0628\u0647\u062a\u0631\u06cc\u0646 \u062a\u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0634\u0647 \u06a9\u0647 WebSocket \u0645\u062b\u0644 \u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u062e\u0627\u0645\u0647\u060c \u0627\u0645\u0627 Socket.IO \u06cc\u06a9 \u0645\u0627\u0634\u06cc\u0646 \u06a9\u0627\u0645\u0644\u0647 \u06a9\u0647 \u0631\u0648\u06cc \u0627\u0648\u0646 \u0645\u0648\u062a\u0648\u0631 \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647. \u062e\u0648\u062f WebSocket \u0641\u0642\u0637 \u0627\u0631\u062a\u0628\u0627\u0637 \u0631\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u0645\u0627 Socket.IO \u0627\u0645\u06a9\u0627\u0646\u0627\u062a\u06cc \u0645\u062b\u0644 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0645\u062c\u062f\u062f\u060c \u0627\u0631\u0633\u0627\u0644 Event\u060c \u06af\u0631\u0648\u0647\u200c\u0628\u0646\u062f\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u060c \u062a\u0634\u062e\u06cc\u0635 \u0642\u0637\u0639 \u0634\u062f\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0648 \u0686\u0646\u062f \u0642\u0627\u0628\u0644\u06cc\u062a \u062f\u06cc\u06af\u0647 \u0631\u0648 \u0647\u0645 \u0622\u0645\u0627\u062f\u0647 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631\u062a \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u0639\u0646\u06cc \u0627\u06af\u0631 \u0628\u062e\u0648\u0627\u06cc \u0641\u0642\u0637 \u06cc\u06a9 \u0627\u0631\u062a\u0628\u0627\u0637 \u0633\u0627\u062f\u0647 \u0628\u0631\u0642\u0631\u0627\u0631 \u06a9\u0646\u06cc\u060c WebSocket \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u06a9\u0627\u0641\u06cc\u0647. \u0627\u0645\u0627 \u0627\u06af\u0631 \u067e\u0631\u0648\u0698\u0647 \u0628\u0632\u0631\u06af\u200c\u062a\u0631 \u0628\u0627\u0634\u0647 \u0648 \u0628\u062e\u0648\u0627\u06cc \u062e\u06cc\u0644\u06cc \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc \u062c\u0627\u0646\u0628\u06cc \u0631\u0648 \u0628\u062f\u0648\u0646 \u0646\u0648\u0634\u062a\u0646 \u06a9\u062f \u0627\u0636\u0627\u0641\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u060c Socket.IO \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u0631\u0627\u062d\u062a\u200c\u062a\u0631\u06cc \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Socket.IO \u0641\u0642\u0637 \u0628\u0627 Socket.IO \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u0646\u06a9\u062a\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062e\u06cc\u0644\u06cc \u0627\u0632 \u062a\u0627\u0632\u0647\u200c\u06a9\u0627\u0631\u0647\u0627 \u0646\u0645\u06cc\u200c\u062f\u0648\u0646\u0646 \u0627\u06cc\u0646\u0647 \u06a9\u0647 <strong>\u06a9\u0644\u0627\u06cc\u0646\u062a Socket.IO \u0646\u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0647 \u06cc\u06a9 WebSocket \u0645\u0639\u0645\u0648\u0644\u06cc \u0648\u0635\u0644 \u0628\u0634\u0647.<\/strong> \u0628\u0631\u0639\u06a9\u0633\u0634 \u0647\u0645 \u062f\u0631\u0633\u062a\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0631 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0627\u0632 Socket.IO \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u06cc\u060c \u0633\u0645\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u0645 \u0628\u0627\u06cc\u062f \u0627\u0632 Socket.IO \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc. \u0627\u06af\u0631 \u0633\u0631\u0648\u0631 \u0641\u0642\u0637 WebSocket \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u062f\u0647\u060c \u0628\u0627\u06cc\u062f \u0627\u0632 WebSocket Client \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc. \u062f\u0644\u06cc\u0644\u0634 \u0627\u06cc\u0646\u0647 \u06a9\u0647 Socket.IO \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 WebSocket\u060c \u067e\u0631\u0648\u062a\u06a9\u0644 \u0645\u062e\u0635\u0648\u0635 \u062e\u0648\u062f\u0634 \u0631\u0648 \u0647\u0645 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a Event\u0647\u0627 \u0648 \u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06cc\u0646 \u062f\u0648 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u062c\u0627\u06cc \u0647\u0645\u062f\u06cc\u06af\u0647 \u0646\u06cc\u0633\u062a\u0646.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Event \u06cc\u0639\u0646\u06cc \u0686\u06cc\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u062c\u0630\u0627\u0628\u200c\u062a\u0631\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc Socket.IO \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0647\u0645\u0647 \u0627\u0631\u062a\u0628\u0627\u0637\u200c\u0647\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 <strong>Event<\/strong> \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u0634\u0646. \u0641\u0631\u0636 \u06a9\u0646 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u06a9\u0627\u0631\u0628\u0631 \u06cc\u06a9 \u06a9\u0627\u0644\u0627 \u0631\u0648 \u0628\u0647 \u0639\u0644\u0627\u0642\u0647\u200c\u0645\u0646\u062f\u06cc\u200c\u0647\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0647. \u0628\u0647 \u062c\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0641\u0642\u0637 \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u062e\u0627\u0645 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u0645\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0628\u06af\u06cc\u0645:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>favorite_added\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u0627 \u0648\u0642\u062a\u06cc \u0642\u06cc\u0645\u062a \u06cc\u06a9 \u06a9\u0627\u0644\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0631\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>price_changed\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u0627 \u0648\u0642\u062a\u06cc \u067e\u06cc\u0627\u0645 \u062c\u062f\u06cc\u062f \u0631\u0633\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>new_message\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u0639\u0646\u06cc \u0647\u0631 \u067e\u06cc\u0627\u0645 \u06cc\u06a9 \u0627\u0633\u0645 \u0645\u0634\u062e\u0635 \u062f\u0627\u0631\u0647 \u0648 \u06af\u06cc\u0631\u0646\u062f\u0647 \u062f\u0642\u06cc\u0642\u0627\u064b \u0645\u06cc\u200c\u062f\u0648\u0646\u0647 \u0627\u06cc\u0646 \u062f\u0627\u062f\u0647 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0686\u0647 \u0627\u062a\u0641\u0627\u0642\u06cc\u0647. \u0627\u06cc\u0646 \u0645\u062f\u0644 \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af \u062e\u06cc\u0644\u06cc \u062e\u0648\u0627\u0646\u0627\u062a\u0631 \u0628\u0634\u0646.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u06cc\u06a9 \u0645\u062b\u0627\u0644 \u0648\u0627\u0642\u0639\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u062e\u0634\u06cc \u0628\u0631\u0627\u06cc \u06af\u0641\u062a\u200c\u0648\u06af\u0648\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646 \u0628\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u06cc. \u0648\u0642\u062a\u06cc \u06a9\u0627\u0631\u0628\u0631 \u067e\u06cc\u0627\u0645 \u062c\u062f\u06cc\u062f\u06cc \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647\u060c \u0633\u0631\u0648\u0631 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 Event \u0632\u06cc\u0631 \u0631\u0648 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u0647:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>new_message\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u06a9\u0644\u0627\u06cc\u0646\u062a \u0647\u0645 \u0641\u0642\u0637 \u0628\u0647 \u0647\u0645\u06cc\u0646 Event \u06af\u0648\u0634 \u0645\u06cc\u062f\u0647. \u0648\u0642\u062a\u06cc \u0627\u06cc\u0646 Event \u062f\u0631\u06cc\u0627\u0641\u062a \u0634\u062f\u060c \u067e\u06cc\u0627\u0645 \u062c\u062f\u06cc\u062f \u062f\u0627\u062e\u0644 \u0635\u0641\u062d\u0647 \u0686\u062a \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647. \u0627\u06af\u0631 \u0628\u0639\u062f\u0627\u064b Event \u062f\u06cc\u06af\u0631\u06cc \u0645\u062b\u0644:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>typing\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0631\u0633\u0627\u0644 \u0628\u0634\u0647\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u062a\u0648\u062c\u0647 \u0645\u06cc\u0634\u0647 \u06a9\u0647 \u0627\u067e\u0631\u0627\u062a\u0648\u0631 \u062f\u0631 \u062d\u0627\u0644 \u062a\u0627\u06cc\u067e \u06a9\u0631\u062f\u0646\u0647. \u0647\u0645\u0647 \u0627\u06cc\u0646 \u0627\u062a\u0641\u0627\u0642\u200c\u0647\u0627 \u0631\u0648\u06cc \u0647\u0645\u0627\u0646 \u0627\u062a\u0635\u0627\u0644 \u062f\u0627\u0626\u0645\u06cc \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u0634\u0646.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u062a\u0635\u0627\u0644 \u0645\u062c\u062f\u062f \u062e\u0648\u062f\u06a9\u0627\u0631<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0627\u0639\u062b \u0645\u062d\u0628\u0648\u0628\u06cc\u062a Socket.IO \u0634\u062f\u0647\u060c <strong>Reconnect \u062e\u0648\u062f\u06a9\u0627\u0631\u0647. <\/strong>\u0641\u0631\u0636 \u06a9\u0646 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u06a9\u0627\u0631\u0628\u0631 \u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u0642\u0637\u0639 \u0645\u06cc\u0634\u0647. \u0627\u06af\u0631 \u0627\u0632 WebSocket \u062e\u0627\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u06cc\u060c \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u0627\u06cc\u062f \u062e\u0648\u062f\u062a \u062a\u0634\u062e\u06cc\u0635 \u0628\u062f\u06cc \u0627\u0631\u062a\u0628\u0627\u0637 \u0642\u0637\u0639 \u0634\u062f\u0647 \u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0648\u0646 \u0631\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u06a9\u0646\u06cc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 Socket.IO \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0648 \u0628\u0647 \u0635\u0648\u0631\u062a \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u062f\u0647. \u0647\u0631 \u0632\u0645\u0627\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u0632 \u0628\u06cc\u0646 \u0628\u0631\u0647\u060c \u062e\u0648\u062f\u0634 \u0686\u0646\u062f \u0628\u0627\u0631 \u062a\u0644\u0627\u0634 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0648\u0635\u0644 \u0628\u0634\u0647. \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u06a9\u062f \u06a9\u0645\u062a\u0631\u06cc \u0628\u0646\u0648\u06cc\u0633\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Room \u06cc\u0639\u0646\u06cc \u0686\u06cc\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u062f\u06cc\u06af\u0647 \u0627\u0632 \u0627\u0645\u06a9\u0627\u0646\u0627\u062a \u062c\u0627\u0644\u0628 Socket.IO \u0645\u0641\u0647\u0648\u0645 <strong>Room<\/strong> \u0647\u0633\u062a. \u0641\u0631\u0636 \u06a9\u0646 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0647\u0632\u0627\u0631 \u0646\u0641\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646 \u0647\u0633\u062a\u0646\u060c \u0627\u0645\u0627 \u0641\u0642\u0637 \u067e\u0646\u062c\u0627\u0647 \u0646\u0641\u0631 \u0635\u0641\u062d\u0647 \u06cc\u06a9 \u0645\u062d\u0635\u0648\u0644 \u062e\u0627\u0635 \u0631\u0648 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646. \u0627\u06af\u0631 \u0642\u06cc\u0645\u062a \u0647\u0645\u0648\u0646 \u0645\u062d\u0635\u0648\u0644 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u0647\u060c \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u067e\u06cc\u0627\u0645 \u0628\u0631\u0627\u06cc \u0647\u0631 \u0647\u0632\u0627\u0631 \u0646\u0641\u0631 \u0627\u0631\u0633\u0627\u0644 \u0628\u0634\u0647. \u06a9\u0627\u0641\u06cc\u0647 \u0627\u0648\u0646 \u067e\u0646\u062c\u0627\u0647 \u0646\u0641\u0631 \u062f\u0627\u062e\u0644 \u06cc\u06a9 Room \u0628\u0627\u0634\u0646 \u0648 \u0633\u0631\u0648\u0631 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0627\u0639\u0636\u0627\u06cc \u0647\u0645\u0648\u0646 Room \u067e\u06cc\u0627\u0645 \u0628\u0641\u0631\u0633\u062a\u0647. \u0627\u06cc\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u0686\u062a\u060c \u0628\u0627\u0632\u06cc\u200c\u0647\u0627\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646 \u0648 \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u0627\u0639\u0644\u0627\u0646 \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u062e\u06cc\u0644\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Namespace \u0686\u06cc\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06af\u0627\u0647\u06cc \u06cc\u06a9 \u0633\u0631\u0648\u0631 \u0686\u0646\u062f \u0646\u0648\u0639 \u0627\u0631\u062a\u0628\u0627\u0637 \u0645\u062e\u062a\u0644\u0641 \u062f\u0627\u0631\u0647. \u0645\u062b\u0644\u0627\u064b:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0686\u062a<\/li>\n\n\n\n<li>\u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627<\/li>\n\n\n\n<li>\u0645\u0627\u0646\u06cc\u062a\u0648\u0631\u06cc\u0646\u06af<\/li>\n\n\n\n<li>\u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Socket.IO \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u062f\u0647 \u0627\u06cc\u0646 \u0627\u0631\u062a\u0628\u0627\u0637\u200c\u0647\u0627 \u0627\u0632 \u0647\u0645 \u062c\u062f\u0627 \u0628\u0634\u0646. \u0628\u0647 \u0627\u06cc\u0646 \u0628\u062e\u0634\u200c\u0628\u0646\u062f\u06cc <strong>Namespace<\/strong> \u0645\u06cc\u06af\u0646. \u062f\u0631 \u0646\u062a\u06cc\u062c\u0647 \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u0647\u0645\u0647 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627 \u062f\u0627\u062e\u0644 \u06cc\u06a9 \u06a9\u0627\u0646\u0627\u0644 \u0631\u062f\u0648\u0628\u062f\u0644 \u0628\u0634\u0646.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Socket.IO \u062f\u0631 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627 \u06a9\u062a\u0627\u0628\u062e\u0648\u0646\u0647 Socket.IO \u0628\u0647 \u067e\u0631\u0648\u0698\u0647 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u0634\u0647. \u0628\u0639\u062f \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val socket =\n    IO.socket(\"https:\/\/example.com\")\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> socket <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    IO.<\/span><span style=\"color: #6F42C1\">socket<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;https:\/\/example.com&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>socket.connect()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">socket.<\/span><span style=\"color: #6F42C1\">connect<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648 \u062d\u0627\u0644\u0627 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0645\u0646\u062a\u0638\u0631 Event\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0628\u0627\u0634\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>socket.on(\"price_changed\") {\n\n    \/\/ \u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062c\u062f\u06cc\u062f\n\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">socket.<\/span><span style=\"color: #6F42C1\">on<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;price_changed&quot;<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6A737D\">\/\/ \u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062c\u062f\u06cc\u062f<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u0648\u0646\u200c\u0637\u0648\u0631 \u06a9\u0647 \u0645\u06cc\u200c\u0628\u06cc\u0646\u06cc\u060c \u0645\u062f\u0644 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631 \u067e\u0627\u06cc\u0647 Event\u0647\u0627\u0633\u062a \u062a\u0627 \u0627\u0631\u0633\u0627\u0644 \u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u0633\u062a\u0642\u06cc\u0645 \u067e\u06cc\u0627\u0645.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0647 Socket.IO \u0627\u062d\u062a\u06cc\u0627\u062c \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u062e\u06cc\u0631. \u0627\u06af\u0631 \u0641\u0642\u0637 \u0645\u06cc\u200c\u062e\u0648\u0627\u06cc \u06a9\u0627\u0647\u0634 \u0642\u06cc\u0645\u062a \u06cc\u06a9 \u06a9\u0627\u0644\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0637\u0644\u0627\u0639 \u062f\u0627\u062f\u0647 \u0628\u0634\u0647\u060c <strong>Firebase Cloud Messaging<\/strong> \u0627\u0646\u062a\u062e\u0627\u0628 \u0628\u0633\u06cc\u0627\u0631 \u0645\u0646\u0627\u0633\u0628\u200c\u062a\u0631\u06cc\u0647. \u0627\u06af\u0631 \u0647\u0645 \u06a9\u0627\u0631\u0628\u0631 \u0635\u0641\u062d\u0647 \u0642\u06cc\u0645\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0627\u0631\u0632 \u06cc\u0627 \u0637\u0644\u0627 \u0631\u0648 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0647\u060c \u06cc\u06a9 WebSocket \u0645\u0639\u0645\u0648\u0644\u06cc \u0647\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u06a9\u0627\u0641\u06cc \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Socket.IO \u0632\u0645\u0627\u0646\u06cc \u0627\u0631\u0632\u0634 \u0628\u06cc\u0634\u062a\u0631\u06cc \u067e\u06cc\u062f\u0627 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u06a9\u0647 \u067e\u0631\u0648\u0698\u0647 \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc Event \u0645\u062e\u062a\u0644\u0641\u060c \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0622\u0646\u0644\u0627\u06cc\u0646\u060c \u06af\u0631\u0648\u0647\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u06cc\u0627 \u0627\u0631\u062a\u0628\u0627\u0637\u200c\u0647\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 Real-time \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644\u060c \u0627\u06af\u0631 \u0631\u0648\u0632\u06cc \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u06af\u0641\u062a\u200c\u0648\u06af\u0648\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646 \u0628\u06cc\u0646 \u0645\u0634\u062a\u0631\u06cc \u0648 \u0641\u0631\u0648\u0634\u0646\u062f\u0647 \u0627\u0636\u0627\u0641\u0647 \u0628\u0634\u0647\u060c \u0627\u0648\u0646 \u0648\u0642\u062a Socket.IO \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u062e\u06cc\u0644\u06cc \u062e\u0648\u0628\u06cc \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0686\u0647 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc\u06cc \u062a\u0648 Socket.IO \u067e\u06cc\u0634 \u0645\u06cc\u0627\u062f\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc \u0631\u0627\u06cc\u062c \u0627\u06cc\u0646\u0647 \u06a9\u0647 Socket.IO \u0648 WebSocket \u0628\u0627 \u0647\u0645 \u0627\u0634\u062a\u0628\u0627\u0647 \u06af\u0631\u0641\u062a\u0647 \u0628\u0634\u0646. \u062e\u06cc\u0644\u06cc\u200c\u0647\u0627 \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0647\u0631 \u06a9\u0644\u0627\u06cc\u0646\u062a WebSocket \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 Socket.IO \u0648\u0635\u0644 \u0628\u0634\u0647 \u06cc\u0627 \u0628\u0631\u0639\u06a9\u0633\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0627\u06cc\u0646 \u062f\u0648 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0627\u0631\u062a\u0628\u0627\u0637\u06cc \u0645\u062a\u0641\u0627\u0648\u062a\u06cc \u062f\u0627\u0631\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0634\u062a\u0628\u0627\u0647 \u0628\u0639\u062f\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0639\u062f \u0627\u0632 \u0628\u0633\u062a\u0647 \u0634\u062f\u0646 \u0635\u0641\u062d\u0647\u060c \u0627\u062a\u0635\u0627\u0644 Socket.IO \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0627\u0632 \u0628\u0645\u0648\u0646\u0647. \u0627\u06af\u0631 \u062f\u06cc\u06af\u0647 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0646\u06cc\u0633\u062a\u060c \u0628\u0647\u062a\u0631\u0647 \u0627\u0631\u062a\u0628\u0627\u0637 \u0647\u0645 \u0628\u0633\u062a\u0647 \u0628\u0634\u0647 \u062a\u0627 \u0645\u0646\u0627\u0628\u0639 \u062f\u0633\u062a\u06af\u0627\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0628\u06cc\u0647\u0648\u062f\u0647 \u0645\u0635\u0631\u0641 \u0646\u0634\u0646. \u0628\u0639\u0636\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647\u200c\u0647\u0627 \u0647\u0645 \u0627\u0632 Socket.IO \u0628\u0631\u0627\u06cc \u0647\u0631 \u0646\u0648\u0639 \u0627\u0631\u062a\u0628\u0627\u0637\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646\u060c \u062d\u062a\u06cc \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0633\u0627\u062f\u0647 HTTP \u06a9\u0627\u0645\u0644\u0627\u064b \u06a9\u0627\u0641\u06cc \u0628\u0648\u062f\u0647. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0641\u0642\u0637 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u067e\u0631\u0648\u0698\u0647 \u0631\u0648 \u0628\u06cc\u0634\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0645\u0632\u06cc\u062a \u062e\u0627\u0635\u06cc \u0647\u0645 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Socket.IO \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0648\u0646\u0647 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0627\u0631\u062a\u0628\u0627\u0637\u200c\u0647\u0627\u06cc <strong>Real-time<\/strong>\u0647 \u06a9\u0647 \u0627\u0645\u06a9\u0627\u0646\u0627\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u0646\u0633\u0628\u062a \u0628\u0647 WebSocket \u062e\u0627\u0645 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u0647. \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 \u0627\u062a\u0635\u0627\u0644 \u0645\u062c\u062f\u062f \u062e\u0648\u062f\u06a9\u0627\u0631\u060c \u0627\u0631\u062a\u0628\u0627\u0637 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 Event\u060c Room\u0647\u0627 \u0648 Namespace\u0647\u0627 \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0646 \u0633\u0627\u062e\u062a \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u0628\u0644\u0627\u062f\u0631\u0646\u06af \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062e\u06cc\u0644\u06cc \u0633\u0627\u062f\u0647\u200c\u062a\u0631 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c Socket.IO \u0647\u0645\u06cc\u0634\u0647 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u0646\u06cc\u0633\u062a. \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u0645\u062b\u0644 <strong>\u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646<\/strong>\u060c \u062f\u0631 \u0628\u06cc\u0634\u062a\u0631 \u0628\u062e\u0634\u200c\u0647\u0627 <strong>REST API<\/strong>\u060c <strong>Firebase Cloud Messaging<\/strong> \u06cc\u0627 \u062d\u062a\u06cc <strong>WebSocket<\/strong> \u0633\u0627\u062f\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u06a9\u0627\u0641\u06cc \u0647\u0633\u062a\u0646. Socket.IO \u0632\u0645\u0627\u0646\u06cc \u0627\u0631\u0632\u0634 \u0648\u0627\u0642\u0639\u06cc \u062e\u0648\u062f\u0634 \u0631\u0648 \u0646\u0634\u0648\u0646 \u0645\u06cc\u062f\u0647 \u06a9\u0647 \u067e\u0631\u0648\u0698\u0647 \u0627\u0631\u062a\u0628\u0627\u0637\u200c\u0647\u0627\u06cc \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647\u060c \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0622\u0646\u0644\u0627\u06cc\u0646 \u0632\u06cc\u0627\u062f \u0648 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0645\u062a\u0646\u0648\u0639 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u062d\u0631\u0641\u0647\u200c\u0627\u06cc \u0642\u0628\u0644 \u0627\u0632 \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u0628\u0632\u0627\u0631\u060c \u0627\u0648\u0644 \u0646\u06cc\u0627\u0632 \u067e\u0631\u0648\u0698\u0647 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0628\u0639\u062f \u0633\u0631\u0627\u063a \u0645\u0646\u0627\u0633\u0628\u200c\u062a\u0631\u06cc\u0646 \u0641\u0646\u0627\u0648\u0631\u06cc \u0645\u06cc\u0631\u0647\u060c \u0646\u0647 \u0627\u06cc\u0646\u06a9\u0647 \u0635\u0631\u0641\u0627\u064b \u0686\u0648\u0646 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0627\u0645\u06a9\u0627\u0646\u0627\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u062f\u0627\u0631\u0647\u060c \u0627\u0632 \u0647\u0645\u0648\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u0686\u0647\u0644\u200c\u0648\u0634\u0634\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">Live Update<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b Live Update \u0686\u06cc\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062a\u0627 \u0627\u06cc\u0646\u062c\u0627 \u0686\u0646\u062f \u0631\u0648\u0634 \u0645\u062e\u062a\u0644\u0641 \u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u200c\u0631\u0633\u0627\u0646\u06cc \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u06cc\u0645. Notification \u0628\u0631\u0627\u06cc \u0632\u0645\u0627\u0646\u06cc \u0628\u0648\u062f \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u06cc\u0645 \u06cc\u06a9 \u0627\u062a\u0641\u0627\u0642 \u0631\u0648 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062e\u0628\u0631 \u0628\u062f\u06cc\u0645. Badge \u0641\u0642\u0637 \u06cc\u0627\u062f\u0622\u0648\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0631\u062f \u06a9\u0647 \u0627\u062a\u0641\u0627\u0642 \u062c\u062f\u06cc\u062f\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647. Foreground Service \u0647\u0645 \u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u06a9\u0627\u0631\u0647\u0627\u06cc \u0637\u0648\u0644\u0627\u0646\u06cc \u0628\u0648\u062f \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u06cc\u062f \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u0627\u0648\u0646\u200c\u0647\u0627 \u0628\u0627\u062e\u0628\u0631 \u0645\u06cc\u200c\u0634\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u06cc\u06a9 \u0633\u0624\u0627\u0644 \u0645\u0647\u0645 \u067e\u06cc\u0634 \u0645\u06cc\u0627\u062f. \u0641\u0631\u0636 \u06a9\u0646 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u0686\u0646\u062f \u062f\u0642\u06cc\u0642\u0647 \u0637\u0648\u0644 \u0645\u06cc\u200c\u06a9\u0634\u0647\u061b \u0645\u062b\u0644\u0627\u064b \u06a9\u0627\u0631\u0628\u0631 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0628\u0632\u0631\u06af \u0631\u0648 \u0622\u067e\u0644\u0648\u062f \u06a9\u0631\u062f\u0647 \u06cc\u0627 \u06cc\u06a9 \u0633\u0641\u0631 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u0631\u0648 \u0631\u0632\u0631\u0648 \u06a9\u0631\u062f\u0647 \u0648 \u0648\u0636\u0639\u06cc\u062a \u0633\u0641\u0627\u0631\u0634 \u0644\u062d\u0638\u0647\u200c\u0628\u0647\u200c\u0644\u062d\u0638\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0622\u06cc\u0627 \u062f\u0631 \u0686\u0646\u06cc\u0646 \u0634\u0631\u0627\u06cc\u0637\u06cc \u0628\u0627\u06cc\u062f \u0647\u0631 \u0628\u0627\u0631 \u06cc\u06a9 Notification \u062c\u062f\u06cc\u062f \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u0645\u061f \u062c\u0648\u0627\u0628 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0646\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0631 \u0628\u0631\u0627\u06cc \u0647\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u06cc\u06a9 Notification \u062c\u062f\u06cc\u062f \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u06cc\u0645\u060c \u062e\u06cc\u0644\u06cc \u0632\u0648\u062f \u0646\u0648\u0627\u0631 \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u067e\u0631 \u0627\u0632 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u062a\u06a9\u0631\u0627\u0631\u06cc \u0645\u06cc\u0634\u0647. \u062f\u0631 \u0686\u0646\u06cc\u0646 \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc\u06cc \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0644\u0627\u0632\u0645 \u062f\u0627\u0631\u06cc\u0645\u060c <strong>\u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u0645\u0648\u062c\u0648\u062f<\/strong>\u0647\u060c \u0646\u0647 \u0633\u0627\u062e\u062a\u0646 \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f. \u0628\u0647 \u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647\u060c <strong>Live Update<\/strong> \u06af\u0641\u062a\u0647 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Live Update \u062f\u0642\u06cc\u0642\u0627\u064b \u0686\u06cc\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Live Update \u06cc\u0639\u0646\u06cc \u0628\u0647 \u062c\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0631\u0627\u06cc \u0647\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u062c\u062f\u06cc\u062f \u0628\u0633\u0627\u0632\u06cc\u060c <strong>\u0647\u0645\u0627\u0646 \u0627\u0639\u0644\u0627\u0646 \u0642\u0628\u0644\u06cc \u0631\u0627 \u0645\u0631\u062a\u0628 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06a9\u0646\u06cc<\/strong>. \u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u06cc\u06a9 \u062e\u0631\u0648\u062c\u06cc \u0627\u06a9\u0633\u0644 \u0627\u0632 \u0647\u0632\u0627\u0631\u0627\u0646 \u06a9\u0627\u0644\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062f\u0647. \u062a\u0648\u0644\u06cc\u062f \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0645\u0645\u06a9\u0646\u0647 \u0686\u0646\u062f \u062f\u0642\u06cc\u0642\u0647 \u0637\u0648\u0644 \u0628\u06a9\u0634\u0647. \u0627\u06af\u0631 \u0628\u0631\u0627\u06cc \u0647\u0631 \u0645\u0631\u062d\u0644\u0647 \u06cc\u06a9 Notification \u062c\u062f\u06cc\u062f \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0628\u0634\u0647\u060c \u0646\u062a\u06cc\u062c\u0647 \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u062f\u0631 \u062d\u0627\u0644 \u0622\u0645\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0641\u0627\u06cc\u0644&#8230;<\/li>\n\n\n\n<li>\u06f2\u06f0 \u062f\u0631\u0635\u062f \u0627\u0646\u062c\u0627\u0645 \u0634\u062f&#8230;<\/li>\n\n\n\n<li>\u06f4\u06f0 \u062f\u0631\u0635\u062f \u0627\u0646\u062c\u0627\u0645 \u0634\u062f&#8230;<\/li>\n\n\n\n<li>\u06f6\u06f0 \u062f\u0631\u0635\u062f \u0627\u0646\u062c\u0627\u0645 \u0634\u062f&#8230;<\/li>\n\n\n\n<li>\u0641\u0627\u06cc\u0644 \u0622\u0645\u0627\u062f\u0647 \u0634\u062f&#8230;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u062a\u062c\u0631\u0628\u0647 \u0627\u0635\u0644\u0627\u064b \u062e\u0648\u0628 \u0646\u06cc\u0633\u062a. \u062f\u0631 \u0639\u0648\u0636\u060c \u0641\u0642\u0637 \u06cc\u06a9 Notification \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647 \u0648 \u0645\u062a\u0646 \u06cc\u0627 \u0646\u0648\u0627\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a \u0647\u0645\u0648\u0646 \u0627\u0639\u0644\u0627\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u0632 \u062f\u06cc\u062f \u06a9\u0627\u0631\u0628\u0631\u060c \u0647\u0645\u0647\u200c\u0686\u06cc\u0632 \u0645\u0631\u062a\u0628\u200c\u062a\u0631 \u0648 \u062d\u0631\u0641\u0647\u200c\u0627\u06cc\u200c\u062a\u0631 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc\u0627\u062f.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Live Update \u0628\u0627 Notification \u0686\u0647 \u0641\u0631\u0642\u06cc \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u06cc\u0644\u06cc\u200c\u0647\u0627 \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646 Live Update \u06cc\u06a9 \u0646\u0648\u0639 \u062c\u062f\u06cc\u062f \u0627\u0632 Notification \u0647\u0633\u062a\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0627\u06cc\u0646\u200c\u0637\u0648\u0631 \u0646\u06cc\u0633\u062a. Live Update \u062f\u0631 \u0648\u0627\u0642\u0639 \u06cc\u06a9 <strong>\u0627\u0644\u06af\u0648\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Notification<\/strong> \u0645\u062d\u0633\u0648\u0628 \u0645\u06cc\u0634\u0647. \u06cc\u0639\u0646\u06cc \u0627\u0639\u0644\u0627\u0646 \u0627\u0632 \u0628\u06cc\u0646 \u0646\u0645\u06cc\u0631\u0647 \u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u0633\u0627\u062e\u062a\u0647 \u0646\u0645\u06cc\u0634\u0647\u060c \u0628\u0644\u06a9\u0647 \u0647\u0645\u0648\u0646 \u0627\u0639\u0644\u0627\u0646 \u0642\u0628\u0644\u06cc \u0628\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062c\u062f\u06cc\u062f \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u0634\u0647. \u0645\u062b\u0644\u0627\u064b \u0627\u0628\u062a\u062f\u0627 \u0646\u0648\u0634\u062a\u0647:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u062d\u0627\u0644 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644&#8230;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u0628\u0639\u062f \u0647\u0645\u0627\u0646 Notification \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0645\u06cc\u0634\u0647:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u06f5\u06f0 \u062f\u0631\u0635\u062f \u0622\u067e\u0644\u0648\u062f \u0634\u062f&#8230;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648 \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u0634\u0647 \u0628\u0647:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u0622\u067e\u0644\u0648\u062f \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u062f.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u06a9\u0627\u0631\u0628\u0631 \u0641\u0642\u0637 \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u0645\u06cc\u200c\u0628\u06cc\u0646\u0647 \u06a9\u0647 \u0645\u062d\u062a\u0648\u0627\u06cc \u0627\u0648\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0686\u0647 \u062c\u0627\u0647\u0627\u06cc\u06cc Live Update \u06a9\u0627\u0631\u0628\u0631\u062f \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0631 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a <strong>\u0686\u0646\u062f \u0645\u0631\u062d\u0644\u0647\u200c\u0627\u06cc<\/strong> \u06cc\u0627 <strong>\u0632\u0645\u0627\u0646\u200c\u0628\u0631<\/strong> \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c Live Update \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u0646\u0627\u0633\u0628\u06cc \u0628\u0627\u0634\u0647. \u0645\u062b\u0644\u0627\u064b \u0648\u0642\u062a\u06cc \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0628\u0632\u0631\u06af \u062f\u0627\u0646\u0644\u0648\u062f \u06cc\u0627 \u0622\u067e\u0644\u0648\u062f \u0645\u06cc\u0634\u0647\u060c \u0648\u0642\u062a\u06cc \u0645\u0633\u06cc\u0631 \u0633\u0641\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646 \u062f\u0631 \u062d\u0627\u0644 \u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a\u0647\u060c \u0648\u0642\u062a\u06cc \u06cc\u06a9 \u0633\u0641\u0627\u0631\u0634 \u062f\u0631 \u0686\u0646\u062f \u0645\u0631\u062d\u0644\u0647 \u0622\u0645\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647 \u06cc\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u0637\u0648\u0644\u0627\u0646\u06cc \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627\u0633\u062a\u060c \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062a\u062c\u0631\u0628\u0647 \u062e\u06cc\u0644\u06cc \u0628\u0647\u062a\u0631\u06cc \u0646\u0633\u0628\u062a \u0628\u0647 \u0627\u0631\u0633\u0627\u0644 \u0686\u0646\u062f\u06cc\u0646 \u0627\u0639\u0644\u0627\u0646 \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u062c\u0647 \u0645\u0634\u062a\u0631\u06a9 \u0647\u0645\u0647 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644\u200c\u0647\u0627 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u062f <strong>\u0648\u0636\u0639\u06cc\u062a \u0647\u0645\u0627\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a<\/strong> \u0631\u0648 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u0647\u060c \u0646\u0647 \u0627\u06cc\u0646\u06a9\u0647 \u0647\u0631 \u0686\u0646\u062f \u0644\u062d\u0638\u0647 \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u062c\u062f\u06cc\u062f \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0647 Live Update \u0627\u062d\u062a\u06cc\u0627\u062c \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0646\u0633\u062e\u0647 \u0641\u0639\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0646\u0647. \u0628\u06cc\u0634\u062a\u0631 \u0627\u062a\u0641\u0627\u0642\u200c\u0647\u0627\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0647\u0633\u062a\u0646\u061b \u0645\u062b\u0644\u0627\u064b \u06a9\u0627\u0647\u0634 \u0642\u06cc\u0645\u062a \u06cc\u06a9 \u06a9\u0627\u0644\u0627 \u06cc\u0627 \u0627\u0636\u0627\u0641\u0647 \u0634\u062f\u0646 \u06cc\u06a9 \u0645\u062d\u0635\u0648\u0644 \u062c\u062f\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0686\u0646\u06cc\u0646 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc\u06cc \u06cc\u06a9 Notification \u0633\u0627\u062f\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u06a9\u0627\u0641\u06cc\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u0641\u0631\u0636 \u06a9\u0646 \u0628\u0639\u062f\u0627\u064b \u0642\u0627\u0628\u0644\u06cc\u062a\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0628\u062a\u0648\u0646\u0647 \u0627\u0632 \u0647\u0632\u0627\u0631\u0627\u0646 \u06a9\u0627\u0644\u0627 \u062e\u0631\u0648\u062c\u06cc PDF \u06cc\u0627 Excel \u0628\u06af\u06cc\u0631\u0647. \u0627\u06af\u0631 \u0622\u0645\u0627\u062f\u0647 \u0634\u062f\u0646 \u0641\u0627\u06cc\u0644 \u062f\u0648 \u06cc\u0627 \u0633\u0647 \u062f\u0642\u06cc\u0642\u0647 \u0637\u0648\u0644 \u0628\u06a9\u0634\u0647\u060c Live Update \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u062e\u06cc\u0644\u06cc \u062e\u0648\u0628\u06cc \u0628\u0627\u0634\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0642\u0637 \u06cc\u06a9 Notification \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u062f\u0647 \u0648 \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u067e\u06cc\u0634\u0631\u0641\u062a \u0639\u0645\u0644\u06cc\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u0645\u06cc\u0634\u0647\u060c \u0647\u0645\u0648\u0646 \u0627\u0639\u0644\u0627\u0646 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0686\u0637\u0648\u0631\u06cc \u06cc\u06a9 Notification \u0631\u0648 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06a9\u0646\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u06a9\u062a\u0647 \u062c\u0627\u0644\u0628 \u0627\u06cc\u0646\u062c\u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc Notification \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a Notification \u062c\u062f\u06cc\u062f\u06cc \u0628\u0633\u0627\u0632\u06cc\u0645. \u06a9\u0627\u0641\u06cc\u0647 \u062f\u0648\u0628\u0627\u0631\u0647 Notification \u0631\u0648 \u0628\u0627 <strong>\u0647\u0645\u0627\u0646 Notification ID<\/strong> \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>notificationManager.notify(\n    DOWNLOAD_NOTIFICATION_ID,\n    updatedNotification\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">notificationManager.<\/span><span style=\"color: #6F42C1\">notify<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    DOWNLOAD_NOTIFICATION_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    updatedNotification<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0686\u0648\u0646 \u0634\u0646\u0627\u0633\u0647 \u0627\u0639\u0644\u0627\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0646\u06a9\u0631\u062f\u0647\u060c \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0627\u0639\u0644\u0627\u0646 \u0642\u0628\u0644\u06cc \u0631\u0648 \u062d\u0630\u0641 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647\u061b \u0641\u0642\u0637 \u0645\u062d\u062a\u0648\u0627\u06cc \u0627\u0648\u0646 \u0631\u0648 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u06cc\u0646 \u06cc\u06a9\u06cc \u0627\u0632 \u0633\u0627\u062f\u0647\u200c\u062a\u0631\u06cc\u0646 \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u067e\u0631\u06a9\u0627\u0631\u0628\u0631\u062f\u062a\u0631\u06cc\u0646 \u062a\u06a9\u0646\u06cc\u06a9\u200c\u0647\u0627\u06cc Notification \u062f\u0631 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0646\u0645\u0627\u06cc\u0634 \u0646\u0648\u0627\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0631\u0627\u06cc\u062c\u200c\u062a\u0631\u06cc\u0646 \u06a9\u0627\u0631\u0628\u0631\u062f\u0647\u0627\u06cc Live Update\u060c \u0646\u0645\u0627\u06cc\u0634 Progress Bar \u0647\u0633\u062a. \u0645\u062b\u0644\u0627\u064b \u0648\u0642\u062a\u06cc \u06f4\u06f0 \u062f\u0631\u0635\u062f \u0639\u0645\u0644\u06cc\u0627\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u062f\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>builder.setProgress(\n    100,\n    40,\n    false\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">builder.<\/span><span style=\"color: #6F42C1\">setProgress<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">100<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">40<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648 \u0648\u0642\u062a\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u062a\u0645\u0648\u0645 \u0634\u062f:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>builder.setProgress(\n    0,\n    0,\n    false\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">builder.<\/span><span style=\"color: #6F42C1\">setProgress<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">0<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">0<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0647\u0645 Notification \u0628\u0627 \u0645\u062a\u0646 \u062c\u062f\u06cc\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u0634\u0647. \u06a9\u0627\u0631\u0628\u0631 \u0627\u062d\u0633\u0627\u0633 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u0648\u0627\u0642\u0639\u0627\u064b \u062f\u0631 \u062d\u0627\u0644 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0648 \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0628\u0627\u0632 \u06a9\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0647\u0631 \u0686\u0646\u062f \u0648\u0642\u062a \u06cc\u06a9 \u0628\u0627\u0631 \u0628\u0627\u06cc\u062f \u0627\u0639\u0644\u0627\u0646 \u0631\u0648 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06a9\u0646\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc \u0631\u0627\u06cc\u062c \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0647\u0631 \u06cc\u06a9 \u062f\u0631\u0635\u062f \u062a\u063a\u06cc\u06cc\u0631\u060c Notification \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0628\u0634\u0647. \u0641\u0631\u0636 \u06a9\u0646 \u062f\u0627\u0646\u0644\u0648\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0627\u0632 \u0635\u0641\u0631 \u062a\u0627 \u0635\u062f \u062f\u0631\u0635\u062f \u067e\u06cc\u0634 \u0645\u06cc\u0631\u0647. \u0627\u06af\u0631 \u0635\u062f \u0628\u0627\u0631 Notification \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u0647\u060c \u0647\u0645 \u0645\u0646\u0627\u0628\u0639 \u0628\u06cc\u0634\u062a\u0631\u06cc \u0645\u0635\u0631\u0641 \u0645\u06cc\u0634\u0647 \u0648 \u0647\u0645 \u0647\u06cc\u0686 \u0627\u0631\u0632\u0634 \u062e\u0627\u0635\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647. \u0628\u0647\u062a\u0631\u0647 \u0641\u0642\u0637 \u0632\u0645\u0627\u0646\u06cc \u0627\u0639\u0644\u0627\u0646 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0628\u0634\u0647 \u06a9\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u0648\u0627\u0642\u0639\u0627\u064b \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647 \u0628\u0627\u0634\u0647\u061b \u0645\u062b\u0644\u0627\u064b \u0647\u0631 \u062f\u0647 \u062f\u0631\u0635\u062f \u06cc\u0627 \u0648\u0642\u062a\u06cc \u0645\u0631\u062d\u0644\u0647 \u0645\u0647\u0645\u06cc \u0627\u0632 \u0639\u0645\u0644\u06cc\u0627\u062a \u062a\u0645\u0648\u0645 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647. \u0647\u062f\u0641 Live Update \u0646\u0645\u0627\u06cc\u0634 \u0647\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0648\u0686\u06cc\u06a9 \u0646\u06cc\u0633\u062a\u061b \u0647\u062f\u0641 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062d\u0633\u0627\u0633 \u06a9\u0646\u0647 \u0627\u0632 \u0648\u0636\u0639\u06cc\u062a \u06a9\u0644\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u0628\u0627\u062e\u0628\u0631\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Live Update \u0686\u0647 \u0641\u0631\u0642\u06cc \u0628\u0627 Foreground Service \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06af\u0627\u0647\u06cc \u0627\u06cc\u0646 \u062f\u0648 \u0628\u0627 \u0647\u0645 \u0627\u0634\u062a\u0628\u0627\u0647 \u06af\u0631\u0641\u062a\u0647 \u0645\u06cc\u0634\u0646. Foreground Service \u0628\u0631\u0627\u06cc \u0632\u0645\u0627\u0646\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647 \u06a9\u0647 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u0637\u0648\u0644\u0627\u0646\u06cc <strong>\u0648\u0627\u0642\u0639\u0627\u064b \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627<\/strong>\u0633\u062a \u0648 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0628\u0627\u06cc\u062f \u0627\u062c\u0627\u0632\u0647 \u0628\u062f\u0647 \u0627\u0648\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u0627\u062f\u0627\u0645\u0647 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0647. \u062f\u0631 \u0686\u0646\u06cc\u0646 \u0634\u0631\u0627\u06cc\u0637\u06cc \u0645\u0639\u0645\u0648\u0644\u0627\u064b Notification \u0647\u0645 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 Live Update \u0641\u0642\u0637 \u062f\u0631\u0628\u0627\u0631\u0647 <strong>\u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0627\u062e\u0644 \u0647\u0645\u0627\u0646 Notification<\/strong> \u0635\u062d\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647. \u062e\u06cc\u0644\u06cc \u0648\u0642\u062a\u200c\u0647\u0627 \u0627\u06cc\u0646 \u062f\u0648 \u06a9\u0646\u0627\u0631 \u0647\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0646. \u0645\u062b\u0644\u0627\u064b \u06cc\u06a9 Foreground Service \u0645\u0633\u0626\u0648\u0644 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0628\u0632\u0631\u06af\u0647 \u0648 \u0647\u0645\u0632\u0645\u0627\u0646 Notification \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u0648\u0646 \u0633\u0631\u0648\u06cc\u0633 \u0628\u0647 \u0635\u0648\u0631\u062a Live Update \u067e\u06cc\u0634\u0631\u0641\u062a \u0622\u067e\u0644\u0648\u062f \u0631\u0648 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u062f\u0647. \u0627\u0645\u0627 \u0627\u0632 \u0646\u0638\u0631 \u0645\u0641\u0647\u0648\u0645\u06cc\u060c \u0627\u06cc\u0646 \u062f\u0648 \u06cc\u06a9\u06cc \u0646\u06cc\u0633\u062a\u0646.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0686\u0647 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc\u06cc \u062a\u0648 Live Update \u067e\u06cc\u0634 \u0645\u06cc\u0627\u062f\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc \u0631\u0627\u06cc\u062c \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0647 \u062c\u0627\u06cc \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0627\u0639\u0644\u0627\u0646 \u0642\u0628\u0644\u06cc\u060c \u0647\u0631 \u0628\u0627\u0631 \u06cc\u06a9 Notification \u062c\u062f\u06cc\u062f \u0633\u0627\u062e\u062a\u0647 \u0628\u0634\u0647. \u0646\u062a\u06cc\u062c\u0647 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0634\u0644\u0648\u063a \u0634\u062f\u0646 \u0646\u0648\u0627\u0631 \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u0633\u062a. \u0627\u0634\u062a\u0628\u0627\u0647 \u0628\u0639\u062f\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u062a\u0645\u0648\u0645 \u0628\u0634\u0647\u060c \u0627\u0645\u0627 Notification \u0647\u0645\u0686\u0646\u0627\u0646 \u0648\u0636\u0639\u06cc\u062a \u00ab\u062f\u0631 \u062d\u0627\u0644 \u0627\u0646\u062c\u0627\u0645\u00bb \u0631\u0648 \u0646\u0634\u0648\u0646 \u0628\u062f\u0647. \u0648\u0642\u062a\u06cc \u06a9\u0627\u0631 \u067e\u0627\u06cc\u0627\u0646 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u060c \u06cc\u0627 \u0628\u0627\u06cc\u062f \u0645\u062a\u0646 \u0627\u0639\u0644\u0627\u0646 \u0628\u0647 \u0646\u062a\u06cc\u062c\u0647 \u0646\u0647\u0627\u06cc\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u0647 \u06cc\u0627 \u0627\u06af\u0631 \u062f\u06cc\u06af\u0631 \u0627\u0631\u0632\u0634\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0646\u062f\u0627\u0631\u0647\u060c \u0627\u0639\u0644\u0627\u0646 \u062d\u0630\u0641 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u0636\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u0647\u0645 \u0622\u0646\u200c\u0642\u062f\u0631 \u0632\u06cc\u0627\u062f Notification \u0631\u0648 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646 \u06a9\u0647 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0622\u0632\u0627\u0631\u062f\u0647\u0646\u062f\u0647 \u0645\u06cc\u0634\u0647. \u0628\u0647\u062a\u0631\u0647 \u0641\u0642\u0637 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0645\u0647\u0645 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0628\u0634\u0646.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Live Update \u06cc\u06a9 \u0642\u0627\u0628\u0644\u06cc\u062a \u062c\u062f\u0627 \u0627\u0632 Notification \u0646\u06cc\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 \u06cc\u06a9 \u0631\u0648\u0634 \u0647\u0648\u0634\u0645\u0646\u062f\u0627\u0646\u0647 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Notification\u0647\u0627\u0633\u062a. \u0628\u0647 \u062c\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0631\u0627\u06cc \u0647\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u062c\u062f\u06cc\u062f \u0633\u0627\u062e\u062a\u0647 \u0628\u0634\u0647\u060c \u0647\u0645\u0627\u0646 \u0627\u0639\u0644\u0627\u0646 \u0642\u0628\u0644\u06cc \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u0634\u0647 \u0648 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648\u0646\u062f \u067e\u06cc\u0634\u0631\u0641\u062a \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0648 \u062f\u0631 \u06cc\u06a9 \u062c\u0627\u06cc \u062b\u0627\u0628\u062a \u062f\u0646\u0628\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u0645\u062b\u0644 <strong>\u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 <\/strong>\u0634\u0627\u06cc\u062f \u0627\u0645\u0631\u0648\u0632 \u06a9\u0627\u0631\u0628\u0631\u062f \u0632\u06cc\u0627\u062f\u06cc \u0628\u0631\u0627\u06cc Live Update \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0627\u0645\u0627 \u0627\u06af\u0631 \u062f\u0631 \u0622\u06cc\u0646\u062f\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a\u200c\u0647\u0627\u06cc \u0632\u0645\u0627\u0646\u200c\u0628\u0631\u06cc \u0645\u062b\u0644 \u062a\u0648\u0644\u06cc\u062f \u06af\u0632\u0627\u0631\u0634\u060c \u062e\u0631\u0648\u062c\u06cc \u06af\u0631\u0641\u062a\u0646 \u0627\u0632 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06cc\u0627 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0636\u0627\u0641\u0647 \u0628\u0634\u0646\u060c \u0627\u06cc\u0646 \u0631\u0648\u0634 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0628\u0647\u062a\u0631\u06cc \u0646\u0633\u0628\u062a \u0628\u0647 \u0627\u0631\u0633\u0627\u0644 \u0686\u0646\u062f\u06cc\u0646 Notification \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u0646\u06a9\u062a\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 <strong>Live Update \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0631\u0648\u0646\u062f \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647\u060c \u0646\u0647 \u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u200c\u0631\u0633\u0627\u0646\u06cc \u062f\u0631\u0628\u0627\u0631\u0647 \u0686\u0646\u062f \u0627\u062a\u0641\u0627\u0642 \u0645\u0633\u062a\u0642\u0644.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u0686\u0647\u0644\u200c\u0648\u0647\u0641\u062a\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">\u0622\u0646\u0644\u0627\u06cc\u0646 \u0648 \u0622\u0641\u0644\u0627\u06cc\u0646 \u0628\u0648\u062f\u0646 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b \u0627\u0632 \u06a9\u062c\u0627 \u0645\u06cc\u200c\u0641\u0647\u0645\u06cc\u0645 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u0648\u0627\u0631\u062f \u062a\u0644\u06af\u0631\u0627\u0645 \u0645\u06cc\u0634\u06cc \u0648 \u0632\u06cc\u0631 \u0627\u0633\u0645 \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062e\u0627\u0637\u0628\u200c\u0647\u0627 \u0646\u0648\u0634\u062a\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Online<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u0627 \u0648\u0627\u0631\u062f \u0648\u0627\u062a\u0633\u0627\u067e \u0645\u06cc\u0634\u06cc \u0648 \u0645\u06cc\u200c\u0628\u06cc\u0646\u06cc \u0646\u0648\u0634\u062a\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Last seen today at 10:35<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0634\u0627\u06cc\u062f \u062f\u0631 \u0646\u06af\u0627\u0647 \u0627\u0648\u0644 \u0641\u06a9\u0631 \u06a9\u0646\u06cc \u0633\u06cc\u0633\u062a\u0645\u200c\u0639\u0627\u0645\u0644 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u062e\u0648\u062f\u0634 \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0648 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u0645\u06cc\u0630\u0627\u0631\u0647\u060c \u0627\u0645\u0627 \u0627\u0635\u0644\u0627\u064b \u0627\u06cc\u0646\u200c\u0637\u0648\u0631 \u0646\u06cc\u0633\u062a. \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u06cc\u0686 API\u0627\u06cc \u0646\u062f\u0627\u0631\u0647 \u06a9\u0647 \u0628\u06af\u0647 \u0641\u0644\u0627\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646\u0647 \u06cc\u0627 \u0622\u0641\u0644\u0627\u06cc\u0646\u0647. \u062f\u0631 \u0648\u0627\u0642\u0639 \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0645\u0644\u0627\u064b \u062a\u0648\u0633\u0637 <strong>\u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0628\u0631\u0646\u0627\u0645\u0647<\/strong> \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u0639\u0646\u06cc \u0648\u0642\u062a\u06cc \u062a\u0644\u06af\u0631\u0627\u0645 \u0645\u06cc\u06af\u0647 \u06cc\u06a9 \u0646\u0641\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646\u0647\u060c \u062f\u0631 \u062d\u0642\u06cc\u0642\u062a \u0627\u06cc\u0646 \u0633\u0631\u0648\u0631 \u062a\u0644\u06af\u0631\u0627\u0645\u0647 \u06a9\u0647 \u062a\u0634\u062e\u06cc\u0635 \u062f\u0627\u062f\u0647 \u0627\u0648\u0646 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0645\u062a\u0635\u0644\u0647 \u0648 \u0627\u06cc\u0646 \u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u0628\u0647 \u0628\u0642\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u0637\u0644\u0627\u0639 \u0645\u06cc\u062f\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0622\u0646\u0644\u0627\u06cc\u0646 \u06cc\u0627 \u0622\u0641\u0644\u0627\u06cc\u0646 \u0628\u0648\u062f\u0646 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u060c \u0628\u06cc\u0634\u062a\u0631 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u06cc\u06a9 \u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f\u06cc \u0628\u0627\u0634\u0647\u060c \u06cc\u06a9 \u0645\u0641\u0647\u0648\u0645 \u062f\u0631 \u0637\u0631\u0627\u062d\u06cc \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u0633\u0645\u062a \u0633\u0631\u0648\u0631\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b \u0622\u0646\u0644\u0627\u06cc\u0646 \u0628\u0648\u062f\u0646 \u06cc\u0639\u0646\u06cc \u0686\u06cc\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0633\u0624\u0627\u0644 \u0634\u0627\u06cc\u062f \u0633\u0627\u062f\u0647 \u0628\u0647 \u0646\u0638\u0631 \u0628\u0631\u0633\u0647\u060c \u0627\u0645\u0627 \u062c\u0648\u0627\u0628\u0634 \u0627\u0648\u0646\u200c\u0642\u062f\u0631\u0647\u0627 \u0647\u0645 \u0648\u0627\u0636\u062d \u0646\u06cc\u0633\u062a. \u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0647 \u0648 \u062f\u0627\u062e\u0644 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u0647. \u0637\u0628\u06cc\u0639\u062a\u0627\u064b \u0645\u06cc\u0634\u0647 \u06af\u0641\u062a \u0622\u0646\u0644\u0627\u06cc\u0646\u0647. \u0627\u0645\u0627 \u0627\u06af\u0631 \u06af\u0648\u0634\u06cc \u0631\u0648 \u0642\u0641\u0644 \u06a9\u0646\u0647 \u0686\u06cc\u061f \u0627\u06af\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0646\u0648\u0632 \u0628\u0627\u0632 \u0628\u0627\u0634\u0647 \u0648\u0644\u06cc \u0635\u0641\u062d\u0647 \u062e\u0627\u0645\u0648\u0634 \u0628\u0627\u0634\u0647 \u0686\u06cc\u061f \u0627\u06af\u0631 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0628\u0631\u0627\u06cc \u062f\u0647 \u062b\u0627\u0646\u06cc\u0647 \u0642\u0637\u0639 \u0628\u0634\u0647 \u0686\u06cc\u061f \u0627\u06af\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u0628\u0627\u0634\u0647 \u0686\u06cc\u061f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u0647 \u0627\u06cc\u0646 \u0633\u0624\u0627\u0644\u200c\u0647\u0627 \u0646\u0634\u0648\u0646 \u0645\u06cc\u062f\u0646 \u06a9\u0647 \u00ab\u0622\u0646\u0644\u0627\u06cc\u0646 \u0628\u0648\u062f\u0646\u00bb \u06cc\u06a9 \u062a\u0639\u0631\u06cc\u0641 \u0641\u0646\u06cc \u062b\u0627\u0628\u062a \u0646\u062f\u0627\u0631\u0647. \u0647\u0631 \u067e\u0631\u0648\u0698\u0647 \u0628\u0627\u06cc\u062f \u062e\u0648\u062f\u0634 \u062a\u0635\u0645\u06cc\u0645 \u0628\u06af\u06cc\u0631\u0647 \u062f\u0642\u06cc\u0642\u0627\u064b \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646 \u0645\u062d\u0633\u0648\u0628 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0633\u0631\u0648\u0631 \u0627\u0632 \u06a9\u062c\u0627 \u0645\u06cc\u200c\u0641\u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0647\u0646\u0648\u0632 \u0622\u0646\u0644\u0627\u06cc\u0646\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0627\u0632 WebSocket \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0627\u0631\u062a\u0628\u0627\u0637 WebSocket \u0628\u0631\u0642\u0631\u0627\u0631 \u0628\u0627\u0634\u0647\u060c \u0633\u0631\u0648\u0631 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0645\u0637\u0645\u0626\u0646\u0647 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646\u0647. \u0627\u0645\u0627 \u0627\u06af\u0631 \u0627\u0631\u062a\u0628\u0627\u0637 \u0642\u0637\u0639 \u0628\u0634\u0647\u060c \u0633\u0631\u0648\u0631 \u0645\u062a\u0648\u062c\u0647 \u0645\u06cc\u0634\u0647 \u0627\u062a\u0635\u0627\u0644 \u0627\u0632 \u0628\u06cc\u0646 \u0631\u0641\u062a\u0647 \u0648 \u0648\u0636\u0639\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0628\u0647 \u0622\u0641\u0644\u0627\u06cc\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u062f\u0647. \u0627\u06af\u0631 \u0647\u0645 \u067e\u0631\u0648\u0698\u0647 \u0627\u0632 WebSocket \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u06a9\u0646\u0647\u060c \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a HTTP \u0628\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647\u060c \u0632\u0645\u0627\u0646 \u0622\u062e\u0631\u06cc\u0646 \u0641\u0639\u0627\u0644\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u062b\u0628\u062a \u0645\u06cc\u0634\u0647. \u062f\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a \u0634\u0627\u06cc\u062f \u0633\u0631\u0648\u0631 \u062a\u0635\u0645\u06cc\u0645 \u0628\u06af\u06cc\u0631\u0647 \u0627\u06af\u0631 \u0645\u062b\u0644\u0627\u064b \u067e\u0646\u062c \u062f\u0642\u06cc\u0642\u0647 \u0647\u06cc\u0686 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u0627\u0632 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u0646\u06a9\u0631\u062f\u060c \u0627\u0648\u0646 \u0631\u0648 \u0622\u0641\u0644\u0627\u06cc\u0646 \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0622\u0646\u0644\u0627\u06cc\u0646 \u0628\u0648\u062f\u0646 \u0647\u0645\u06cc\u0634\u0647 \u0628\u0647 \u0645\u0639\u0646\u06cc \u0628\u0627\u0632 \u0628\u0648\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u06cc\u0633\u062a\u061b \u0628\u06cc\u0634\u062a\u0631 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc\u0647 \u06a9\u0647 <strong>\u0633\u0631\u0648\u0631 \u0647\u0646\u0648\u0632 \u0627\u0631\u062a\u0628\u0627\u0637 \u0645\u0624\u062b\u0631\u06cc \u0628\u0627 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0627\u0631\u0647.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u062e\u0631\u06cc\u0646 \u0632\u0645\u0627\u0646 \u0641\u0639\u0627\u0644\u06cc\u062a (Last Seen)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u06cc\u0644\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u0628\u0647 \u062c\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0641\u0642\u0637 \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u06cc\u0627 \u0622\u0641\u0644\u0627\u06cc\u0646 \u0631\u0648 \u0646\u0634\u0648\u0646 \u0628\u062f\u0646\u060c \u0622\u062e\u0631\u06cc\u0646 \u0632\u0645\u0627\u0646 \u062d\u0636\u0648\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0647\u0645 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646. \u0645\u062b\u0644\u0627\u064b:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0622\u062e\u0631\u06cc\u0646 \u0628\u0627\u0632\u062f\u06cc\u062f \u06f2 \u062f\u0642\u06cc\u0642\u0647 \u067e\u06cc\u0634<\/li>\n\n\n\n<li>\u0622\u062e\u0631\u06cc\u0646 \u0628\u0627\u0632\u062f\u06cc\u062f \u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a \u06f1\u06f4:\u06f2\u06f0<\/li>\n\n\n\n<li>\u0622\u062e\u0631\u06cc\u0646 \u0628\u0627\u0632\u062f\u06cc\u062f \u062f\u06cc\u0631\u0648\u0632<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062e\u06cc\u0644\u06cc \u0645\u0641\u06cc\u062f\u062a\u0631 \u0627\u0632 \u06cc\u06a9 \u0648\u0636\u0639\u06cc\u062a \u0633\u0627\u062f\u0647 \u00abOffline\u00bb \u0647\u0633\u062a\u0646\u060c \u0686\u0648\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647\u062a\u0631 \u0645\u062a\u0648\u062c\u0647 \u0645\u06cc\u0634\u0647 \u0622\u062e\u0631\u06cc\u0646 \u0641\u0639\u0627\u0644\u06cc\u062a \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u0628\u0648\u062f\u0647. \u0627\u0632 \u0646\u0638\u0631 \u0641\u0646\u06cc \u0647\u0645 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u0648\u0646 \u0633\u0627\u062f\u0647 \u0627\u0633\u062a. \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0641\u0639\u0627\u0644\u06cc\u062a \u0645\u0647\u0645\u06cc \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u062f\u0647\u060c \u0633\u0631\u0648\u0631 \u0641\u0642\u0637 \u0632\u0645\u0627\u0646 \u0641\u0639\u0644\u06cc \u0631\u0648 \u062f\u0627\u062e\u0644 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u06af\u0631 \u0627\u0631\u062a\u0628\u0627\u0637 \u0642\u0637\u0639 \u0634\u062f\u060c \u0647\u0645\u0648\u0646 \u0632\u0645\u0627\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 Last Seen \u0628\u0627\u0642\u06cc \u0645\u06cc\u200c\u0645\u0648\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0627\u0635\u0644\u0627\u064b \u0628\u0647 \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u062d\u062a\u06cc\u0627\u062c \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0646\u0633\u062e\u0647 \u0641\u0639\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0646\u0647. \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u06cc\u06a9 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u06cc\u0627 \u067e\u06cc\u0627\u0645\u200c\u0631\u0633\u0627\u0646 \u0646\u06cc\u0633\u062a \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0628\u062e\u0648\u0627\u0646 \u0648\u0636\u0639\u06cc\u062a \u062d\u0636\u0648\u0631 \u0647\u0645\u062f\u06cc\u06af\u0647 \u0631\u0648 \u0628\u0628\u06cc\u0646\u0646. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0646\u0645\u0627\u06cc\u0634 Online \u06cc\u0627 Offline \u0647\u06cc\u0686 \u0627\u0631\u0632\u0634 \u062e\u0627\u0635\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u0641\u0631\u0636 \u06a9\u0646 \u062f\u0631 \u0622\u06cc\u0646\u062f\u0647 \u06cc\u06a9 \u0628\u062e\u0634 \u06af\u0641\u062a\u200c\u0648\u06af\u0648\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646 \u0628\u06cc\u0646 \u0645\u0634\u062a\u0631\u06cc \u0648 \u0641\u0631\u0648\u0634\u0646\u062f\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645. \u062f\u0631 \u0627\u0648\u0646 \u0635\u0648\u0631\u062a \u062e\u06cc\u0644\u06cc \u0645\u0641\u06cc\u062f \u0645\u06cc\u0634\u0647 \u0627\u06af\u0631 \u0645\u0634\u062a\u0631\u06cc \u0628\u062f\u0648\u0646\u0647 \u0641\u0631\u0648\u0634\u0646\u062f\u0647 \u0627\u0644\u0622\u0646 \u0622\u0646\u0644\u0627\u06cc\u0646\u0647 \u06cc\u0627 \u0622\u062e\u0631\u06cc\u0646 \u0628\u0627\u0631 \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0648\u062f\u0647. \u06cc\u0627 \u0627\u06af\u0631 \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645\u060c \u0646\u0645\u0627\u06cc\u0634 \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u0627\u067e\u0631\u0627\u062a\u0648\u0631\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062e\u06cc\u0644\u06cc \u0628\u0647\u062a\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u06af\u0631 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0646\u0627\u06af\u0647\u0627\u0646 \u0642\u0637\u0639 \u0628\u0634\u0647 \u0686\u06cc\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0686\u0627\u0644\u0634\u200c\u0647\u0627\u06cc \u0645\u0647\u0645 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0647\u0645\u06cc\u0634\u0647 \u0641\u0631\u0635\u062a \u062e\u062f\u0627\u062d\u0627\u0641\u0638\u06cc \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u0647. \u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a \u0648 \u0646\u0627\u06af\u0647\u0627\u0646 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0645\u06cc\u0634\u0647 \u06cc\u0627 \u0628\u0627\u062a\u0631\u06cc \u06af\u0648\u0634\u06cc \u062a\u0645\u0648\u0645 \u0645\u06cc\u0634\u0647. \u062f\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u0627\u064b \u0641\u0631\u0635\u062a \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0628\u06af\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00ab\u0645\u0646 \u062f\u0627\u0631\u0645 \u062e\u0627\u0631\u062c \u0645\u06cc\u0634\u0645.\u00bb<br>\u067e\u0633 \u0633\u0631\u0648\u0631 \u0627\u0632 \u06a9\u062c\u0627 \u0628\u0627\u06cc\u062f \u0628\u0641\u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0641\u062a\u0647\u061f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0627\u0647\u200c\u062d\u0644 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0633\u0631\u0648\u0631 \u0641\u0642\u0637 \u0628\u0647 \u067e\u06cc\u0627\u0645 \u00ab\u062e\u0631\u0648\u062c\u00bb \u0627\u0639\u062a\u0645\u0627\u062f \u0646\u06a9\u0646\u0647. \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0627\u06af\u0631 \u0627\u0631\u062a\u0628\u0627\u0637 WebSocket \u0642\u0637\u0639 \u0628\u0634\u0647 \u06cc\u0627 \u062a\u0627 \u0645\u062f\u062a \u0645\u0634\u062e\u0635\u06cc \u0647\u06cc\u0686 \u0641\u0639\u0627\u0644\u06cc\u062a\u06cc \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631 \u062f\u06cc\u062f\u0647 \u0646\u0634\u0647\u060c \u0633\u0631\u0648\u0631 \u062e\u0648\u062f\u0634 \u0648\u0636\u0639\u06cc\u062a \u0627\u0648\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0628\u0647 \u0622\u0641\u0644\u0627\u06cc\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u062f\u0647. \u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u062d\u0631\u0641\u0647\u200c\u0627\u06cc\u060c \u0642\u0637\u0639 \u0634\u062f\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u0632 \u062e\u0648\u062f \u067e\u06cc\u0627\u0645 \u062e\u0631\u0648\u062c \u0645\u0647\u0645\u200c\u062a\u0631\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Heartbeat \u06cc\u0639\u0646\u06cc \u0686\u06cc\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u062f\u0648 \u0646\u0641\u0631 \u0628\u0627 \u0628\u06cc\u200c\u0633\u06cc\u0645 \u0628\u0627 \u0647\u0645 \u062f\u0631 \u0627\u0631\u062a\u0628\u0627\u0637 \u0647\u0633\u062a\u0646. \u0627\u06af\u0631 \u0686\u0646\u062f \u062f\u0642\u06cc\u0642\u0647 \u0647\u06cc\u0686 \u0635\u062f\u0627\u06cc\u06cc \u0627\u0632 \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0646\u0634\u0646\u0648\u06cc\u060c \u0627\u0632 \u06a9\u062c\u0627 \u0628\u0641\u0647\u0645\u06cc \u0647\u0646\u0648\u0632 \u067e\u0634\u062a \u062f\u0633\u062a\u06af\u0627\u0647 \u0647\u0633\u062a \u06cc\u0627 \u0627\u0631\u062a\u0628\u0627\u0637 \u0642\u0637\u0639 \u0634\u062f\u0647\u061f \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646 \u0647\u0645 \u062f\u0642\u06cc\u0642\u0627\u064b \u0647\u0645\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u062d\u0644 \u0627\u06cc\u0646 \u0645\u0633\u0626\u0644\u0647\u060c \u062e\u06cc\u0644\u06cc \u0627\u0632 \u0633\u0631\u0648\u0631\u0647\u0627 \u0647\u0631 \u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u062e\u06cc\u0644\u06cc \u06a9\u0648\u0686\u06a9 \u0628\u06cc\u0646 \u062e\u0648\u062f\u0634\u0648\u0646 \u0648 \u06a9\u0644\u0627\u06cc\u0646\u062a \u0631\u062f\u0648\u0628\u062f\u0644 \u0645\u06cc\u200c\u06a9\u0646\u0646. \u0628\u0647 \u0627\u06cc\u0646 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u062f\u0648\u0631\u0647\u200c\u0627\u06cc <strong>Heartbeat<\/strong> \u0645\u06cc\u06af\u0646. \u062a\u0627 \u0648\u0642\u062a\u06cc Heartbeat \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u0634\u0647\u060c \u0633\u0631\u0648\u0631 \u0645\u06cc\u200c\u062f\u0648\u0646\u0647 \u0627\u0631\u062a\u0628\u0627\u0637 \u0647\u0646\u0648\u0632 \u0632\u0646\u062f\u0647 \u0627\u0633\u062a. \u0627\u0645\u0627 \u0627\u06af\u0631 \u0686\u0646\u062f \u0628\u0627\u0631 \u067e\u0634\u062a \u0633\u0631 \u0647\u0645 \u0627\u06cc\u0646 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627 \u0646\u0631\u0633\u0646\u060c \u0646\u062a\u06cc\u062c\u0647 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647 \u06a9\u0647 \u0627\u062a\u0635\u0627\u0644 \u0627\u0632 \u0628\u06cc\u0646 \u0631\u0641\u062a\u0647 \u0648 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0622\u0641\u0644\u0627\u06cc\u0646 \u0627\u0639\u0644\u0627\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0642\u062a \u06a9\u0646 \u06a9\u0647 Heartbeat \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0633\u0644\u0627\u0645\u062a \u0627\u0631\u062a\u0628\u0627\u0637\u0647 \u0648 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0647\u06cc\u0686 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0647\u0645\u06cc \u062f\u0627\u062e\u0644\u0634 \u0631\u062f\u0648\u0628\u062f\u0644 \u0646\u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 \u0647\u0645\u06cc\u0634\u0647 \u0628\u0627\u06cc\u062f \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u062f\u0642\u06cc\u0642 \u0628\u0627\u0634\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0647. \u062e\u06cc\u0644\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u0639\u0645\u062f\u0627\u064b \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u0631\u0648 \u0628\u0627 \u06a9\u0645\u06cc \u062a\u0623\u062e\u06cc\u0631 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u062f\u0646. \u0645\u062b\u0644\u0627\u064b \u0645\u0645\u06a9\u0646\u0647 \u06a9\u0627\u0631\u0628\u0631 \u067e\u0646\u062c \u062b\u0627\u0646\u06cc\u0647 \u067e\u06cc\u0634 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0627\u0631\u062c \u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u0627\u0645\u0627 \u0647\u0646\u0648\u0632 Online \u062f\u06cc\u062f\u0647 \u0628\u0634\u0647. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u0646\u0648\u0633\u0627\u0646\u200c\u0647\u0627\u06cc \u06a9\u0648\u062a\u0627\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u06cc\u0627 \u0642\u0637\u0639 \u0648 \u0648\u0635\u0644 \u0634\u062f\u0646\u200c\u0647\u0627\u06cc \u0644\u062d\u0638\u0647\u200c\u0627\u06cc\u060c \u0645\u0631\u062a\u0628 \u0648\u0636\u0639\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0646\u062f\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06af\u0627\u0647\u06cc \u0647\u0645 \u0627\u06cc\u0646 \u062a\u0623\u062e\u06cc\u0631 \u0628\u0647 \u062f\u0644\u0627\u06cc\u0644 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062d\u0631\u06cc\u0645 \u062e\u0635\u0648\u0635\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u0634\u0647. \u0628\u0639\u0636\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u0627\u0635\u0644\u0627\u064b \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u0631\u0648 \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0646\u0645\u06cc\u062f\u0646 \u062a\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0642\u06cc\u0642\u200c\u062a\u0631\u06cc \u0627\u0632 \u0631\u0641\u062a\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0641\u0627\u0634 \u0646\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u0631\u0648 \u06a9\u062c\u0627 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc \u0631\u0627\u06cc\u062c \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u0641\u0642\u0637 \u062f\u0627\u062e\u0644 \u062d\u0627\u0641\u0638\u0647 \u06af\u0648\u0634\u06cc \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0634\u0647. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0647\u06cc\u0686 \u0641\u0627\u06cc\u062f\u0647\u200c\u0627\u06cc \u0646\u062f\u0627\u0631\u0647\u060c \u0686\u0648\u0646 \u0628\u0642\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0628\u0627\u06cc\u062f \u0628\u062f\u0648\u0646\u0646 \u06cc\u06a9 \u0646\u0641\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646\u0647 \u06cc\u0627 \u0646\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc <strong>\u0633\u0631\u0648\u0631<\/strong> \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u0631\u0627\u06cc \u0647\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0622\u06cc\u0627 \u0627\u0644\u0622\u0646 \u0622\u0646\u0644\u0627\u06cc\u0646 \u0627\u0633\u062a\u061f<\/li>\n\n\n\n<li>\u0622\u062e\u0631\u06cc\u0646 \u0632\u0645\u0627\u0646 \u0641\u0639\u0627\u0644\u06cc\u062a \u0686\u0647 \u0645\u0648\u0642\u0639 \u0628\u0648\u062f\u0647\u061f<\/li>\n\n\n\n<li>\u0622\u062e\u0631\u06cc\u0646 Heartbeat \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0634\u062f\u0647\u061f<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0648\u0627\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u06cc\u0634\u0647 \u06cc\u0627 \u0627\u0631\u062a\u0628\u0627\u0637\u0634 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u0634\u0647\u060c \u0633\u0631\u0648\u0631 \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0648 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0686\u0647 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc\u06cc \u062a\u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0622\u0646\u0644\u0627\u06cc\u0646 \u067e\u06cc\u0634 \u0645\u06cc\u0627\u062f\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627\u06cc \u0631\u0627\u06cc\u062c \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0641\u0642\u0637 \u0647\u0646\u06af\u0627\u0645 \u062e\u0631\u0648\u062c \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0636\u0639\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u0622\u0641\u0644\u0627\u06cc\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0647 \u0628\u0634\u0647. \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u062e\u06cc\u0644\u06cc \u0648\u0642\u062a\u200c\u0647\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u0627\u064b \u0641\u0631\u0635\u062a \u0627\u0631\u0633\u0627\u0644 \u067e\u06cc\u0627\u0645 \u062e\u0631\u0648\u062c \u0631\u0648 \u067e\u06cc\u062f\u0627 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u062e\u0648\u062f\u0634 \u0642\u0637\u0639 \u0634\u062f\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0631\u0648 \u062a\u0634\u062e\u06cc\u0635 \u0628\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0634\u062a\u0628\u0627\u0647 \u0628\u0639\u062f\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u0641\u0642\u0637 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0628\u0627\u0632 \u0628\u0648\u062f\u0646 Activity \u062a\u0639\u06cc\u06cc\u0646 \u0628\u0634\u0647. \u0645\u0645\u06a9\u0646\u0647 Activity \u0628\u0633\u062a\u0647 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u0627\u0645\u0627 \u0627\u0631\u062a\u0628\u0627\u0637 WebSocket \u0647\u0646\u0648\u0632 \u0628\u0631\u0642\u0631\u0627\u0631 \u0628\u0627\u0634\u0647\u060c \u06cc\u0627 \u0628\u0631\u0639\u06a9\u0633 Activity \u0628\u0627\u0632 \u0628\u0627\u0634\u0647 \u0648\u0644\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u0628\u0627\u06cc\u062f \u0628\u0631 \u0627\u0633\u0627\u0633 <strong>\u0627\u0631\u062a\u0628\u0627\u0637 \u0648\u0627\u0642\u0639\u06cc \u0628\u0627 \u0633\u0631\u0648\u0631<\/strong> \u062a\u0639\u06cc\u06cc\u0646 \u0628\u0634\u0647\u060c \u0646\u0647 \u0635\u0631\u0641\u0627\u064b \u0648\u0636\u0639\u06cc\u062a \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u0636\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647\u200c\u0647\u0627 \u0647\u0645 \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u0631\u0648 \u0628\u06cc\u0634 \u0627\u0632 \u062d\u062f \u062f\u0642\u06cc\u0642 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u062f\u0646 \u0648 \u0628\u0627 \u0647\u0631 \u0642\u0637\u0639 \u0648 \u0648\u0635\u0644 \u0634\u062f\u0646 \u06a9\u0648\u062a\u0627\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u060c \u06a9\u0627\u0631\u0628\u0631 \u0628\u06cc\u0646 Online \u0648 Offline \u062c\u0627\u0628\u0647\u200c\u062c\u0627 \u0645\u06cc\u0634\u0647. \u0627\u06cc\u0646 \u0631\u0641\u062a\u0627\u0631 \u0647\u0645 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062e\u0648\u0628\u06cc \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0647\u0645 \u0628\u0627\u0639\u062b \u0627\u0631\u0633\u0627\u0644 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u0628\u0647 \u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0622\u0646\u0644\u0627\u06cc\u0646 \u06cc\u0627 \u0622\u0641\u0644\u0627\u06cc\u0646 \u0628\u0648\u062f\u0646 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u06cc\u06a9 \u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f\u06cc \u0646\u06cc\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 \u0628\u062e\u0634\u06cc \u0627\u0632 \u0637\u0631\u0627\u062d\u06cc \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u0633\u0645\u062a \u0633\u0631\u0648\u0631\u0647. \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0628\u0631 \u0627\u0633\u0627\u0633 \u0627\u0631\u062a\u0628\u0627\u0637\u06cc \u06a9\u0647 \u0628\u0627 \u0647\u0631 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0627\u0631\u0647\u060c \u062a\u0634\u062e\u06cc\u0635 \u0628\u062f\u0647 \u0622\u06cc\u0627 \u0627\u0648\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0647\u0646\u0648\u0632 \u0645\u062a\u0635\u0644\u0647 \u06cc\u0627 \u0646\u0647 \u0648 \u062f\u0631 \u0635\u0648\u0631\u062a \u0646\u06cc\u0627\u0632\u060c \u0622\u062e\u0631\u06cc\u0646 \u0632\u0645\u0627\u0646 \u0641\u0639\u0627\u0644\u06cc\u062a\u0634 \u0631\u0648 \u0647\u0645 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u0645\u062b\u0644 <strong>GheimatBan<\/strong> \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 \u06af\u0641\u062a\u200c\u0648\u06af\u0648\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646 \u06cc\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0632\u0646\u062f\u0647 \u0627\u0636\u0627\u0641\u0647 \u0646\u0634\u062f\u0647 \u0628\u0627\u0634\u0646\u060c \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u0647. \u0627\u0645\u0627 \u0627\u06af\u0631 \u0631\u0648\u0632\u06cc \u0686\u0646\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646\u0627\u062a\u06cc \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0636\u0627\u0641\u0647 \u0628\u0634\u0646\u060c \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u0646\u06a9\u062a\u0647\u200c\u0647\u0627 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0644\u0627\u06cc\u0646 \u0631\u0648 \u0628\u0631 \u0627\u0633\u0627\u0633 <strong>\u0627\u062a\u0635\u0627\u0644 \u0648\u0627\u0642\u0639\u06cc \u0628\u0647 \u0633\u0631\u0648\u0631<\/strong> \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u06cc\u060c \u0646\u0647 \u0635\u0631\u0641\u0627\u064b \u0628\u0631 \u0627\u0633\u0627\u0633 \u0628\u0627\u0632 \u06cc\u0627 \u0628\u0633\u062a\u0647 \u0628\u0648\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647. \u0627\u06cc\u0646 \u062a\u0641\u0627\u0648\u062a \u06a9\u0648\u0686\u06a9\u060c \u06cc\u06a9\u06cc \u0627\u0632 \u0686\u06cc\u0632\u0647\u0627\u06cc\u06cc\u0647 \u06a9\u0647 \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u062d\u0631\u0641\u0647\u200c\u0627\u06cc \u0631\u0648 \u0627\u0632 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627\u06cc \u0633\u0627\u062f\u0647 \u062c\u062f\u0627 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u0686\u0647\u0644\u200c\u0648\u0647\u0634\u062a\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">\u0646\u0645\u0627\u06cc\u0634 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b \u0686\u0631\u0627 \u0628\u0627\u06cc\u062f \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0631\u0648 \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0648\u0627\u0631\u062f \u0635\u0641\u062d\u0647 \u0642\u06cc\u0645\u062a \u06cc\u06a9 \u06a9\u0627\u0644\u0627 \u0634\u062f\u0647 \u0648 \u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 \u00ab\u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0642\u06cc\u0645\u062a\u00bb \u0645\u06cc\u0632\u0646\u0647. \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0686\u0646\u062f \u0644\u062d\u0638\u0647 \u0642\u0628\u0644 \u0642\u0637\u0639 \u0634\u062f\u0647\u060c \u0627\u0645\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u06cc\u0686 \u067e\u06cc\u0627\u0645\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0646\u0645\u06cc\u062f\u0647 \u0648 \u062f\u06a9\u0645\u0647 \u0647\u0645 \u0638\u0627\u0647\u0631\u0627\u064b \u0648\u0627\u06a9\u0646\u0634\u06cc \u0646\u062f\u0627\u0631\u0647. \u06a9\u0627\u0631\u0628\u0631 \u0646\u0645\u06cc\u200c\u062f\u0648\u0646\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0631 \u062d\u0627\u0644 \u0627\u0646\u062c\u0627\u0645\u0647\u060c \u0633\u0631\u0648\u0631 \u062c\u0648\u0627\u0628 \u0646\u0645\u06cc\u062f\u0647\u060c \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062e\u0648\u062f\u0634 \u0642\u0637\u0639 \u0634\u062f\u0647 \u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0646\u06af \u06a9\u0631\u062f\u0647. \u0645\u0645\u06a9\u0646\u0647 \u0686\u0646\u062f \u0628\u0627\u0631 \u067e\u0634\u062a \u0633\u0631 \u0647\u0645 \u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 \u0628\u0632\u0646\u0647\u060c \u0635\u0641\u062d\u0647 \u0631\u0648 \u0628\u0628\u0646\u062f\u0647 \u06cc\u0627 \u062d\u062a\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u062e\u0631\u0627\u0628 \u062a\u0635\u0648\u0631 \u06a9\u0646\u0647. \u0646\u0645\u0627\u06cc\u0634 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u062f\u0642\u06cc\u0642\u0627\u064b \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0647\u0645\u06cc\u0646 \u0633\u0631\u062f\u0631\u06af\u0645\u06cc\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0628\u06af\u0647 \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u0628\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u0646\u062f\u0627\u0631\u0647 \u0648 \u0628\u0639\u0636\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0645\u06a9\u0646\u0647 \u0642\u062f\u06cc\u0645\u06cc \u0628\u0627\u0634\u0646. \u0627\u0644\u0628\u062a\u0647 \u0627\u06cc\u0646 \u067e\u06cc\u0627\u0645 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u0634\u06a9\u0644 \u06cc\u06a9 Dialog \u0628\u0632\u0631\u06af \u0648 \u0622\u0632\u0627\u0631\u062f\u0647\u0646\u062f\u0647 \u0638\u0627\u0647\u0631 \u0628\u0634\u0647\u061b \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u06cc\u06a9 \u0646\u0648\u0627\u0631 \u0628\u0627\u0631\u06cc\u06a9 \u0628\u0627\u0644\u0627\u06cc \u0635\u0641\u062d\u0647 \u06cc\u0627 \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u06a9\u0648\u0686\u06a9 \u062f\u0627\u062e\u0644 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06a9\u0627\u0641\u06cc \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u062f\u0631\u0633 \u0641\u0642\u0637 \u062f\u0631\u0628\u0627\u0631\u0647 \u0638\u0627\u0647\u0631 \u067e\u06cc\u0627\u0645 \u062d\u0631\u0641 \u0646\u0645\u06cc\u200c\u0632\u0646\u06cc\u0645\u060c \u0628\u0644\u06a9\u0647 \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u0648\u0627\u0642\u0639\u06cc \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0627\u0632 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u062f\u0627\u062e\u0644 <code>StateFlow<\/code> \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u0647 \u0648 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc Compose \u0631\u0648 \u0628\u0647 \u0635\u0648\u0631\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0646\u062a\u06cc\u062c\u0647 \u06a9\u0627\u0631 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0648\u0642\u062a\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0645\u06cc\u0634\u0647\u060c \u06cc\u06a9 \u0646\u0648\u0627\u0631 \u0642\u0631\u0645\u0632 \u0628\u0627\u0644\u0627\u06cc \u0635\u0641\u062d\u0647 \u0638\u0627\u0647\u0631 \u0645\u06cc\u0634\u0647 \u0648 \u0648\u0642\u062a\u06cc \u0627\u062a\u0635\u0627\u0644 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0647\u060c \u067e\u06cc\u0627\u0645 \u00ab\u0627\u062a\u0635\u0627\u0644 \u0628\u0631\u0642\u0631\u0627\u0631 \u0634\u062f\u00bb \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647. \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0627\u0632 <code>ConnectivityManager<\/code>\u060c \u06a9\u0644\u0627\u0633 <code>NetworkCallback<\/code> \u0648 \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc <code>NetworkCapabilities<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0628\u0627 <code>NetworkCallback<\/code> \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0637\u0644\u0627\u0639 \u0645\u06cc\u062f\u0647 \u0648 \u0628\u0631\u0627\u06cc \u0645\u062a\u0648\u0642\u0641 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u062f\u0631\u06cc\u0627\u0641\u062a \u0647\u0645 \u0628\u0627\u06cc\u062f Callback \u0631\u0648 \u0628\u0627 <code>unregisterNetworkCallback<\/code> \u0622\u0632\u0627\u062f \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0648\u0635\u0644 \u0628\u0648\u062f\u0646 \u0628\u0647 Wi-Fi \u0628\u0627 \u062f\u0627\u0634\u062a\u0646 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u06cc\u06a9\u06cc \u0646\u06cc\u0633\u062a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0642\u0628\u0644 \u0627\u0632 \u0646\u0648\u0634\u062a\u0646 \u06a9\u062f \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u062a\u0641\u0627\u0648\u062a \u0645\u0647\u0645 \u0631\u0648 \u0628\u0641\u0647\u0645\u06cc\u0645. \u0645\u0645\u06a9\u0646\u0647 \u06af\u0648\u0634\u06cc \u0628\u0647 Wi-Fi \u0648\u0635\u0644 \u0628\u0627\u0634\u0647\u060c \u0627\u0645\u0627 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0648\u0627\u0642\u0639\u06cc \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0645\u062b\u0644\u0627\u064b \u0645\u0648\u062f\u0645 \u0631\u0648\u0634\u0646\u0647 \u0648\u0644\u06cc \u062e\u0637 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u0634 \u0642\u0637\u0639 \u0634\u062f\u0647\u060c \u06cc\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 Wi-Fi \u06cc\u06a9 \u0647\u062a\u0644 \u0648\u0635\u0644 \u0634\u062f\u0647 \u0627\u0645\u0627 \u0647\u0646\u0648\u0632 \u0635\u0641\u062d\u0647 \u0648\u0631\u0648\u062f \u0634\u0628\u06a9\u0647 \u0631\u0648 \u062a\u06a9\u0645\u06cc\u0644 \u0646\u06a9\u0631\u062f\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u0646\u0648\u0639 \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0628\u0627 \u062f\u06cc\u062f\u0646 Wi-Fi \u06cc\u0627 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0647\u0645\u0631\u0627\u0647 \u0628\u06af\u06cc\u0645 \u06a9\u0627\u0631\u0628\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646\u0647. \u062f\u0627\u062e\u0644 <code>NetworkCapabilities<\/code> \u0642\u0627\u0628\u0644\u06cc\u062a\u06cc \u0628\u0647 \u0646\u0627\u0645 <code>NET_CAPABILITY_INTERNET<\/code> \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647 \u06a9\u0647 \u0645\u06cc\u06af\u0647 \u0627\u06cc\u0646 \u0634\u0628\u06a9\u0647 \u0627\u0635\u0648\u0644\u0627\u064b \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u0647\u060c \u0627\u0645\u0627 \u0647\u0645\u06cc\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0645 \u062a\u0636\u0645\u06cc\u0646 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0648\u0627\u0642\u0639\u0627\u064b \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0642\u0627\u0628\u0644\u06cc\u062a \u0645\u0647\u0645\u200c\u062a\u0631 <code>NET_CAPABILITY_VALIDATED<\/code> \u0627\u0633\u062a. \u0648\u0642\u062a\u06cc \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u06cc\u0639\u0646\u06cc \u0633\u06cc\u0633\u062a\u0645\u200c\u0639\u0627\u0645\u0644 \u0627\u062a\u0635\u0627\u0644 \u0634\u0628\u06a9\u0647 \u0628\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0639\u0645\u0648\u0645\u06cc \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0631\u062f\u0647 \u0648 \u0627\u0648\u0646 \u0631\u0648 \u0645\u0639\u062a\u0628\u0631 \u062a\u0634\u062e\u06cc\u0635 \u062f\u0627\u062f\u0647. \u067e\u0633 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0628\u0647\u062a\u0631\u0647 \u0647\u0631 \u062f\u0648 \u0642\u0627\u0628\u0644\u06cc\u062a <code>INTERNET<\/code> \u0648 <code>VALIDATED<\/code> \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u062d\u062a\u06cc <code>VALIDATED<\/code> \u0647\u0645 \u0628\u0647 \u0645\u0639\u0646\u06cc \u0633\u0627\u0644\u0645 \u0628\u0648\u062f\u0646 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0646\u06cc\u0633\u062a\u061b \u0645\u0645\u06a9\u0646\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u06a9\u0627\u0631 \u06a9\u0646\u0647 \u0627\u0645\u0627 API \u067e\u0631\u0648\u0698\u0647 \u0627\u0632 \u062f\u0633\u062a\u0631\u0633 \u062e\u0627\u0631\u062c \u0634\u062f\u0647 \u0628\u0627\u0634\u0647. \u067e\u0633 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0648 \u0648\u0636\u0639\u06cc\u062a \u0633\u0631\u0648\u0631 \u062f\u0648 \u0645\u0641\u0647\u0648\u0645 \u062c\u062f\u0627 \u0647\u0633\u062a\u0646 \u0648 \u0628\u0639\u062f\u0627\u064b \u062f\u0631\u0628\u0627\u0631\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a \u062e\u0637\u0627\u0647\u0627\u06cc API \u0647\u0645 \u0635\u062d\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0648\u0644 \u0645\u062c\u0648\u0632 \u0628\u0631\u0631\u0633\u06cc \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u062a\u0648\u0646\u0647 \u0648\u0636\u0639\u06cc\u062a \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647\u060c \u0628\u0627\u06cc\u062f \u0645\u062c\u0648\u0632 <code>ACCESS_NETWORK_STATE<\/code> \u0631\u0648 \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644 <code>AndroidManifest.xml<\/code> \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645. \u0627\u06cc\u0646 \u0645\u062c\u0648\u0632 \u0627\u0632 \u0646\u0648\u0639 \u0645\u0639\u0645\u0648\u0644\u06cc\u0647 \u0648 \u0628\u0631\u062e\u0644\u0627\u0641 \u0645\u062c\u0648\u0632\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 \u062f\u0648\u0631\u0628\u06cc\u0646 \u06cc\u0627 \u0645\u0648\u0642\u0639\u06cc\u062a \u0645\u06a9\u0627\u0646\u06cc\u060c \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0627\u0632\u0647 \u0628\u06af\u06cc\u0631\u06cc\u0645. \u0641\u0642\u0637 \u06a9\u0627\u0641\u06cc\u0647 \u0627\u0648\u0646 \u0631\u0648 \u0628\u06cc\u0631\u0648\u0646 \u0627\u0632 \u062a\u06af <code>application<\/code> \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\">\n\n    &lt;uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" \/>\n\n    &lt;application\n        android:name=\".GheimatBanApplication\"\n        android:theme=\"@style\/Theme.GheimatBan\">\n\n        &lt;!-- Activities -->\n\n    &lt;\/application>\n\n&lt;\/manifest>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">manifest xmlns:<\/span><span style=\"color: #6F42C1\">android<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">uses<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">permission android:<\/span><span style=\"color: #6F42C1\">name<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;android.permission.ACCESS_NETWORK_STATE&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        android:<\/span><span style=\"color: #6F42C1\">name<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;.GheimatBanApplication&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        android:<\/span><span style=\"color: #6F42C1\">theme<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;@style\/Theme.GheimatBan&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;!--<\/span><span style=\"color: #24292E\"> Activities <\/span><span style=\"color: #D73A49\">--&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">application<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">manifest<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u062f\u0648\u0646 \u0627\u06cc\u0646 \u0645\u062c\u0648\u0632\u060c \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0628\u0639\u0636\u06cc \u0645\u062a\u062f\u0647\u0627\u06cc <code>ConnectivityManager<\/code> \u0645\u0645\u06a9\u0646 \u0646\u06cc\u0633\u062a. \u062f\u0642\u062a \u06a9\u0646 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u062a\u0634\u062e\u06cc\u0635 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u0645\u062c\u0648\u0632 <code>INTERNET<\/code> \u0631\u0648 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u06a9\u0646\u06cc\u061b <code>INTERNET<\/code> \u0627\u062c\u0627\u0632\u0647 \u0627\u0631\u0633\u0627\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0645\u06cc\u062f\u0647\u060c \u0627\u0645\u0627 <code>ACCESS_NETWORK_STATE<\/code> \u0627\u062c\u0627\u0632\u0647 \u0628\u0631\u0631\u0633\u06cc \u0648\u0636\u0639\u06cc\u062a \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u062a\u0635\u0644 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0647\u0631 \u062f\u0648 \u0645\u062c\u0648\u0632 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0646.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;uses-permission android:name=\"android.permission.INTERNET\" \/>\n&lt;uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" \/>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">uses<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">permission android:<\/span><span style=\"color: #6F42C1\">name<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;android.permission.INTERNET&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">uses<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">permission android:<\/span><span style=\"color: #6F42C1\">name<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;android.permission.ACCESS_NETWORK_STATE&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0631\u0648 \u0628\u0627 \u0686\u0646\u062f \u062d\u0627\u0644\u062a \u0645\u0634\u062e\u0635 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u0641\u0642\u0637 \u0628\u0627 \u06cc\u06a9 \u0645\u0642\u062f\u0627\u0631 <code>Boolean<\/code> \u0646\u06af\u0647 \u062f\u0627\u0631\u06cc\u0645\u061b \u06cc\u0639\u0646\u06cc <code>true<\/code> \u0628\u0631\u0627\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646 \u0648 <code>false<\/code> \u0628\u0631\u0627\u06cc \u0622\u0641\u0644\u0627\u06cc\u0646. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u062f\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u062e\u06cc\u0644\u06cc \u0633\u0627\u062f\u0647 \u062c\u0648\u0627\u0628 \u0645\u06cc\u062f\u0647\u060c \u0627\u0645\u0627 \u06cc\u06a9 \u0645\u0634\u06a9\u0644 \u062f\u0627\u0631\u0647: \u0648\u0642\u062a\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0627\u0632\u0647 \u0627\u062c\u0631\u0627 \u0634\u062f\u0647 \u0648 \u0647\u0646\u0648\u0632 \u0648\u0636\u0639\u06cc\u062a \u0634\u0628\u06a9\u0647 \u0631\u0648 \u062a\u0634\u062e\u06cc\u0635 \u0646\u062f\u0627\u062f\u0647\u060c \u0646\u0645\u06cc\u200c\u062f\u0648\u0646\u06cc\u0645 \u0628\u0627\u06cc\u062f \u0645\u0642\u062f\u0627\u0631 \u0627\u0648\u0644\u06cc\u0647 \u0631\u0648 \u0622\u0646\u0644\u0627\u06cc\u0646 \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u06cc\u0645 \u06cc\u0627 \u0622\u0641\u0644\u0627\u06cc\u0646. \u0627\u06af\u0647 \u0645\u0642\u062f\u0627\u0631 \u0627\u0648\u0644\u06cc\u0647 \u0631\u0648 \u0627\u0634\u062a\u0628\u0627\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u0645\u060c \u0645\u0645\u06a9\u0646\u0647 \u0628\u0631\u0627\u06cc \u06a9\u0633\u0631\u06cc \u0627\u0632 \u062b\u0627\u0646\u06cc\u0647 \u067e\u06cc\u0627\u0645 \u0646\u0627\u062f\u0631\u0633\u062a\u06cc \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u062f\u06cc\u062f\u0647 \u0628\u0634\u0647. \u0628\u0631\u0627\u06cc \u0647\u0645\u06cc\u0646 \u0628\u0647\u062a\u0631\u0647 \u0628\u0647 \u062c\u0627\u06cc Boolean \u06cc\u06a9 \u0645\u062f\u0644 \u0686\u0646\u062f\u062d\u0627\u0644\u062a\u0647 \u0628\u0633\u0627\u0632\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>enum class ConnectionStatus {\n    CHECKING,\n    AVAILABLE,\n    UNAVAILABLE\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">enum<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">ConnectionStatus<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    CHECKING,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    AVAILABLE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    UNAVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u062a <code>CHECKING<\/code> \u06cc\u0639\u0646\u06cc \u0647\u0646\u0648\u0632 \u062f\u0631 \u062d\u0627\u0644 \u0628\u0631\u0631\u0633\u06cc \u0627\u062a\u0635\u0627\u0644 \u0647\u0633\u062a\u06cc\u0645. \u062d\u0627\u0644\u062a <code>AVAILABLE<\/code> \u06cc\u0639\u0646\u06cc \u0634\u0628\u06a9\u0647 \u0645\u0639\u062a\u0628\u0631 \u0648 \u062f\u0627\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062a\u0634\u062e\u06cc\u0635 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0648 <code>UNAVAILABLE<\/code> \u06cc\u0639\u0646\u06cc \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u0686\u0646\u06cc\u0646 \u0627\u062a\u0635\u0627\u0644\u06cc \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u0647. \u0628\u0639\u062f\u0627\u064b \u0627\u06af\u0647 \u0628\u062e\u0648\u0627\u06cc\u0645 \u0648\u0636\u0639\u06cc\u062a\u200c\u0647\u0627\u06cc \u062f\u0642\u06cc\u0642\u200c\u062a\u0631\u06cc \u0645\u062b\u0644 \u00ab\u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0628\u0631\u0642\u0631\u0627\u0631 \u0648\u0644\u06cc \u0633\u0631\u0648\u0631 \u0642\u0637\u0639 \u0627\u0633\u062a\u00bb \u06cc\u0627 \u00ab\u062f\u0631 \u062d\u0627\u0644 \u0627\u062a\u0635\u0627\u0644 \u0645\u062c\u062f\u062f\u00bb \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0647\u0645\u06cc\u0646 \u0645\u062f\u0644 \u0631\u0648 \u06af\u0633\u062a\u0631\u0634 \u0628\u062f\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u06a9\u0644\u0627\u0633 \u0627\u0635\u0644\u06cc \u0628\u0631\u0631\u0633\u06cc \u0627\u062a\u0635\u0627\u0644 \u0631\u0648 \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0628\u0647 \u0646\u0627\u0645 <code>ConnectionObserver<\/code> \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645. \u0648\u0638\u06cc\u0641\u0647 \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0634\u0628\u06a9\u0647 \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u0647 \u0648 \u0622\u062e\u0631\u06cc\u0646 \u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u062f\u0627\u062e\u0644 \u06cc\u06a9 <code>StateFlow<\/code> \u0642\u0631\u0627\u0631 \u0628\u062f\u0647. \u062f\u0644\u06cc\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>StateFlow<\/code> \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0647\u0645\u06cc\u0634\u0647 \u0622\u062e\u0631\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0631\u0648 \u0646\u06af\u0647 \u0645\u06cc\u200c\u062f\u0627\u0631\u0647 \u0648 \u0647\u0631 \u0635\u0641\u062d\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0628\u0647 \u0627\u0648\u0646 \u06af\u0648\u0634 \u0628\u062f\u0647\u060c \u0628\u0647 \u0645\u062d\u0636 \u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u0634\u0647. \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u06cc\u06a9 Activity \u062e\u0627\u0635 \u0648\u0627\u0628\u0633\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0686\u0648\u0646 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u06cc\u06a9 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0639\u0645\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban.network\n\nimport android.content.Context\nimport android.net.ConnectivityManager\nimport android.net.Network\nimport android.net.NetworkCapabilities\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\n\nclass ConnectionObserver(context: Context) {\n\n    private val connectivityManager =\n        context.applicationContext.getSystemService(\n            Context.CONNECTIVITY_SERVICE\n        ) as ConnectivityManager\n\n    private val _status = MutableStateFlow(ConnectionStatus.CHECKING)\n    val status: StateFlow&lt;ConnectionStatus> = _status.asStateFlow()\n\n    private var isRegistered = false\n\n    private val networkCallback =\n        object : ConnectivityManager.NetworkCallback() {\n\n            override fun onCapabilitiesChanged(\n                network: Network,\n                networkCapabilities: NetworkCapabilities\n            ) {\n                _status.value =\n                    if (networkCapabilities.hasInternetAccess()) {\n                        ConnectionStatus.AVAILABLE\n                    } else {\n                        ConnectionStatus.UNAVAILABLE\n                    }\n            }\n\n            override fun onLost(network: Network) {\n                _status.value = ConnectionStatus.UNAVAILABLE\n            }\n\n            override fun onUnavailable() {\n                _status.value = ConnectionStatus.UNAVAILABLE\n            }\n        }\n\n    fun start() {\n        if (isRegistered) return\n\n        updateCurrentStatus()\n        connectivityManager.registerDefaultNetworkCallback(networkCallback)\n        isRegistered = true\n    }\n\n    fun stop() {\n        if (!isRegistered) return\n\n        connectivityManager.unregisterNetworkCallback(networkCallback)\n        isRegistered = false\n    }\n\n    private fun updateCurrentStatus() {\n        val activeNetwork = connectivityManager.activeNetwork\n\n        if (activeNetwork == null) {\n            _status.value = ConnectionStatus.UNAVAILABLE\n            return\n        }\n\n        val capabilities =\n            connectivityManager.getNetworkCapabilities(activeNetwork)\n\n        _status.value =\n            if (capabilities?.hasInternetAccess() == true) {\n                ConnectionStatus.AVAILABLE\n            } else {\n                ConnectionStatus.UNAVAILABLE\n            }\n    }\n\n    private fun NetworkCapabilities.hasInternetAccess(): Boolean {\n        val hasInternet =\n            hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)\n\n        val isValidated =\n            hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)\n\n        return hasInternet &amp;&amp; isValidated\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.network<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.content.Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.net.ConnectivityManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.net.Network<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.net.NetworkCapabilities<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">kotlinx.coroutines.flow.MutableStateFlow<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">kotlinx.coroutines.flow.StateFlow<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">kotlinx.coroutines.flow.asStateFlow<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">ConnectionObserver<\/span><span style=\"color: #24292E\">(context: <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> connectivityManager <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context.applicationContext.<\/span><span style=\"color: #6F42C1\">getSystemService<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Context.CONNECTIVITY_SERVICE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ) <\/span><span style=\"color: #D73A49\">as<\/span><span style=\"color: #24292E\"> ConnectivityManager<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> _status <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">MutableStateFlow<\/span><span style=\"color: #24292E\">(ConnectionStatus.CHECKING)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> status: <\/span><span style=\"color: #6F42C1\">StateFlow<\/span><span style=\"color: #24292E\">&lt;<\/span><span style=\"color: #6F42C1\">ConnectionStatus<\/span><span style=\"color: #24292E\">&gt; <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> _status.<\/span><span style=\"color: #6F42C1\">asStateFlow<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">var<\/span><span style=\"color: #24292E\"> isRegistered <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">false<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> networkCallback <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        object : <\/span><span style=\"color: #6F42C1\">ConnectivityManager<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">NetworkCallback<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">onCapabilitiesChanged<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                network: <\/span><span style=\"color: #6F42C1\">Network<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                networkCapabilities: <\/span><span style=\"color: #6F42C1\">NetworkCapabilities<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                _status.<\/span><span style=\"color: #D73A49\">value<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (networkCapabilities.<\/span><span style=\"color: #6F42C1\">hasInternetAccess<\/span><span style=\"color: #24292E\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        ConnectionStatus.AVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    } <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        ConnectionStatus.UNAVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">onLost<\/span><span style=\"color: #24292E\">(network: <\/span><span style=\"color: #6F42C1\">Network<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                _status.<\/span><span style=\"color: #D73A49\">value<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> ConnectionStatus.UNAVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">onUnavailable<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                _status.<\/span><span style=\"color: #D73A49\">value<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> ConnectionStatus.UNAVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">start<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (isRegistered) <\/span><span style=\"color: #D73A49\">return<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">updateCurrentStatus<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        connectivityManager.<\/span><span style=\"color: #6F42C1\">registerDefaultNetworkCallback<\/span><span style=\"color: #24292E\">(networkCallback)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        isRegistered <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">stop<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #24292E\">isRegistered) <\/span><span style=\"color: #D73A49\">return<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        connectivityManager.<\/span><span style=\"color: #6F42C1\">unregisterNetworkCallback<\/span><span style=\"color: #24292E\">(networkCallback)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        isRegistered <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">updateCurrentStatus<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> activeNetwork <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> connectivityManager.activeNetwork<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (activeNetwork <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            _status.<\/span><span style=\"color: #D73A49\">value<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> ConnectionStatus.UNAVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> capabilities <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            connectivityManager.<\/span><span style=\"color: #6F42C1\">getNetworkCapabilities<\/span><span style=\"color: #24292E\">(activeNetwork)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        _status.<\/span><span style=\"color: #D73A49\">value<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (capabilities?.<\/span><span style=\"color: #6F42C1\">hasInternetAccess<\/span><span style=\"color: #24292E\">() <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">true<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ConnectionStatus.AVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            } <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ConnectionStatus.UNAVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">NetworkCapabilities<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">hasInternetAccess<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> hasInternet <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">hasCapability<\/span><span style=\"color: #24292E\">(NetworkCapabilities.NET_CAPABILITY_INTERNET)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> isValidated <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">hasCapability<\/span><span style=\"color: #24292E\">(NetworkCapabilities.NET_CAPABILITY_VALIDATED)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> hasInternet <\/span><span style=\"color: #D73A49\">&amp;&amp;<\/span><span style=\"color: #24292E\"> isValidated<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0627\u062e\u0644 <code>start()<\/code> \u0627\u0648\u0644 \u0648\u0636\u0639\u06cc\u062a \u0641\u0639\u0644\u06cc \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0686\u0648\u0646 \u0646\u0645\u06cc\u200c\u062e\u0648\u0627\u06cc\u0645 \u0645\u0646\u062a\u0638\u0631 \u0628\u0645\u0648\u0646\u06cc\u0645 \u062a\u0627 \u06cc\u06a9 \u062a\u063a\u06cc\u06cc\u0631 \u0634\u0628\u06a9\u0647 \u0627\u062a\u0641\u0627\u0642 \u0628\u06cc\u0641\u062a\u0647. \u0628\u0639\u062f <code>registerDefaultNetworkCallback<\/code> \u0631\u0648 \u0635\u062f\u0627 \u0645\u06cc\u200c\u0632\u0646\u06cc\u0645 \u062a\u0627 \u0627\u0632 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0634\u0628\u06a9\u0647 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u062e\u0628\u0631 \u0628\u0634\u06cc\u0645. \u0648\u0642\u062a\u06cc \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc \u0634\u0628\u06a9\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646\u060c \u0645\u062a\u062f <code>onCapabilitiesChanged<\/code> \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647 \u0648 \u0645\u0627 <code>INTERNET<\/code> \u0648 <code>VALIDATED<\/code> \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0648\u0642\u062a\u06cc \u0634\u0628\u06a9\u0647 \u0627\u0632 \u062f\u0633\u062a \u0645\u06cc\u0631\u0647\u060c <code>onLost<\/code> \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647 \u0648 \u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u0622\u0641\u0644\u0627\u06cc\u0646 \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u06cc\u0645. \u062f\u0627\u062e\u0644 Callback \u0628\u0647\u062a\u0631\u0647 \u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u0627\u0632 \u0622\u0631\u06af\u0648\u0645\u0627\u0646\u200c\u0647\u0627\u06cc \u062e\u0648\u062f Callback \u0628\u062e\u0648\u0646\u06cc\u0645 \u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u0645\u062a\u062f\u0647\u0627\u06cc \u0647\u0645\u200c\u0632\u0645\u0627\u0646 <code>ConnectivityManager<\/code> \u0631\u0648 \u0635\u062f\u0627 \u0646\u0632\u0646\u06cc\u0645\u060c \u0686\u0648\u0646 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u062f\u0631\u0628\u0627\u0631\u0647 \u0627\u062d\u062a\u0645\u0627\u0644 \u0627\u06cc\u062c\u0627\u062f Race Condition \u062f\u0631 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0647\u0634\u062f\u0627\u0631 \u062f\u0627\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062a\u063a\u06cc\u0631 <code>isRegistered<\/code> \u0647\u0645 \u062c\u0644\u0648\u06cc \u062b\u0628\u062a \u0686\u0646\u062f\u0628\u0627\u0631\u0647 Callback \u0631\u0648 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. \u0627\u06af\u0647 \u06cc\u06a9 Callback \u0631\u0648 \u0628\u0627\u0631\u0647\u0627 \u062b\u0628\u062a \u06a9\u0646\u06cc\u0645 \u0648\u0644\u06cc \u0622\u0632\u0627\u062f \u0646\u06a9\u0646\u06cc\u0645\u060c \u0647\u0645 \u0627\u062d\u062a\u0645\u0627\u0644 \u0646\u0634\u062a \u0645\u0646\u0627\u0628\u0639 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647 \u0648 \u0647\u0645 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0645\u06a9\u0646\u0647 \u0686\u0646\u062f \u0628\u0627\u0631 \u06cc\u06a9 \u062a\u063a\u06cc\u06cc\u0631 \u0648\u0627\u062d\u062f \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u0647. \u062e\u0648\u062f \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u0645 \u062a\u0639\u062f\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0648 Callback\u0647\u0627\u06cc \u0628\u0627\u0632 \u0647\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0631\u0633\u062a \u062b\u0628\u062a \u0648 \u062d\u0630\u0641 \u0627\u0648\u0646 \u0636\u0631\u0648\u0631\u06cc\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0631\u0648 \u062f\u0631 \u0633\u0637\u062d \u06a9\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u06af\u0647 \u0645\u06cc\u200c\u062f\u0627\u0631\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u0628\u0627\u06cc\u062f \u062a\u0635\u0645\u06cc\u0645 \u0628\u06af\u06cc\u0631\u06cc\u0645 <code>ConnectionObserver<\/code> \u06a9\u062c\u0627 \u0633\u0627\u062e\u062a\u0647 \u0628\u0634\u0647. \u0627\u06af\u0647 \u0627\u0648\u0646 \u0631\u0648 \u062f\u0627\u062e\u0644 \u0647\u0631 \u0635\u0641\u062d\u0647 \u0628\u0633\u0627\u0632\u06cc\u0645\u060c \u0647\u0631 \u0635\u0641\u062d\u0647 \u06cc\u06a9 Callback \u0645\u0633\u062a\u0642\u0644 \u062b\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0647 \u0647\u0645\u0648\u0646 \u0645\u0634\u06a9\u0644 \u062a\u06a9\u0631\u0627\u0631 \u0648 \u0646\u0627\u0647\u0645\u0627\u0647\u0646\u06af\u06cc \u0645\u06cc\u200c\u0631\u0633\u06cc\u0645. \u0628\u0631\u0627\u06cc \u0646\u0633\u062e\u0647 \u0633\u0627\u062f\u0647 \u067e\u0631\u0648\u0698\u0647\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0631\u0648 \u062f\u0627\u062e\u0644 <code>Application<\/code> \u0628\u0633\u0627\u0632\u06cc\u0645 \u062a\u0627 \u0641\u0642\u0637 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 \u062f\u0631 \u06a9\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u062f\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af\u200c\u062a\u0631 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0647\u0645\u06cc\u0646 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0631\u0648 \u0628\u0627 Hilt \u06cc\u0627 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 Dependency Injection \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 ViewModel\u0647\u0627 \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban\n\nimport android.app.Application\nimport com.example.gheimatban.network.ConnectionObserver\n\nclass GheimatBanApplication : Application() {\n\n    lateinit var connectionObserver: ConnectionObserver\n        private set\n\n    override fun onCreate() {\n        super.onCreate()\n\n        connectionObserver = ConnectionObserver(this)\n        connectionObserver.start()\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.app.Application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.network.ConnectionObserver<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">GheimatBanApplication<\/span><span style=\"color: #24292E\"> : <\/span><span style=\"color: #6F42C1\">Application<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">lateinit<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">var<\/span><span style=\"color: #24292E\"> connectionObserver: <\/span><span style=\"color: #6F42C1\">ConnectionObserver<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">set<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">onCreate<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #005CC5\">super<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">onCreate<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        connectionObserver <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">ConnectionObserver<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">this<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        connectionObserver.<\/span><span style=\"color: #6F42C1\">start<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0627\u0645 \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0631\u0648 \u0642\u0628\u0644\u0627\u064b \u062f\u0627\u062e\u0644 Manifest \u062f\u0631 \u0648\u06cc\u0698\u06af\u06cc <code>android:name<\/code> \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u06cc\u0645. \u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u060c <code>Application<\/code> \u0633\u0627\u062e\u062a\u0647 \u0645\u06cc\u0634\u0647 \u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0627\u062a\u0635\u0627\u0644 \u0634\u0631\u0648\u0639 \u0645\u06cc\u0634\u0647. \u0686\u0648\u0646 \u0627\u06cc\u0646 Observer \u0628\u0631\u0627\u06cc \u06a9\u0644 \u0639\u0645\u0631 \u067e\u0631\u062f\u0627\u0632\u0634 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647\u060c \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u0627\u0648\u0646 \u0631\u0648 \u0628\u0627 \u0628\u0633\u062a\u0647 \u0634\u062f\u0646 \u0647\u0631 \u0635\u0641\u062d\u0647 \u0645\u062a\u0648\u0642\u0641 \u06a9\u0646\u06cc\u0645. \u0627\u0645\u0627 \u0627\u06af\u0647 Observer \u0631\u0648 \u062f\u0627\u062e\u0644 Activity\u060c Fragment \u06cc\u0627 \u06cc\u06a9 \u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a \u06a9\u0648\u062a\u0627\u0647\u200c\u0639\u0645\u0631 \u0645\u06cc\u200c\u0633\u0627\u062e\u062a\u06cc\u0645\u060c \u062d\u062a\u0645\u0627\u064b \u0628\u0627\u06cc\u062f \u062f\u0631 \u0632\u0645\u0627\u0646 \u0645\u0646\u0627\u0633\u0628 <code>stop<\/code> \u0631\u0648 \u0647\u0645 \u0635\u062f\u0627 \u0645\u06cc\u200c\u0632\u062f\u06cc\u0645 \u062a\u0627 Callback \u0622\u0632\u0627\u062f \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u0627\u0632 \u0637\u0631\u06cc\u0642 ViewModel \u0628\u0647 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0645\u06cc\u200c\u0631\u0633\u0648\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u06cc\u06a9 ViewModel \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0631\u0648 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0642\u0631\u0627\u0631 \u0628\u062f\u0647. ViewModel \u0646\u0628\u0627\u06cc\u062f \u062e\u0648\u062f\u0634 \u0647\u0631 \u0628\u0627\u0631 <code>ConnectivityManager<\/code> \u062c\u062f\u06cc\u062f\u06cc \u0628\u0633\u0627\u0632\u0647\u061b \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0647\u0645\u0627\u0646 Observer \u0645\u0631\u06a9\u0632\u06cc \u0645\u062a\u0635\u0644 \u0628\u0634\u0647. \u0628\u0631\u0627\u06cc \u0633\u0627\u062f\u0647 \u0646\u06af\u0647 \u062f\u0627\u0634\u062a\u0646 \u06a9\u062f\u060c \u0646\u0645\u0648\u0646\u0647 <code>ConnectionObserver<\/code> \u0631\u0648 \u0627\u0632 <code>Application<\/code> \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban.ui.home\n\nimport androidx.lifecycle.ViewModel\nimport com.example.gheimatban.network.ConnectionObserver\nimport com.example.gheimatban.network.ConnectionStatus\nimport kotlinx.coroutines.flow.StateFlow\n\nclass HomeViewModel(\n    connectionObserver: ConnectionObserver\n) : ViewModel() {\n\n    val connectionStatus: StateFlow&lt;ConnectionStatus> =\n        connectionObserver.status\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.ui.home<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.lifecycle.ViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.network.ConnectionObserver<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.network.ConnectionStatus<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">kotlinx.coroutines.flow.StateFlow<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">HomeViewModel<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    connectionObserver: <\/span><span style=\"color: #6F42C1\">ConnectionObserver<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) : <\/span><span style=\"color: #6F42C1\">ViewModel<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> connectionStatus: <\/span><span style=\"color: #6F42C1\">StateFlow<\/span><span style=\"color: #24292E\">&lt;<\/span><span style=\"color: #6F42C1\">ConnectionStatus<\/span><span style=\"color: #24292E\">&gt; <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        connectionObserver.status<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0686\u0648\u0646 ViewModel \u0648\u0631\u0648\u062f\u06cc \u062f\u0627\u0631\u0647\u060c \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0646\u0634 \u06cc\u06a9 Factory \u0647\u0645 \u0644\u0627\u0632\u0645 \u062f\u0627\u0631\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban.ui.home\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport com.example.gheimatban.network.ConnectionObserver\n\nclass HomeViewModelFactory(\n    private val connectionObserver: ConnectionObserver\n) : ViewModelProvider.Factory {\n\n    override fun &lt;T : ViewModel> create(\n        modelClass: Class&lt;T>\n    ): T {\n        if (modelClass.isAssignableFrom(HomeViewModel::class.java)) {\n            @Suppress(\"UNCHECKED_CAST\")\n            return HomeViewModel(connectionObserver) as T\n        }\n\n        throw IllegalArgumentException(\n            \"Unknown ViewModel class: ${modelClass.name}\"\n        )\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.ui.home<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.lifecycle.ViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.lifecycle.ViewModelProvider<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.network.ConnectionObserver<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">HomeViewModelFactory<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> connectionObserver: <\/span><span style=\"color: #6F42C1\">ConnectionObserver<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) : <\/span><span style=\"color: #6F42C1\">ViewModelProvider<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">Factory<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> &lt;<\/span><span style=\"color: #6F42C1\">T<\/span><span style=\"color: #24292E\"> : <\/span><span style=\"color: #6F42C1\">ViewModel<\/span><span style=\"color: #24292E\">&gt; <\/span><span style=\"color: #6F42C1\">create<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        modelClass: <\/span><span style=\"color: #6F42C1\">Class<\/span><span style=\"color: #24292E\">&lt;<\/span><span style=\"color: #6F42C1\">T<\/span><span style=\"color: #24292E\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">T<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (modelClass.<\/span><span style=\"color: #6F42C1\">isAssignableFrom<\/span><span style=\"color: #24292E\">(HomeViewModel::<\/span><span style=\"color: #6F42C1\">class<\/span><span style=\"color: #24292E\">.java)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">@Suppress<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;UNCHECKED_CAST&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">HomeViewModel<\/span><span style=\"color: #24292E\">(connectionObserver) <\/span><span style=\"color: #D73A49\">as<\/span><span style=\"color: #24292E\"> T<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">throw<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">IllegalArgumentException<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;Unknown ViewModel class: ${modelClass.name}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 Factory \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc <code>ConnectionObserver<\/code> \u0631\u0648 \u0647\u0646\u06af\u0627\u0645 \u0633\u0627\u062e\u062a ViewModel \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u0645. \u0628\u0639\u062f\u0627\u064b \u0648\u0642\u062a\u06cc Hilt \u0631\u0648 \u06cc\u0627\u062f \u0628\u06af\u06cc\u0631\u06cc\u0645\u060c \u0628\u062e\u0634 \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u062f \u0628\u0647 \u0635\u0648\u0631\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u0634\u0647\u060c \u0627\u0645\u0627 \u0641\u0639\u0644\u0627\u064b \u062e\u0648\u0628\u0647 \u0633\u0627\u0632\u0648\u06a9\u0627\u0631 \u0648\u0627\u0642\u0639\u06cc \u0648\u0631\u0648\u062f \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0628\u0647 ViewModel \u0631\u0648 \u0628\u0628\u06cc\u0646\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0646\u0648\u0627\u0631 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0631\u0648 \u062f\u0631 Compose \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u0628\u0647 \u0628\u062e\u0634 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u0647\u062f\u0647 \u062f\u0631\u0633 \u0645\u06cc\u200c\u0631\u0633\u06cc\u0645. \u06cc\u06a9 Composable \u0628\u0647 \u0646\u0627\u0645 <code>ConnectionBanner<\/code> \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0627\u0633\u0627\u0633 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u062a\u0635\u0645\u06cc\u0645 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647 \u0686\u0647 \u0686\u06cc\u0632\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u0647. \u062f\u0631 \u062d\u0627\u0644\u062a <code>UNAVAILABLE<\/code> \u06cc\u06a9 \u0646\u0648\u0627\u0631 \u0647\u0634\u062f\u0627\u0631 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647. \u062f\u0631 \u062d\u0627\u0644\u062a <code>CHECKING<\/code> \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u06a9\u0648\u062a\u0627\u0647 \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0627\u062a\u0635\u0627\u0644 \u0645\u06cc\u200c\u0628\u06cc\u0646\u06cc\u0645 \u0648 \u062f\u0631 \u062d\u0627\u0644\u062a <code>AVAILABLE<\/code> \u0686\u06cc\u0632\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0646\u0645\u06cc\u062f\u06cc\u0645 \u062a\u0627 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0628\u06cc\u200c\u062f\u0644\u06cc\u0644 \u0634\u0644\u0648\u063a \u0646\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban.ui.components\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport com.example.gheimatban.network.ConnectionStatus\n\n@Composable\nfun ConnectionBanner(\n    status: ConnectionStatus,\n    modifier: Modifier = Modifier\n) {\n    when (status) {\n        ConnectionStatus.CHECKING -> {\n            Box(\n                modifier = modifier\n                    .fillMaxWidth()\n                    .background(\n                        MaterialTheme.colorScheme.secondaryContainer\n                    )\n                    .padding(\n                        horizontal = 16.dp,\n                        vertical = 8.dp\n                    ),\n                contentAlignment = Alignment.Center\n            ) {\n                Text(\n                    text = \"\u062f\u0631 \u062d\u0627\u0644 \u0628\u0631\u0631\u0633\u06cc \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a...\"\n                )\n            }\n        }\n\n        ConnectionStatus.UNAVAILABLE -> {\n            Box(\n                modifier = modifier\n                    .fillMaxWidth()\n                    .background(\n                        MaterialTheme.colorScheme.errorContainer\n                    )\n                    .padding(\n                        horizontal = 16.dp,\n                        vertical = 8.dp\n                    ),\n                contentAlignment = Alignment.Center\n            ) {\n                Text(\n                    text = \"\u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0627\u0633\u062a\u061b \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0647\u200c\u0631\u0648\u0632 \u0646\u0628\u0627\u0634\u0646\u062f.\",\n                    color = MaterialTheme.colorScheme.onErrorContainer\n                )\n            }\n        }\n\n        ConnectionStatus.AVAILABLE -> Unit\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.ui.components<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.foundation.background<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.foundation.layout.Box<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.foundation.layout.fillMaxWidth<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.foundation.layout.padding<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.material3.MaterialTheme<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.material3.Text<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.runtime.Composable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.ui.Alignment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.ui.Modifier<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.ui.unit.dp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.network.ConnectionStatus<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6F42C1\">@Composable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">ConnectionBanner<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    status: <\/span><span style=\"color: #6F42C1\">ConnectionStatus<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    modifier: <\/span><span style=\"color: #6F42C1\">Modifier<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> Modifier<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">when<\/span><span style=\"color: #24292E\"> (status) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ConnectionStatus.CHECKING <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">Box<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                modifier <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> modifier<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    .<\/span><span style=\"color: #6F42C1\">fillMaxWidth<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    .<\/span><span style=\"color: #6F42C1\">background<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        MaterialTheme.colorScheme.secondaryContainer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    .<\/span><span style=\"color: #6F42C1\">padding<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        horizontal <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">16<\/span><span style=\"color: #24292E\">.dp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        vertical <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">8<\/span><span style=\"color: #24292E\">.dp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                contentAlignment <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> Alignment.Center<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">Text<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    text <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;\u062f\u0631 \u062d\u0627\u0644 \u0628\u0631\u0631\u0633\u06cc \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a...&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ConnectionStatus.UNAVAILABLE <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">Box<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                modifier <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> modifier<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    .<\/span><span style=\"color: #6F42C1\">fillMaxWidth<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    .<\/span><span style=\"color: #6F42C1\">background<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        MaterialTheme.colorScheme.errorContainer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    .<\/span><span style=\"color: #6F42C1\">padding<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        horizontal <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">16<\/span><span style=\"color: #24292E\">.dp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        vertical <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">8<\/span><span style=\"color: #24292E\">.dp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                contentAlignment <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> Alignment.Center<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">Text<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    text <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;\u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0627\u0633\u062a\u061b \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0647\u200c\u0631\u0648\u0632 \u0646\u0628\u0627\u0634\u0646\u062f.&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    color <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> MaterialTheme.colorScheme.onErrorContainer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ConnectionStatus.AVAILABLE <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> Unit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647 \u062c\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0631\u0646\u06af\u200c\u0647\u0627 \u0631\u0648 \u0645\u0633\u062a\u0642\u06cc\u0645 \u0628\u0627 \u06a9\u062f \u0647\u06af\u0632 \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645\u060c \u0627\u0632 \u0631\u0646\u06af\u200c\u0647\u0627\u06cc Theme \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u06cc\u0645 \u062a\u0627 Banner \u0628\u0627 \u062d\u0627\u0644\u062a \u0631\u0648\u0634\u0646 \u0648 \u062a\u0627\u0631\u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0645\u0627\u0647\u0646\u06af \u0628\u0645\u0648\u0646\u0647. \u0645\u062a\u0646 \u067e\u06cc\u0627\u0645 \u0647\u0645 \u0641\u0642\u0637 \u0646\u0645\u06cc\u06af\u0647 \u00ab\u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0627\u0633\u062a\u00bb\u060c \u0628\u0644\u06a9\u0647 \u0627\u062b\u0631 \u0627\u06cc\u0646 \u0627\u062a\u0641\u0627\u0642 \u0631\u0648 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062a\u0648\u0636\u06cc\u062d \u0645\u06cc\u062f\u0647\u061b \u06cc\u0639\u0646\u06cc \u0645\u0645\u06a9\u0646\u0647 \u0642\u06cc\u0645\u062a\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u06cc\u200c\u0628\u06cc\u0646\u0647 \u0622\u062e\u0631\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0633\u0631\u0648\u0631 \u0646\u0628\u0627\u0634\u0646. \u0627\u06cc\u0646 \u0646\u0648\u0639 \u067e\u06cc\u0627\u0645 \u0628\u0631\u0627\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0645\u0641\u06cc\u062f\u062a\u0631 \u0627\u0632 \u06cc\u06a9 \u0647\u0634\u062f\u0627\u0631 \u0641\u0646\u06cc \u0648 \u0645\u0628\u0647\u0645\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u062f\u0627\u062e\u0644 \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u062f\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0627\u062e\u0644 <code>MainActivity<\/code> \u06cc\u0627 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc\u060c ViewModel \u0631\u0648 \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645 \u0648 \u0645\u0642\u062f\u0627\u0631 <code>StateFlow<\/code> \u0631\u0648 \u0628\u0627 <code>collectAsStateWithLifecycle<\/code> \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u0645\u062a\u062f \u0645\u0642\u062f\u0627\u0631 Flow \u0631\u0648 \u0645\u062a\u0646\u0627\u0633\u0628 \u0628\u0627 Lifecycle \u0635\u0641\u062d\u0647 \u062c\u0645\u0639\u200c\u0622\u0648\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0648\u0642\u062a\u06cc \u0635\u0641\u062d\u0647 \u062f\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0639\u0627\u0644 \u0642\u0631\u0627\u0631 \u0646\u062f\u0627\u0631\u0647\u060c \u062c\u0645\u0639\u200c\u0622\u0648\u0631\u06cc \u0631\u0648 \u0645\u062a\u0648\u0642\u0641 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0647\u0631 \u0628\u0627\u0631 \u0645\u0642\u062f\u0627\u0631 Flow \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u0647\u060c Compose \u0647\u0645 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc\u06cc \u0627\u0632 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06a9\u0647 \u0627\u0632 \u0627\u0648\u0646 \u0645\u0642\u062f\u0627\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0646 \u062f\u0648\u0628\u0627\u0631\u0647 \u0645\u06cc\u200c\u0633\u0627\u0632\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.getValue\nimport androidx.lifecycle.compose.collectAsStateWithLifecycle\nimport com.example.gheimatban.ui.components.ConnectionBanner\nimport com.example.gheimatban.ui.home.HomeViewModel\nimport com.example.gheimatban.ui.home.HomeViewModelFactory\n\nclass MainActivity : ComponentActivity() {\n\n    private val viewModel: HomeViewModel by viewModels {\n        val app = application as GheimatBanApplication\n\n        HomeViewModelFactory(\n            connectionObserver = app.connectionObserver\n        )\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContent {\n            val connectionStatus by\n                viewModel.connectionStatus.collectAsStateWithLifecycle()\n\n            Column {\n                ConnectionBanner(\n                    status = connectionStatus\n                )\n\n                Text(\n                    text = \"\u0644\u06cc\u0633\u062a \u06a9\u0627\u0644\u0627\u0647\u0627\u06cc GheimatBan\"\n                )\n\n                \/\/ \u0645\u062d\u062a\u0648\u0627\u06cc \u0627\u0635\u0644\u06cc \u0635\u0641\u062d\u0647\n            }\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.os.Bundle<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.activity.ComponentActivity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.activity.compose.setContent<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.activity.viewModels<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.foundation.layout.Column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.material3.Text<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.compose.runtime.getValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.lifecycle.compose.collectAsStateWithLifecycle<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.ui.components.ConnectionBanner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.ui.home.HomeViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.ui.home.HomeViewModelFactory<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">MainActivity<\/span><span style=\"color: #24292E\"> : <\/span><span style=\"color: #6F42C1\">ComponentActivity<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> viewModel: <\/span><span style=\"color: #6F42C1\">HomeViewModel<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">by<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">viewModels<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> app <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> application <\/span><span style=\"color: #D73A49\">as<\/span><span style=\"color: #24292E\"> GheimatBanApplication<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">HomeViewModelFactory<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            connectionObserver <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> app.connectionObserver<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">onCreate<\/span><span style=\"color: #24292E\">(savedInstanceState: <\/span><span style=\"color: #6F42C1\">Bundle<\/span><span style=\"color: #24292E\">?) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #005CC5\">super<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">onCreate<\/span><span style=\"color: #24292E\">(savedInstanceState)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">setContent<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> connectionStatus <\/span><span style=\"color: #D73A49\">by<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                viewModel.connectionStatus.<\/span><span style=\"color: #6F42C1\">collectAsStateWithLifecycle<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">Column<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">ConnectionBanner<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    status <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> connectionStatus<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">Text<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    text <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;\u0644\u06cc\u0633\u062a \u06a9\u0627\u0644\u0627\u0647\u0627\u06cc GheimatBan&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6A737D\">\/\/ \u0645\u062d\u062a\u0648\u0627\u06cc \u0627\u0635\u0644\u06cc \u0635\u0641\u062d\u0647<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u0627\u06af\u0647 \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0631\u0648 \u062e\u0627\u0645\u0648\u0634 \u06a9\u0646\u06cc\u060c \u0645\u0642\u062f\u0627\u0631 <code>StateFlow<\/code> \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c Compose \u0645\u062a\u0648\u062c\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u0634\u0647 \u0648 Banner \u0631\u0648 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u062f\u0647. \u0648\u0642\u062a\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0631\u0642\u0631\u0627\u0631 \u0628\u0634\u0647\u060c \u0645\u0642\u062f\u0627\u0631 \u0628\u0647 <code>AVAILABLE<\/code> \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 Banner \u0646\u0627\u067e\u062f\u06cc\u062f \u0645\u06cc\u0634\u0647. \u0647\u06cc\u0686 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 Refresh \u062f\u0633\u062a\u06cc \u0635\u0641\u062d\u0647\u060c \u0628\u0631\u0631\u0633\u06cc \u0645\u062f\u0627\u0648\u0645 \u0628\u0627 Timer \u06cc\u0627 \u0627\u062c\u0631\u0627\u06cc \u06cc\u06a9 \u062d\u0644\u0642\u0647 \u0628\u06cc\u200c\u067e\u0627\u06cc\u0627\u0646 \u0646\u062f\u0627\u0631\u06cc\u0645\u061b \u0633\u06cc\u0633\u062a\u0645\u200c\u0639\u0627\u0645\u0644 \u062a\u063a\u06cc\u06cc\u0631 \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0628\u0631 \u0645\u06cc\u062f\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0642\u0637\u0639 \u0628\u0648\u062f\u0646 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0646\u0628\u0627\u06cc\u062f \u0647\u0645\u0647\u200c\u0686\u06cc\u0632 \u0631\u0648 \u0646\u0627\u0628\u0648\u062f \u06a9\u0646\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0645\u0627\u06cc\u0634 Banner \u0641\u0642\u0637 \u0646\u06cc\u0645\u06cc \u0627\u0632 \u06a9\u0627\u0631\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u0628 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u0645\u062d\u0636 \u0642\u0637\u0639 \u0634\u062f\u0646 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u06a9\u0644 \u0635\u0641\u062d\u0647 \u0631\u0648 \u062e\u0627\u0644\u06cc \u06a9\u0646\u0647. \u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0642\u0628\u0644\u0627\u064b \u0642\u06cc\u0645\u062a \u0686\u0646\u062f \u06a9\u0627\u0644\u0627 \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062f\u0647 \u0648 \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0627\u062e\u0644 Room \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0646. \u0648\u0642\u062a\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0637\u0639 \u0645\u06cc\u0634\u0647\u060c \u0628\u0647\u062a\u0631\u0647 \u0647\u0645\u0648\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0642\u0628\u0644\u06cc \u0647\u0645\u0686\u0646\u0627\u0646 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0628\u0634\u0646 \u0648 \u0641\u0642\u0637 Banner \u062a\u0648\u0636\u06cc\u062d \u0628\u062f\u0647 \u06a9\u0647 \u0645\u0645\u06a9\u0646\u0647 \u0642\u06cc\u0645\u062a\u200c\u0647\u0627 \u0628\u0647\u200c\u0631\u0648\u0632 \u0646\u0628\u0627\u0634\u0646. \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0628\u0647 \u0637\u0631\u0627\u062d\u06cc <strong>Offline-first<\/strong> \u0646\u0632\u062f\u06cc\u06a9\u0647\u061b \u06cc\u0639\u0646\u06cc \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062a\u0627 \u062c\u0627\u06cc \u0645\u0645\u06a9\u0646 \u0627\u0632 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u0645\u062d\u0644\u06cc \u062a\u063a\u0630\u06cc\u0647 \u0645\u06cc\u0634\u0647 \u0648 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631\u0627\u06cc \u0647\u0645\u06af\u0627\u0645\u200c\u0633\u0627\u0632\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062c\u062f\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u06cc\u0646 \u0645\u0648\u0636\u0648\u0639 \u062f\u0631\u0628\u0627\u0631\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0647\u0645 \u0635\u062f\u0642 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0645\u062b\u0644\u0627\u064b \u0627\u06af\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u062d\u0627\u0644\u062a \u0622\u0641\u0644\u0627\u06cc\u0646 \u06a9\u0627\u0644\u0627\u06cc\u06cc \u0631\u0648 \u0628\u0647 \u0639\u0644\u0627\u0642\u0647\u200c\u0645\u0646\u062f\u06cc\u200c\u0647\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0631\u0648 \u0645\u062d\u0644\u06cc \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u0645 \u0648 \u0628\u0639\u062f \u0627\u0632 \u0628\u0631\u06af\u0634\u062a \u0627\u062a\u0635\u0627\u0644 \u0628\u0627 \u0633\u0631\u0648\u0631 \u0647\u0645\u0627\u0647\u0646\u06af \u06a9\u0646\u06cc\u0645. \u0627\u0644\u0628\u062a\u0647 \u0647\u0645\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a\u200c\u0647\u0627 \u0642\u0627\u0628\u0644 \u0627\u0646\u062c\u0627\u0645 \u062f\u0631 \u062d\u0627\u0644\u062a \u0622\u0641\u0644\u0627\u06cc\u0646 \u0646\u06cc\u0633\u062a\u0646. \u0645\u062b\u0644\u0627\u064b \u062f\u0631\u06cc\u0627\u0641\u062a \u0642\u06cc\u0645\u062a \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0628\u062f\u0648\u0646 \u0633\u0631\u0648\u0631 \u0645\u0645\u06a9\u0646 \u0646\u06cc\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u062f\u06a9\u0645\u0647 \u00ab\u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0642\u06cc\u0645\u062a\u00bb \u0628\u0627\u06cc\u062f \u062e\u0637\u0627\u06cc \u0648\u0627\u0636\u062d\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u0647 \u06cc\u0627 \u062a\u0627 \u0632\u0645\u0627\u0646 \u0628\u0631\u06af\u0634\u062a \u0627\u062a\u0635\u0627\u0644 \u063a\u06cc\u0631\u0641\u0639\u0627\u0644 \u0628\u0634\u0647. \u0646\u06a9\u062a\u0647 \u0627\u0635\u0644\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u06cc\u06a9 \u0645\u062a\u0646 \u062a\u0632\u0626\u06cc\u0646\u06cc \u0628\u0627\u0634\u0647\u061b \u0631\u0641\u062a\u0627\u0631 \u0648\u0627\u0642\u0639\u06cc \u0635\u0641\u062d\u0647 \u0647\u0645 \u0628\u0627\u06cc\u062f \u0628\u0627 \u0627\u0648\u0646 \u0647\u0645\u0627\u0647\u0646\u06af \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0646\u0645\u0648\u0646\u0647\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u062f\u06a9\u0645\u0647 \u062f\u0631\u06cc\u0627\u0641\u062a \u0642\u06cc\u0645\u062a \u062c\u062f\u06cc\u062f \u0631\u0648 \u0628\u0631\u0627\u0633\u0627\u0633 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Button(\n    onClick = {\n        viewModel.refreshPrices()\n    },\n    enabled = connectionStatus == ConnectionStatus.AVAILABLE\n) {\n    Text(\n        text = if (\n            connectionStatus == ConnectionStatus.AVAILABLE\n        ) {\n            \"\u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0642\u06cc\u0645\u062a\u200c\u0647\u0627\"\n        } else {\n            \"\u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a\"\n        }\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">Button<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    onClick <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        viewModel.<\/span><span style=\"color: #6F42C1\">refreshPrices<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    enabled <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> connectionStatus <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> ConnectionStatus.AVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">Text<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        text <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            connectionStatus <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> ConnectionStatus.AVAILABLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0642\u06cc\u0645\u062a\u200c\u0647\u0627&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        } <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0646\u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062f\u0631 \u062d\u0627\u0644\u062a \u0622\u0641\u0644\u0627\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u06cc\u200c\u0646\u062a\u06cc\u062c\u0647\u200c\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u0647. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u0646\u0628\u0627\u06cc\u062f \u062a\u0645\u0627\u0645 \u062f\u06a9\u0645\u0647\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0635\u0631\u0641\u0627\u064b \u0628\u0647 \u062e\u0627\u0637\u0631 \u0642\u0637\u0639 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u063a\u06cc\u0631\u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u0645\u061b \u0641\u0642\u0637 \u0639\u0645\u0644\u06cc\u0627\u062a\u200c\u0647\u0627\u06cc\u06cc \u0628\u0627\u06cc\u062f \u0645\u062d\u062f\u0648\u062f \u0628\u0634\u0646 \u06a9\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0627\u0631\u062a\u0628\u0627\u0637 \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u0628\u0627 \u0633\u0631\u0648\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 \u0627\u06cc\u0646 \u06a9\u062f \u0633\u0627\u0644\u0645 \u0628\u0648\u062f\u0646 \u0633\u0631\u0648\u0631 \u0631\u0648 \u0647\u0645 \u062a\u0634\u062e\u06cc\u0635 \u0645\u06cc\u062f\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0647. \u0627\u06cc\u0646 \u0633\u06cc\u0633\u062a\u0645 \u0641\u0642\u0637 \u0645\u06cc\u06af\u0647 \u062f\u0633\u062a\u06af\u0627\u0647 \u0628\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0639\u0645\u0648\u0645\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u0639\u062a\u0628\u0631 \u062f\u0627\u0631\u0647. \u0645\u0645\u06a9\u0646\u0647 \u0648\u0636\u0639\u06cc\u062a <code>AVAILABLE<\/code> \u0628\u0627\u0634\u0647 \u0627\u0645\u0627 \u0633\u0631\u0648\u0631 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u062e\u0637\u0627\u06cc \u06f5\u06f0\u06f0 \u0628\u062f\u0647\u060c \u0628\u0631\u0627\u06cc \u062a\u0639\u0645\u06cc\u0631\u0627\u062a \u062e\u0627\u0645\u0648\u0634 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647 \u06cc\u0627 \u062f\u0627\u0645\u0646\u0647 \u067e\u0631\u0648\u0698\u0647 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u0628\u0627\u0634\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u062e\u0637\u0627\u0647\u0627\u06cc \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0628\u0627\u06cc\u062f \u062f\u0631 \u0644\u0627\u06cc\u0647 Repository \u0647\u0645 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u06cc\u0645. \u0645\u062b\u0644\u0627\u064b \u0627\u06af\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Retrofit \u0628\u0647 \u062e\u0627\u0637\u0631 Timeout \u06cc\u0627 \u062e\u0637\u0627\u06cc \u0633\u0631\u0648\u0631 \u0634\u06a9\u0633\u062a \u062e\u0648\u0631\u062f\u060c \u0646\u0628\u0627\u06cc\u062f \u0641\u0648\u0631\u0627\u064b \u0646\u062a\u06cc\u062c\u0647 \u0628\u06af\u06cc\u0631\u06cc\u0645 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u06a9\u0627\u0631\u0628\u0631 \u0642\u0637\u0639\u0647. \u0628\u0647\u062a\u0631\u0647 \u067e\u06cc\u0627\u0645 \u0645\u062a\u0646\u0627\u0633\u0628 \u0628\u0627 \u0646\u0648\u0639 \u062e\u0637\u0627 \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u06cc\u0645: \u00ab\u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a\u00bb\u060c \u00ab\u0633\u0631\u0648\u0631 \u0645\u0648\u0642\u062a\u0627\u064b \u067e\u0627\u0633\u062e \u0646\u0645\u06cc\u062f\u0647\u062f\u00bb \u06cc\u0627 \u00ab\u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0627 \u062e\u0637\u0627 \u0631\u0648\u0628\u0647\u200c\u0631\u0648 \u0634\u062f\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u0686\u0646\u06cc\u0646 \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u062a\u0635\u0627\u0644\u060c \u0647\u0631 \u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0628\u0647 \u06af\u0648\u06af\u0644 \u06cc\u0627 \u0633\u0627\u06cc\u062a \u062f\u06cc\u06af\u0631\u06cc \u0628\u0641\u0631\u0633\u062a\u06cc\u0645. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0647\u0645 \u0628\u0627\u062a\u0631\u06cc \u0648 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0645\u0635\u0631\u0641 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0647\u0645 \u0645\u0645\u06a9\u0646\u0647 \u0646\u062a\u06cc\u062c\u0647 \u06af\u0645\u0631\u0627\u0647\u200c\u06a9\u0646\u0646\u062f\u0647 \u0628\u062f\u0647\u061b \u0686\u0648\u0646 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0648\u062f\u0646 \u06cc\u06a9 \u0633\u0627\u06cc\u062a \u062e\u0627\u0631\u062c\u06cc \u0686\u06cc\u0632\u06cc \u062f\u0631\u0628\u0627\u0631\u0647 \u0633\u0627\u0644\u0645 \u0628\u0648\u062f\u0646 API \u062e\u0648\u062f \u067e\u0631\u0648\u0698\u0647 \u062b\u0627\u0628\u062a \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647. <code>ConnectivityManager<\/code> \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0648\u0636\u0639\u06cc\u062a \u0639\u0645\u0648\u0645\u06cc \u0627\u062a\u0635\u0627\u0644 \u0645\u0646\u0627\u0633\u0628\u0647 \u0648 \u0646\u062a\u06cc\u062c\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648\u0627\u0642\u0639\u06cc API \u0647\u0645 \u0648\u0636\u0639\u06cc\u062a \u0633\u0631\u0648\u06cc\u0633 \u062e\u0648\u062f\u0645\u0648\u0646 \u0631\u0648 \u0645\u0634\u062e\u0635 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u062f\u0631 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u06cc\u06a9 <code>ConnectionObserver<\/code> \u0633\u0627\u062e\u062a\u06cc\u0645 \u06a9\u0647 \u0627\u0632 <code>ConnectivityManager.NetworkCallback<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0628\u0627 \u0628\u0631\u0631\u0633\u06cc <code>NET_CAPABILITY_INTERNET<\/code> \u0648 <code>NET_CAPABILITY_VALIDATED<\/code> \u062a\u0634\u062e\u06cc\u0635 \u0645\u06cc\u062f\u0647 \u0634\u0628\u06a9\u0647 \u0641\u0639\u0644\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u0639\u062a\u0628\u0631 \u0628\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062f\u0627\u0631\u0647 \u06cc\u0627 \u0646\u0647 \u0648 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0648 \u062f\u0627\u062e\u0644 <code>StateFlow<\/code> \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u0647. \u0628\u0639\u062f ViewModel \u0627\u06cc\u0646 \u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u0628\u0647 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0633\u0648\u0646\u062f \u0648 Compose \u0628\u0627 <code>collectAsStateWithLifecycle<\/code> \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062f. \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u06cc\u06a9 Banner \u0633\u0627\u062e\u062a\u06cc\u0645 \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u0642\u0637\u0639 \u0634\u062f\u0646 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0638\u0627\u0647\u0631 \u0645\u06cc\u0634\u0647 \u0648 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062a\u0648\u0636\u06cc\u062d \u0645\u06cc\u062f\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0645\u06a9\u0646\u0647 \u0628\u0647\u200c\u0631\u0648\u0632 \u0646\u0628\u0627\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u0646\u06a9\u062a\u0647 \u0627\u06cc\u0646 \u062f\u0631\u0633 \u0641\u0642\u0637 \u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 \u0646\u0648\u0627\u0631 \u0647\u0634\u062f\u0627\u0631 \u0646\u0628\u0648\u062f. \u0648\u0636\u0639\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0631\u0641\u062a\u0627\u0631 \u0648\u0627\u0642\u0639\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u062b\u0631 \u0628\u0630\u0627\u0631\u0647\u061b \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0642\u0628\u0644\u06cc \u062a\u0627 \u062c\u0627\u06cc \u0645\u0645\u06a9\u0646 \u0628\u0627\u0642\u06cc \u0628\u0645\u0648\u0646\u0646\u060c \u0639\u0645\u0644\u06cc\u0627\u062a \u0648\u0627\u0628\u0633\u062a\u0647 \u0628\u0647 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u06a9\u0646\u062a\u0631\u0644 \u0628\u0634\u0646 \u0648 \u062e\u0637\u0627\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0628\u0627 \u062e\u0637\u0627\u06cc \u0633\u0631\u0648\u0631 \u0627\u0634\u062a\u0628\u0627\u0647 \u06af\u0631\u0641\u062a\u0647 \u0646\u0634\u0647. \u0648\u0642\u062a\u06cc \u0627\u06cc\u0646 \u0628\u062e\u0634 \u062f\u0631\u0633\u062a \u0637\u0631\u0627\u062d\u06cc \u0628\u0634\u0647\u060c \u06a9\u0627\u0631\u0628\u0631 \u062d\u062a\u06cc \u0647\u0646\u06af\u0627\u0645 \u0642\u0637\u0639 \u0648 \u0648\u0635\u0644 \u0634\u062f\u0646 \u0634\u0628\u06a9\u0647 \u0647\u0645 \u0627\u062d\u0633\u0627\u0633 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0631\u0627\u06cc\u0637 \u0631\u0648 \u062f\u0631\u06a9 \u06a9\u0631\u062f\u0647 \u0648 \u06a9\u0646\u062a\u0631\u0644 \u0627\u0648\u0636\u0627\u0639 \u0631\u0648 \u0627\u0632 \u062f\u0633\u062a \u0646\u062f\u0627\u062f\u0647.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\u0628\u062e\u0634 \u0647\u0641\u062a\u0645 \u2014 \u0627\u0645\u0646\u06cc\u062a<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u0686\u0647\u0644\u200c\u0648\u0646\u0647\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">\u0627\u0645\u0646\u06cc\u062a API<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b \u0686\u0631\u0627 API \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0627\u0645\u0646 \u0628\u0627\u0634\u0647\u061f<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-13-1024x683.avif\" alt=\"\" class=\"wp-image-6144\" srcset=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-13-1024x683.avif 1024w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-13-300x200.avif 300w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-13-768x512.avif 768w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-13.avif 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0648\u0627\u0631\u062f \u062d\u0633\u0627\u0628\u0634 \u0645\u06cc\u0634\u0647\u060c \u06a9\u0627\u0644\u0627\u0647\u0627\u06cc \u0645\u0648\u0631\u062f\u0639\u0644\u0627\u0642\u0647\u200c\u0627\u0634 \u0631\u0648 \u0645\u06cc\u200c\u0628\u06cc\u0646\u0647 \u0648 \u0628\u0631\u0627\u06cc \u0628\u0639\u0636\u06cc \u0645\u062d\u0635\u0648\u0644\u0627\u062a \u0647\u0634\u062f\u0627\u0631 \u06a9\u0627\u0647\u0634 \u0642\u06cc\u0645\u062a \u0645\u06cc\u200c\u0633\u0627\u0632\u0647. \u062a\u0645\u0627\u0645 \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0632 \u0637\u0631\u06cc\u0642 API \u0628\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0633\u0631\u0648\u0631 \u062c\u0627\u0628\u0647\u200c\u062c\u0627 \u0645\u06cc\u0634\u0646. \u062d\u0627\u0644\u0627 \u0627\u06af\u0647 \u0627\u06cc\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u062f\u0631\u0633\u062a \u0645\u062d\u0627\u0641\u0638\u062a \u0646\u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u0645\u0645\u06a9\u0646\u0647 \u06cc\u06a9 \u0646\u0641\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0648 \u0628\u062e\u0648\u0646\u0647\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647\u060c \u062e\u0648\u062f\u0634 \u0631\u0648 \u062c\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062f\u06cc\u06af\u0631\u06cc \u062c\u0627 \u0628\u0632\u0646\u0647 \u06cc\u0627 \u0647\u0632\u0627\u0631\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062c\u0639\u0644\u06cc \u0628\u0647 \u0633\u0631\u0648\u0631 \u0628\u0641\u0631\u0633\u062a\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u0645\u0646\u06cc\u062a API \u0641\u0642\u0637 \u0627\u06cc\u0646 \u0646\u06cc\u0633\u062a \u06a9\u0647 \u0622\u062f\u0631\u0633 \u0633\u0631\u0648\u0631 \u0631\u0648 \u0645\u062e\u0641\u06cc \u06a9\u0646\u06cc\u0645 \u06cc\u0627 \u06cc\u06a9 \u0631\u0634\u062a\u0647 \u0639\u062c\u06cc\u0628 \u0628\u0647 \u0646\u0627\u0645 API Key \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0630\u0627\u0631\u06cc\u0645. \u0627\u0645\u0646\u06cc\u062a \u0648\u0627\u0642\u0639\u06cc \u0627\u0632 \u0686\u0646\u062f \u0644\u0627\u06cc\u0647 \u062a\u0634\u06a9\u06cc\u0644 \u0645\u06cc\u0634\u0647: \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0627\u06cc\u062f \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u06cc\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0634\u0647\u060c \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u062c\u0648\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647\u060c \u062a\u0648\u06a9\u0646\u200c\u0647\u0627 \u0628\u0627\u06cc\u062f \u062f\u0631\u0633\u062a \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0634\u0646 \u0648 \u0631\u0641\u062a\u0627\u0631\u0647\u0627\u06cc \u0645\u0634\u06a9\u0648\u06a9 \u0647\u0645 \u0645\u062d\u062f\u0648\u062f \u0628\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9 \u0646\u06a9\u062a\u0647 \u062e\u06cc\u0644\u06cc \u0645\u0647\u0645 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0631\u0648\u06cc \u06af\u0648\u0634\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647 \u0648 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0627\u0645\u0644 \u0627\u0648\u0646 \u06af\u0648\u0634\u06cc \u062f\u0633\u062a \u0645\u0627 \u0646\u06cc\u0633\u062a. \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0641\u0627\u06cc\u0644 APK \u0631\u0648 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u0647\u060c \u06a9\u062f\u0647\u0627 \u0631\u0648 \u0645\u0647\u0646\u062f\u0633\u06cc \u0645\u0639\u06a9\u0648\u0633 \u06a9\u0646\u0647\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647 \u06cc\u0627 \u062d\u062a\u06cc \u0646\u0633\u062e\u0647 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u0647. \u067e\u0633 \u0646\u0628\u0627\u06cc\u062f \u0647\u06cc\u0686\u200c\u0648\u0642\u062a \u0627\u0645\u0646\u06cc\u062a \u0633\u0631\u0648\u0631 \u0631\u0648 \u0628\u0631 \u0627\u06cc\u0646 \u0641\u0631\u0636 \u0628\u0646\u0627 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u00ab\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062d\u062a\u0645\u0627\u064b \u0627\u0632 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u0635\u0644\u06cc \u0645\u0627 \u0627\u0631\u0633\u0627\u0644 \u0634\u062f\u0647\u00bb. \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u0645 \u062a\u0623\u06a9\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u0646 \u06a9\u0647 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u062b\u0627\u0628\u062a \u062f\u0627\u062e\u0644 \u0627\u067e \u0645\u0648\u0628\u0627\u06cc\u0644 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0645\u0647\u0646\u062f\u0633\u06cc \u0645\u0639\u06a9\u0648\u0633 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0628\u0634\u0647 \u0648 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0628\u0647 API \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HTTPS \u0627\u0648\u0644\u06cc\u0646 \u0644\u0627\u06cc\u0647 \u0627\u0645\u0646\u06cc\u062a\u0647\u060c \u0646\u0647 \u06a9\u0644 \u0627\u0645\u0646\u06cc\u062a<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-14-1024x683.avif\" alt=\"\" class=\"wp-image-6146\" srcset=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-14-1024x683.avif 1024w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-14-300x200.avif 300w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-14-768x512.avif 768w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-14.avif 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0648\u0644\u06cc\u0646 \u06a9\u0627\u0631\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a \u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u062f\u06cc\u0645\u060c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>HTTPS<\/code> \u0628\u0647 \u062c\u0627\u06cc <code>HTTP<\/code> \u0627\u0633\u062a. \u0648\u0642\u062a\u06cc \u0627\u0632 HTTP \u0633\u0627\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0628\u0647 \u0634\u06a9\u0644 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc\u200c\u0646\u0634\u062f\u0647 \u062f\u0631 \u0634\u0628\u06a9\u0647 \u062d\u0631\u06a9\u062a \u0645\u06cc\u200c\u06a9\u0646\u0646. \u06cc\u0639\u0646\u06cc \u0627\u06af\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u06cc\u06a9 Wi-Fi \u0639\u0645\u0648\u0645\u06cc \u0648 \u0646\u0627\u0627\u0645\u0646 \u0648\u0635\u0644 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u0634\u062e\u0635 \u062f\u06cc\u06af\u0631\u06cc \u062f\u0631 \u0647\u0645\u0648\u0646 \u0634\u0628\u06a9\u0647 \u0645\u0645\u06a9\u0646\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0645\u062b\u0644 \u062a\u0648\u06a9\u0646\u060c \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06cc\u0627 \u067e\u0627\u0633\u062e\u200c\u0647\u0627\u06cc API \u0631\u0648 \u0645\u0634\u0627\u0647\u062f\u0647 \u06cc\u0627 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc \u06a9\u0646\u0647. HTTPS \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TLS \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0631\u0648 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0637\u0645\u0626\u0646 \u0628\u0634\u0647 \u0628\u0627 \u0633\u0631\u0648\u0631 \u0648\u0627\u0642\u0639\u06cc \u0627\u0631\u062a\u0628\u0627\u0637 \u06af\u0631\u0641\u062a\u0647\u060c \u0646\u0647 \u06cc\u06a9 \u0633\u0631\u0648\u0631 \u062c\u0639\u0644\u06cc \u062f\u0631 \u0648\u0633\u0637 \u0645\u0633\u06cc\u0631.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 HTTPS \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u06a9\u0627\u0641\u06cc \u0646\u06cc\u0633\u062a. HTTPS \u0641\u0642\u0637 \u0645\u0633\u06cc\u0631 \u0627\u0631\u062a\u0628\u0627\u0637 \u0631\u0648 \u0627\u0645\u0646 \u0645\u06cc\u200c\u06a9\u0646\u0647\u061b \u0627\u0645\u0627 \u0645\u0634\u062e\u0635 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0627\u0632\u0647 \u062f\u06cc\u062f\u0646 \u06a9\u062f\u0648\u0645 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0648 \u062f\u0627\u0631\u0647. \u0627\u06af\u0647 API \u0628\u0647 \u0647\u0631 \u06a9\u0633\u06cc \u06a9\u0647 \u06cc\u06a9 \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0644\u0627 \u06cc\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0648 \u062a\u062d\u0648\u06cc\u0644 \u0628\u062f\u0647\u060c \u0647\u0645\u0686\u0646\u0627\u0646 \u0645\u0634\u06a9\u0644 \u0627\u0645\u0646\u06cc\u062a\u06cc \u062f\u0627\u0631\u06cc\u0645. \u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 HTTPS \u0631\u0648 \u0628\u0627\u06cc\u062f \u0627\u0648\u0644\u06cc\u0646 \u062f\u06cc\u0648\u0627\u0631 \u062f\u0641\u0627\u0639\u06cc \u0628\u062f\u0648\u0646\u06cc\u0645\u060c \u0646\u0647 \u062a\u0646\u0647\u0627 \u062f\u06cc\u0648\u0627\u0631. \u062f\u0631 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u062a\u0645\u0627\u0645 \u0622\u062f\u0631\u0633\u200c\u0647\u0627\u06cc Retrofit \u0628\u0627\u06cc\u062f \u0628\u0627 <code>https:\/\/<\/code> \u0634\u0631\u0648\u0639 \u0628\u0634\u0646 \u0648 \u062f\u0631 \u0646\u0633\u062e\u0647 \u0646\u0647\u0627\u06cc\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u06cc\u0686 Endpoint \u0639\u0645\u0648\u0645\u06cc\u200c\u0627\u06cc \u0646\u0628\u0627\u06cc\u062f \u0628\u0627 HTTP \u06a9\u0627\u0631 \u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0631\u0648 \u0637\u0648\u0631\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u062d\u062a\u06cc \u0627\u06af\u0647 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u0627\u0634\u062a\u0628\u0627\u0647\u06cc \u0622\u062f\u0631\u0633 HTTP \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u062c\u0627\u0632\u0647 \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0627\u0648\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0631\u0648 \u0646\u062f\u0647. \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u062f\u0627\u062e\u0644 \u067e\u0648\u0634\u0647 <code>res\/xml<\/code> \u0641\u0627\u06cc\u0644\u06cc \u0628\u0647 \u0646\u0627\u0645 <code>network_security_config.xml<\/code> \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\n&lt;network-security-config>\n    &lt;base-config cleartextTrafficPermitted=\"false\" \/>\n&lt;\/network-security-config>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">?xml version<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;1.0&quot;<\/span><span style=\"color: #24292E\"> encoding<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;utf-8&quot;<\/span><span style=\"color: #24292E\">?<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">network<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">security<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">base<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config cleartextTrafficPermitted<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;false&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">network<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">security<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0631\u0648 \u062f\u0627\u062e\u0644 <code>AndroidManifest.xml<\/code> \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0639\u0631\u0641\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;application\n    android:name=\".GheimatBanApplication\"\n    android:networkSecurityConfig=\"@xml\/network_security_config\"\n    android:theme=\"@style\/Theme.GheimatBan\">\n\n    &lt;!-- Activities -->\n\n&lt;\/application>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">name<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;.GheimatBanApplication&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">networkSecurityConfig<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;@xml\/network_security_config&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">theme<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;@style\/Theme.GheimatBan&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;!--<\/span><span style=\"color: #24292E\"> Activities <\/span><span style=\"color: #D73A49\">--&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">application<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u06cc\u0698\u06af\u06cc <code>cleartextTrafficPermitted=\"false\"<\/code> \u06cc\u0639\u0646\u06cc \u0627\u0631\u062a\u0628\u0627\u0637 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc\u200c\u0646\u0634\u062f\u0647 \u0646\u0628\u0627\u06cc\u062f \u0645\u062c\u0627\u0632 \u0628\u0627\u0634\u0647. \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0627\u0632 Network Security Configuration \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0645\u0648\u0627\u0631\u062f\u06cc \u0645\u062b\u0644 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 Cleartext Traffic\u060c \u062a\u0639\u06cc\u06cc\u0646 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627\u06cc \u0645\u0648\u0631\u062f\u0627\u0639\u062a\u0645\u0627\u062f \u0648 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u0645\u0646\u06cc\u062a TLS \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u0632 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u06f9 \u0628\u0647 \u0628\u0639\u062f \u0647\u0645 Cleartext Traffic \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 API \u0633\u0637\u062d \u06f2\u06f8 \u06cc\u0627 \u0628\u0627\u0644\u0627\u062a\u0631 \u0631\u0648 \u0647\u062f\u0641 \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u0646\u060c \u0628\u0647 \u0635\u0648\u0631\u062a \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u063a\u06cc\u0631\u0641\u0639\u0627\u0644\u0647\u061b \u0627\u0645\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0635\u0631\u06cc\u062d \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u0633\u06cc\u0627\u0633\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc \u067e\u0631\u0648\u0698\u0647 \u0648\u0627\u0636\u062d \u0648 \u0642\u0627\u0628\u0644\u200c\u06a9\u0646\u062a\u0631\u0644 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u062e\u0641\u06cc \u06a9\u0631\u062f\u0646 \u0622\u062f\u0631\u0633 API \u0627\u0645\u0646\u06cc\u062a \u0645\u062d\u0633\u0648\u0628 \u0646\u0645\u06cc\u0634\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06af\u0627\u0647\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u0622\u062f\u0631\u0633 API \u0631\u0648 \u062f\u0627\u062e\u0644 <code>BuildConfig<\/code> \u06cc\u0627 \u0641\u0627\u06cc\u0644 <code>local.properties<\/code> \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u0647 \u0648 \u062a\u0635\u0648\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u062d\u0627\u0644\u0627 \u0622\u062f\u0631\u0633 \u0633\u0631\u0648\u0631 \u0645\u062d\u0631\u0645\u0627\u0646\u0647 \u0634\u062f\u0647. \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0628\u0631\u0627\u06cc \u062c\u062f\u0627 \u06a9\u0631\u062f\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0645\u062d\u06cc\u0637 \u062a\u0648\u0633\u0639\u0647\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 \u06a9\u0627\u0631 \u062e\u0648\u0628\u06cc\u0647\u060c \u0627\u0645\u0627 \u0686\u06cc\u0632\u06cc \u0631\u0648 \u0627\u0632 \u062f\u0627\u062e\u0644 \u0646\u0633\u062e\u0647 \u0646\u0647\u0627\u06cc\u06cc APK \u0645\u062e\u0641\u06cc \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647. \u0648\u0642\u062a\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644 \u0645\u06cc\u0634\u0647\u060c \u0622\u062f\u0631\u0633 \u0645\u0648\u0631\u062f\u0646\u06cc\u0627\u0632\u0634 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0634\u06a9\u0644\u06cc \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644 \u0646\u0647\u0627\u06cc\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647 \u0648 \u06cc\u06a9 \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0648\u0646 \u0631\u0648 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0647. \u062d\u062a\u06cc \u0627\u06af\u0647 \u0622\u062f\u0631\u0633 \u0631\u0648 \u0628\u0647 \u0686\u0646\u062f \u062a\u06a9\u0647 \u062a\u0642\u0633\u06cc\u0645 \u06a9\u0646\u06cc\u0645 \u06cc\u0627 \u0628\u0627 \u0631\u0648\u0634\u200c\u0647\u0627\u06cc \u0633\u0627\u062f\u0647 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0628\u0627\u0632 \u0647\u0645 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0628\u0627\u06cc\u062f \u0627\u0648\u0646 \u0631\u0648 \u0628\u0627\u0632\u0633\u0627\u0632\u06cc \u06a9\u0646\u0647 \u0648 \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062b\u0644\u0627\u064b \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 Base URL \u0631\u0648 \u0628\u0631\u0627\u06cc \u0646\u0638\u0645 \u067e\u0631\u0648\u0698\u0647 \u062f\u0627\u062e\u0644 <code>BuildConfig<\/code> \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645\u060c \u0627\u0645\u0627 \u0646\u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0648 \u06cc\u06a9 \u0627\u0642\u062f\u0627\u0645 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0628\u062f\u0648\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>android {\n    buildTypes {\n        debug {\n            buildConfigField(\n                \"String\",\n                \"API_BASE_URL\",\n                \"\\\"https:\/\/dev-api.gheimatban.example\/\\\"\"\n            )\n        }\n\n        release {\n            buildConfigField(\n                \"String\",\n                \"API_BASE_URL\",\n                \"\\\"https:\/\/api.gheimatban.example\/\\\"\"\n            )\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">android<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">buildTypes<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">debug<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">buildConfigField<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;String&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;API_BASE_URL&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;<\/span><span style=\"color: #005CC5\">\\&quot;<\/span><span style=\"color: #032F62\">https:\/\/dev-api.gheimatban.example\/<\/span><span style=\"color: #005CC5\">\\&quot;<\/span><span style=\"color: #032F62\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">release<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">buildConfigField<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;String&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;API_BASE_URL&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;<\/span><span style=\"color: #005CC5\">\\&quot;<\/span><span style=\"color: #032F62\">https:\/\/api.gheimatban.example\/<\/span><span style=\"color: #005CC5\">\\&quot;<\/span><span style=\"color: #032F62\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f Retrofit \u0627\u0632 \u0647\u0645\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val retrofit = Retrofit.Builder()\n    .baseUrl(BuildConfig.API_BASE_URL)\n    .addConverterFactory(\n        GsonConverterFactory.create()\n    )\n    .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> retrofit <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> Retrofit.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    .<\/span><span style=\"color: #6F42C1\">baseUrl<\/span><span style=\"color: #24292E\">(BuildConfig.API_BASE_URL)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    .<\/span><span style=\"color: #6F42C1\">addConverterFactory<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        GsonConverterFactory.<\/span><span style=\"color: #6F42C1\">create<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u062c\u062f\u0627\u0633\u0627\u0632\u06cc \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0646\u0633\u062e\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0628\u0647 \u0633\u0631\u0648\u0631 \u062a\u0648\u0633\u0639\u0647 \u0648\u0635\u0644 \u0628\u0634\u0647 \u0648 \u0646\u0633\u062e\u0647 \u0627\u0646\u062a\u0634\u0627\u0631 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0627\u0635\u0644\u06cc\u060c \u0627\u0645\u0627 \u0645\u0647\u0627\u062c\u0645 \u0647\u0645\u0686\u0646\u0627\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0622\u062f\u0631\u0633 \u0647\u0631 \u062f\u0648 \u0633\u0631\u0648\u0631 \u0631\u0648 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u0647. \u0627\u0645\u0646\u06cc\u062a \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0627\u062c\u0631\u0627 \u0628\u0634\u0647\u060c \u0646\u0647 \u0628\u0627 \u067e\u0646\u0647\u0627\u0646 \u06a9\u0631\u062f\u0646 Endpoint.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">API Key \u062b\u0627\u0628\u062a \u0631\u0648 \u0646\u0628\u0627\u06cc\u062f \u0631\u0645\u0632 \u0648\u0631\u0648\u062f \u0633\u0631\u0648\u0631 \u0628\u062f\u0648\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u0628\u0631\u0627\u06cc \u062a\u0645\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u062b\u0627\u0628\u062a \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const val API_KEY = \"gheimatban-super-secret-key\"\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> API_KEY <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;gheimatban-super-secret-key&quot;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc\u0646 \u06a9\u0644\u06cc\u062f \u0631\u0648 \u0647\u0645\u0631\u0627\u0647 \u0647\u0645\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0628\u0641\u0631\u0633\u062a\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>X-Api-Key: gheimatban-super-secret-key\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">X<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">Api<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">Key: <\/span><span style=\"color: #6F42C1\">gheimatban<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #005CC5\">super<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">secret<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">key<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0631\u0648\u0634 \u0634\u0627\u06cc\u062f \u062c\u0644\u0648\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0645\u0644\u0627\u064b \u062a\u0635\u0627\u062f\u0641\u06cc \u0631\u0648 \u0628\u06af\u06cc\u0631\u0647\u060c \u0627\u0645\u0627 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0645\u0646\u06cc \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647. \u0686\u0648\u0646 \u0647\u0631 \u06a9\u0633\u06cc \u06a9\u0647 APK \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647 \u06cc\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u062f\u0631 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u0628\u06cc\u0646\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u06a9\u0644\u06cc\u062f \u0631\u0648 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u0647 \u0648 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u0627 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 Postman \u06cc\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0634\u062e\u0635\u06cc \u062e\u0648\u062f\u0634 \u0628\u0647 API \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0641\u0631\u0633\u062a\u0647. \u06a9\u0644\u06cc\u062f\u06cc \u06a9\u0647 \u0628\u06cc\u0646 \u062a\u0645\u0627\u0645 \u0646\u0635\u0628\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0634\u062a\u0631\u06a9\u0647\u060c \u0628\u0639\u062f \u0627\u0632 \u0627\u0641\u0634\u0627 \u0634\u062f\u0646 \u0639\u0645\u0644\u0627\u064b \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0648 \u0647\u0645\u0647 \u062f\u0633\u062a\u06af\u0627\u0647\u200c\u0647\u0627 \u0644\u0648 \u0631\u0641\u062a\u0647 \u0648 \u062a\u0639\u0648\u06cc\u0636\u0634 \u0647\u0645 \u0646\u06cc\u0627\u0632\u0645\u0646\u062f \u0627\u0646\u062a\u0634\u0627\u0631 \u0646\u0633\u062e\u0647 \u062c\u062f\u06cc\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062b\u0627\u0628\u062a \u0645\u0645\u06a9\u0646\u0647 \u0628\u0631\u0627\u06cc \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u067e\u0631\u0648\u0698\u0647\u060c \u0627\u0639\u0645\u0627\u0644 \u0633\u0647\u0645\u06cc\u0647 \u0631\u0648\u06cc \u0633\u0631\u0648\u06cc\u0633\u200c\u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u06cc\u0627 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u06cc\u06a9 API \u06a9\u0645\u200c\u062e\u0637\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0634\u0646\u060c \u0627\u0645\u0627 \u0646\u0628\u0627\u06cc\u062f \u0627\u062c\u0627\u0632\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0648 \u0635\u0627\u062f\u0631 \u06a9\u0646\u0646. \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0644\u06cc\u062f \u062b\u0627\u0628\u062a \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 API\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0631\u0648 \u0646\u0627\u0627\u0645\u0646 \u0645\u06cc\u200c\u062f\u0648\u0646\u0647\u060c \u0686\u0648\u0646 \u0627\u06cc\u0646 \u06a9\u0644\u06cc\u062f \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0632 \u0627\u067e \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06cc\u0627 \u0647\u0646\u06af\u0627\u0645 \u0627\u0631\u062a\u0628\u0627\u0637 \u0631\u0647\u06af\u06cc\u0631\u06cc \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u067e\u0633 \u0627\u06af\u0647 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0627\u0632 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u067e\u0648\u0644\u06cc \u062e\u0627\u0631\u062c\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0647 \u06a9\u0647 Secret Key \u0648\u0627\u0642\u0639\u06cc \u062f\u0627\u0631\u0647\u060c \u0627\u0648\u0646 \u06a9\u0644\u06cc\u062f \u0646\u0628\u0627\u06cc\u062f \u062f\u0627\u062e\u0644 \u0627\u067e \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0628\u0647 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0641\u0631\u0633\u062a\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0645\u0627 \u0628\u0627 Secret Key \u062e\u0648\u062f\u0634 \u0628\u0647 \u0633\u0631\u0648\u06cc\u0633 \u062e\u0627\u0631\u062c\u06cc \u0645\u062a\u0635\u0644 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u0639\u0646\u06cc \u0645\u0633\u06cc\u0631 \u0627\u0645\u0646 \u0627\u06cc\u0646 \u0634\u06a9\u0644\u06cc\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0646\u0627\u0645\u0647 GheimatBan \u2190 \u0633\u0631\u0648\u0631 GheimatBan \u2190 \u0633\u0631\u0648\u06cc\u0633 \u062e\u0627\u0631\u062c\u06cc<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644\u06cc:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0646\u0627\u0645\u0647 GheimatBan \u2190 \u0633\u0631\u0648\u06cc\u0633 \u062e\u0627\u0631\u062c\u06cc \u0628\u0627 Secret Key \u062f\u0627\u0626\u0645\u06cc<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u06cc\u062f \u062a\u0648\u06a9\u0646 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u062e\u0648\u062f\u0634 \u0631\u0648 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0627\u0632 \u0648\u0631\u0648\u062f \u0645\u0648\u0641\u0642 \u06a9\u0627\u0631\u0628\u0631\u060c \u0633\u0631\u0648\u0631 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u06cc\u06a9 Access Token \u0635\u0627\u062f\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u06cc\u0646 \u062a\u0648\u06a9\u0646 \u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u0646\u0634\u0633\u062a \u06a9\u0627\u0631\u0628\u0631\u0647 \u0648 \u062f\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0628\u0639\u062f\u06cc \u0641\u0631\u0633\u062a\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647 \u062a\u0627 \u0633\u0631\u0648\u0631 \u0628\u062f\u0648\u0646\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u062a\u0639\u0644\u0642 \u0628\u0647 \u0686\u0647 \u06a9\u0633\u06cc \u0627\u0633\u062a. \u0628\u0631\u062e\u0644\u0627\u0641 API Key \u062b\u0627\u0628\u062a\u060c Access Token \u0628\u0631\u0627\u06cc \u0647\u0631 \u06a9\u0627\u0631\u0628\u0631 \u06cc\u0627 \u0647\u0631 Session \u062c\u062f\u0627\u0633\u062a \u0648 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0632\u0645\u0627\u0646 \u0627\u0646\u0642\u0636\u0627\u06cc \u06a9\u0648\u062a\u0627\u0647\u06cc \u062f\u0627\u0631\u0647. \u062f\u0631 \u0646\u062a\u06cc\u062c\u0647 \u0627\u06af\u0647 \u06cc\u06a9 \u062a\u0648\u06a9\u0646 \u0627\u0641\u0634\u0627 \u0628\u0634\u0647\u060c \u0622\u0633\u06cc\u0628 \u0627\u0648\u0646 \u0645\u062d\u062f\u0648\u062f\u062a\u0631 \u0627\u0632 \u0627\u0641\u0634\u0627\u06cc \u06a9\u0644\u06cc\u062f \u0645\u0634\u062a\u0631\u06a9 \u06a9\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9 \u067e\u0627\u0633\u062e \u0633\u0627\u062f\u0647 \u0648\u0631\u0648\u062f \u0645\u0645\u06a9\u0646\u0647 \u0686\u0646\u06cc\u0646 \u0645\u062f\u0644\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class LoginResponse(\n    val accessToken: String,\n    val refreshToken: String,\n    val expiresIn: Long\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">LoginResponse<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> accessToken: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> refreshToken: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> expiresIn: <\/span><span style=\"color: #6F42C1\">Long<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f Access Token \u0628\u0627\u06cc\u062f \u062f\u0631 \u0647\u062f\u0631 <code>Authorization<\/code> \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0627\u0631\u0633\u0627\u0644 \u0628\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Authorization: Bearer ACCESS_TOKEN\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">Authorization: <\/span><span style=\"color: #6F42C1\">Bearer<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">ACCESS_TOKEN<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0645\u062c\u0628\u0648\u0631 \u0646\u0628\u0627\u0634\u06cc\u0645 \u062f\u0631 \u062a\u0645\u0627\u0645 \u0645\u062a\u062f\u0647\u0627\u06cc Retrofit \u0627\u06cc\u0646 \u0647\u062f\u0631 \u0631\u0648 \u062f\u0633\u062a\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645\u060c \u06cc\u06a9 Interceptor \u0628\u0631\u0627\u06cc OkHttp \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class AuthInterceptor(\n    private val tokenProvider: TokenProvider\n) : Interceptor {\n\n    override fun intercept(\n        chain: Interceptor.Chain\n    ): Response {\n        val token = tokenProvider.getAccessToken()\n\n        val requestBuilder =\n            chain.request()\n                .newBuilder()\n\n        if (!token.isNullOrBlank()) {\n            requestBuilder.header(\n                \"Authorization\",\n                \"Bearer $token\"\n            )\n        }\n\n        return chain.proceed(\n            requestBuilder.build()\n        )\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">AuthInterceptor<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> tokenProvider: <\/span><span style=\"color: #6F42C1\">TokenProvider<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) : <\/span><span style=\"color: #6F42C1\">Interceptor<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">intercept<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        chain: <\/span><span style=\"color: #6F42C1\">Interceptor<\/span><span style=\"color: #24292E\">.Chain<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">Response<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> token <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> tokenProvider.<\/span><span style=\"color: #6F42C1\">getAccessToken<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> requestBuilder <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            chain.<\/span><span style=\"color: #6F42C1\">request<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">newBuilder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #24292E\">token.<\/span><span style=\"color: #6F42C1\">isNullOrBlank<\/span><span style=\"color: #24292E\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            requestBuilder.<\/span><span style=\"color: #6F42C1\">header<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;Authorization&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;Bearer <\/span><span style=\"color: #005CC5\">$token<\/span><span style=\"color: #032F62\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> chain.<\/span><span style=\"color: #6F42C1\">proceed<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            requestBuilder.<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0627\u0628\u0637 <code>TokenProvider<\/code> \u0631\u0648 \u0647\u0645 \u062e\u06cc\u0644\u06cc \u0633\u0627\u062f\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u062a\u0627 Interceptor \u0645\u0633\u062a\u0642\u06cc\u0645 \u0628\u0647 SharedPreferences \u06cc\u0627 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u0648\u0627\u0628\u0633\u062a\u0647 \u0646\u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>interface TokenProvider {\n\n    fun getAccessToken(): String?\n\n    fun saveTokens(\n        accessToken: String,\n        refreshToken: String\n    )\n\n    fun clearTokens()\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">interface<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">TokenProvider<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getAccessToken<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">?<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">saveTokens<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        accessToken: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        refreshToken: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">clearTokens<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f Interceptor \u0631\u0648 \u0628\u0647 OkHttp \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 Retrofit \u0631\u0648 \u0628\u0627 \u0647\u0645\u0648\u0646 Client \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val okHttpClient =\n    OkHttpClient.Builder()\n        .addInterceptor(\n            AuthInterceptor(tokenProvider)\n        )\n        .build()\n\nval retrofit =\n    Retrofit.Builder()\n        .baseUrl(BuildConfig.API_BASE_URL)\n        .client(okHttpClient)\n        .addConverterFactory(\n            GsonConverterFactory.create()\n        )\n        .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> okHttpClient <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    OkHttpClient.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">addInterceptor<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">AuthInterceptor<\/span><span style=\"color: #24292E\">(tokenProvider)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> retrofit <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    Retrofit.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">baseUrl<\/span><span style=\"color: #24292E\">(BuildConfig.API_BASE_URL)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">client<\/span><span style=\"color: #24292E\">(okHttpClient)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">addConverterFactory<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            GsonConverterFactory.<\/span><span style=\"color: #6F42C1\">create<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0632 \u0627\u06cc\u0646 \u0644\u062d\u0638\u0647 \u0628\u0647 \u0628\u0639\u062f\u060c \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u06a9\u0647 \u0628\u0627 \u0627\u06cc\u0646 Client \u0641\u0631\u0633\u062a\u0627\u062f\u0647 \u0628\u0634\u0647\u060c \u062f\u0631 \u0635\u0648\u0631\u062a \u0648\u062c\u0648\u062f \u062a\u0648\u06a9\u0646 \u0647\u062f\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u0644\u0628\u062a\u0647 Endpoint\u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0648 \u062b\u0628\u062a\u200c\u0646\u0627\u0645 \u0642\u0628\u0644 \u0627\u0632 \u0648\u0631\u0648\u062f \u06a9\u0627\u0631\u0628\u0631 \u062a\u0648\u06a9\u0646\u06cc \u0646\u062f\u0627\u0631\u0646 \u0648 Interceptor \u0647\u0645 \u0686\u0648\u0646 \u0645\u0642\u062f\u0627\u0631 Token \u062e\u0627\u0644\u06cc\u0647\u060c \u0647\u06cc\u0686 \u0647\u062f\u0631 \u0627\u0636\u0627\u0641\u0647\u200c\u0627\u06cc \u0628\u0631\u0627\u0634\u0648\u0646 \u0646\u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0648\u06a9\u0646 \u0631\u0648 \u06a9\u062c\u0627 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u06a9\u0646\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0630\u062e\u06cc\u0631\u0647 \u06a9\u0631\u062f\u0646 Access Token \u0628\u0647 \u0634\u06a9\u0644 \u0645\u062a\u0646 \u0633\u0627\u062f\u0647 \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644\u060c Log\u060c \u0645\u062a\u063a\u06cc\u0631 \u0639\u0645\u0648\u0645\u06cc \u06cc\u0627 \u0633\u0648\u0631\u0633\u200c\u06a9\u062f \u06a9\u0627\u0631 \u062f\u0631\u0633\u062a\u06cc \u0646\u06cc\u0633\u062a. \u062a\u0648\u06a9\u0646 \u06cc\u06a9 \u062f\u0627\u062f\u0647 \u062d\u0633\u0627\u0633\u0647\u060c \u0686\u0648\u0646 \u0647\u0631 \u06a9\u0633\u06cc \u06a9\u0647 \u0628\u0647 \u0627\u0648\u0646 \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0647 \u0645\u0645\u06a9\u0646\u0647 \u062a\u0627 \u0632\u0645\u0627\u0646 \u0627\u0646\u0642\u0636\u0627\u06cc \u062a\u0648\u06a9\u0646 \u062e\u0648\u062f\u0634 \u0631\u0648 \u062c\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062c\u0627 \u0628\u0632\u0646\u0647. \u0628\u0631\u0627\u06cc \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0647\u062a\u0631\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u06a9\u0644\u06cc\u062f\u06cc \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u062f\u0627\u062e\u0644 Android Keystore \u0628\u0633\u0627\u0632\u06cc\u0645 \u0648 \u0628\u0627 \u0627\u0648\u0646 \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0631\u0645\u0632 \u06a9\u0646\u06cc\u0645. \u0645\u0632\u06cc\u062a Keystore \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u062e\u0648\u062f \u06a9\u0644\u06cc\u062f \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0628\u0647 \u0634\u06a9\u0644 \u0645\u0639\u0645\u0648\u0644 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0646\u06cc\u0633\u062a \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0628\u0627 \u06a9\u0646\u062a\u0631\u0644 \u0633\u06cc\u0633\u062a\u0645 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0627\u0645\u0644 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u062a\u0648\u06a9\u0646 \u0646\u0633\u0628\u062a\u0627\u064b \u0637\u0648\u0644\u0627\u0646\u06cc\u0647\u060c \u0627\u0645\u0627 \u0633\u0627\u062e\u062a\u0627\u0631 \u0633\u0627\u062f\u0647 \u0627\u0648\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>private const val KEY_ALIAS =\n    \"gheimatban_token_key\"\n\nprivate const val ANDROID_KEY_STORE =\n    \"AndroidKeyStore\"\n\nfun getOrCreateSecretKey(): SecretKey {\n    val keyStore =\n        KeyStore.getInstance(\n            ANDROID_KEY_STORE\n        ).apply {\n            load(null)\n        }\n\n    val existingKey =\n        keyStore.getKey(\n            KEY_ALIAS,\n            null\n        ) as? SecretKey\n\n    if (existingKey != null) {\n        return existingKey\n    }\n\n    val keyGenerator =\n        KeyGenerator.getInstance(\n            KeyProperties.KEY_ALGORITHM_AES,\n            ANDROID_KEY_STORE\n        )\n\n    val keySpec =\n        KeyGenParameterSpec.Builder(\n            KEY_ALIAS,\n            KeyProperties.PURPOSE_ENCRYPT or\n                KeyProperties.PURPOSE_DECRYPT\n        )\n            .setBlockModes(\n                KeyProperties.BLOCK_MODE_GCM\n            )\n            .setEncryptionPaddings(\n                KeyProperties.ENCRYPTION_PADDING_NONE\n            )\n            .build()\n\n    keyGenerator.init(keySpec)\n\n    return keyGenerator.generateKey()\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> KEY_ALIAS <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;gheimatban_token_key&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> ANDROID_KEY_STORE <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;AndroidKeyStore&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getOrCreateSecretKey<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">SecretKey<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> keyStore <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        KeyStore.<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ANDROID_KEY_STORE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ).<\/span><span style=\"color: #6F42C1\">apply<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">load<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">null<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> existingKey <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        keyStore.<\/span><span style=\"color: #6F42C1\">getKey<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            KEY_ALIAS,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ) <\/span><span style=\"color: #D73A49\">as<\/span><span style=\"color: #24292E\">? SecretKey<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (existingKey <\/span><span style=\"color: #D73A49\">!=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> existingKey<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> keyGenerator <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        KeyGenerator.<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            KeyProperties.KEY_ALGORITHM_AES,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ANDROID_KEY_STORE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> keySpec <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        KeyGenParameterSpec.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            KEY_ALIAS,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            KeyProperties.PURPOSE_ENCRYPT or<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                KeyProperties.PURPOSE_DECRYPT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">setBlockModes<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                KeyProperties.BLOCK_MODE_GCM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">setEncryptionPaddings<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                KeyProperties.ENCRYPTION_PADDING_NONE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    keyGenerator.<\/span><span style=\"color: #6F42C1\">init<\/span><span style=\"color: #24292E\">(keySpec)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> keyGenerator.<\/span><span style=\"color: #6F42C1\">generateKey<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u06a9\u062f \u06cc\u06a9 \u06a9\u0644\u06cc\u062f AES \u062f\u0627\u062e\u0644 Android Keystore \u0645\u06cc\u200c\u0633\u0627\u0632\u0647. \u0628\u0639\u062f \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0628\u0627 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 <code>AES\/GCM\/NoPadding<\/code> \u0631\u0645\u0632 \u06a9\u0646\u06cc\u0645 \u0648 \u0641\u0642\u0637 \u0645\u062a\u0646 \u0631\u0645\u0632\u200c\u0634\u062f\u0647 \u0648 IV \u0631\u0648 \u062f\u0627\u062e\u0644 SharedPreferences \u06cc\u0627 DataStore \u0646\u06af\u0647 \u062f\u0627\u0631\u06cc\u0645. \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0645\u062a\u0642\u0627\u0631\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 AES \u062f\u0631 \u062d\u0627\u0644\u062a\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 GCM \u0631\u0648 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0648 \u0628\u0631\u0627\u06cc \u0645\u062d\u0627\u0641\u0638\u062a \u0628\u0647\u062a\u0631 \u0627\u0632 \u06a9\u0644\u06cc\u062f \u0647\u0645 Android Keystore \u0631\u0648 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0645\u06cc\u062f\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u0628\u0627\u06cc\u062f \u0648\u0627\u0642\u0639\u200c\u0628\u06cc\u0646 \u0628\u0627\u0634\u06cc\u0645: \u0647\u06cc\u0686 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0627\u06cc \u0631\u0648\u06cc \u06cc\u06a9 \u062f\u0633\u062a\u06af\u0627\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u062a\u062d\u062a\u200c\u06a9\u0646\u062a\u0631\u0644 \u0645\u0647\u0627\u062c\u0645\u060c \u0627\u0645\u0646\u06cc\u062a \u0645\u0637\u0644\u0642 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647. Keystore \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0645\u0633\u062a\u0642\u06cc\u0645 \u06a9\u0644\u06cc\u062f \u0631\u0648 \u0633\u062e\u062a\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u0627\u06af\u0647 \u062f\u0633\u062a\u06af\u0627\u0647 Root \u0634\u062f\u0647 \u0628\u0627\u0634\u0647 \u06cc\u0627 \u062e\u0648\u062f \u0641\u0631\u0627\u06cc\u0646\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u062d\u062a \u06a9\u0646\u062a\u0631\u0644 \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0647\u060c \u0645\u0647\u0627\u062c\u0645 \u0645\u0645\u06a9\u0646\u0647 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0648\u06a9\u0646 \u06a9\u0645\u06a9 \u0628\u06af\u06cc\u0631\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u0645\u0646\u06cc\u062a \u062a\u0648\u06a9\u0646 \u0628\u0627\u06cc\u062f \u0628\u0627 \u0627\u0646\u0642\u0636\u0627\u06cc \u06a9\u0648\u062a\u0627\u0647\u060c \u0627\u0645\u06a9\u0627\u0646 \u0644\u063a\u0648 \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0648 \u0628\u0631\u0631\u0633\u06cc \u0631\u0641\u062a\u0627\u0631 \u0645\u0634\u06a9\u0648\u06a9 \u062a\u06a9\u0645\u06cc\u0644 \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Refresh Token \u0686\u0631\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0647 Access Token \u0628\u0631\u0627\u06cc \u0647\u0645\u06cc\u0634\u0647 \u0645\u0639\u062a\u0628\u0631 \u0628\u0627\u0634\u0647\u060c \u062f\u0632\u062f\u06cc\u062f\u0647 \u0634\u062f\u0646 \u0627\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u0637\u0648\u0644\u0627\u0646\u06cc\u200c\u0645\u062f\u062a \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0647. \u0628\u0631\u0627\u06cc \u0647\u0645\u06cc\u0646 Access Token\u0647\u0627 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0639\u0645\u0631 \u06a9\u0648\u062a\u0627\u0647\u200c\u062a\u0631\u06cc \u062f\u0627\u0631\u0646. \u0648\u0642\u062a\u06cc \u0645\u0646\u0642\u0636\u06cc \u0645\u06cc\u0634\u0646\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Refresh Token \u0627\u0632 \u0633\u0631\u0648\u0631 \u06cc\u06a9 Access Token \u062c\u062f\u06cc\u062f \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. Refresh Token \u062d\u0633\u0627\u0633\u200c\u062a\u0631\u0647 \u0648 \u0628\u0627\u06cc\u062f \u0628\u0627 \u062f\u0642\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0634\u0647\u060c \u0686\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0646\u0634\u0633\u062a \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0648\u0646\u062f \u06a9\u0644\u06cc \u0627\u06cc\u0646 \u0634\u06a9\u0644\u06cc\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06a9\u0627\u0631\u0628\u0631 \u0648\u0627\u0631\u062f \u0645\u06cc\u0634\u0647 \u2190 Access Token \u0648 Refresh Token \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647 \u2190 Access Token \u062f\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647 \u2190 \u0633\u0631\u0648\u0631 \u062e\u0637\u0627\u06cc 401 \u0645\u06cc\u062f\u0647 \u2190 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627 Refresh Token \u062a\u0648\u06a9\u0646 \u062a\u0627\u0632\u0647 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647 \u2190 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0642\u0628\u0644\u06cc \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 OkHttp \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0628\u0631\u0627\u06cc \u0648\u0627\u06a9\u0646\u0634 \u0628\u0647 \u062e\u0637\u0627\u06cc <code>401 Unauthorized<\/code> \u0627\u0632 <code>Authenticator<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class TokenAuthenticator(\n    private val tokenProvider: TokenProvider,\n    private val authApi: AuthApi\n) : Authenticator {\n\n    override fun authenticate(\n        route: Route?,\n        response: Response\n    ): Request? {\n        if (responseCount(response) >= 2) {\n            return null\n        }\n\n        val refreshToken =\n            tokenProvider.getRefreshToken()\n                ?: return null\n\n        val refreshResponse =\n            authApi.refreshTokenBlocking(\n                RefreshTokenRequest(\n                    refreshToken = refreshToken\n                )\n            ).execute()\n\n        if (!refreshResponse.isSuccessful) {\n            tokenProvider.clearTokens()\n            return null\n        }\n\n        val newTokens =\n            refreshResponse.body()\n                ?: return null\n\n        tokenProvider.saveTokens(\n            accessToken =\n                newTokens.accessToken,\n            refreshToken =\n                newTokens.refreshToken\n        )\n\n        return response.request\n            .newBuilder()\n            .header(\n                \"Authorization\",\n                \"Bearer ${newTokens.accessToken}\"\n            )\n            .build()\n    }\n\n    private fun responseCount(\n        response: Response\n    ): Int {\n        var count = 1\n        var current =\n            response.priorResponse\n\n        while (current != null) {\n            count++\n            current = current.priorResponse\n        }\n\n        return count\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">TokenAuthenticator<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> tokenProvider: <\/span><span style=\"color: #6F42C1\">TokenProvider<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> authApi: <\/span><span style=\"color: #6F42C1\">AuthApi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) : <\/span><span style=\"color: #6F42C1\">Authenticator<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">authenticate<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        route: <\/span><span style=\"color: #6F42C1\">Route<\/span><span style=\"color: #24292E\">?,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        response: <\/span><span style=\"color: #6F42C1\">Response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">Request<\/span><span style=\"color: #24292E\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #6F42C1\">responseCount<\/span><span style=\"color: #24292E\">(response) <\/span><span style=\"color: #D73A49\">&gt;=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">2<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> refreshToken <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            tokenProvider.<\/span><span style=\"color: #6F42C1\">getRefreshToken<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ?: <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> refreshResponse <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            authApi.<\/span><span style=\"color: #6F42C1\">refreshTokenBlocking<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">RefreshTokenRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    refreshToken <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> refreshToken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ).<\/span><span style=\"color: #6F42C1\">execute<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #24292E\">refreshResponse.isSuccessful) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            tokenProvider.<\/span><span style=\"color: #6F42C1\">clearTokens<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> newTokens <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            refreshResponse.<\/span><span style=\"color: #6F42C1\">body<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ?: <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        tokenProvider.<\/span><span style=\"color: #6F42C1\">saveTokens<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            accessToken <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                newTokens.accessToken,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            refreshToken <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                newTokens.refreshToken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> response.request<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">newBuilder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">header<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;Authorization&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;Bearer ${newTokens.accessToken}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">responseCount<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        response: <\/span><span style=\"color: #6F42C1\">Response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">Int<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">var<\/span><span style=\"color: #24292E\"> count <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">var<\/span><span style=\"color: #24292E\"> current <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            response.priorResponse<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">while<\/span><span style=\"color: #24292E\"> (current <\/span><span style=\"color: #D73A49\">!=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            count<\/span><span style=\"color: #D73A49\">++<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            current <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> current.priorResponse<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f Authenticator \u0631\u0648 \u0647\u0645 \u0628\u0647 Client \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val okHttpClient =\n    OkHttpClient.Builder()\n        .addInterceptor(\n            AuthInterceptor(tokenProvider)\n        )\n        .authenticator(\n            TokenAuthenticator(\n                tokenProvider = tokenProvider,\n                authApi = authApi\n            )\n        )\n        .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> okHttpClient <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    OkHttpClient.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">addInterceptor<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">AuthInterceptor<\/span><span style=\"color: #24292E\">(tokenProvider)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">authenticator<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">TokenAuthenticator<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                tokenProvider <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> tokenProvider,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                authApi <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> authApi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0631\u0633\u06cc \u062a\u0639\u062f\u0627\u062f \u067e\u0627\u0633\u062e\u200c\u0647\u0627 \u062c\u0644\u0648\u06cc \u062d\u0644\u0642\u0647 \u0628\u06cc\u200c\u0646\u0647\u0627\u06cc\u062a \u0631\u0648 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. \u0627\u06af\u0647 Refresh Token \u0647\u0645 \u0646\u0627\u0645\u0639\u062a\u0628\u0631 \u06cc\u0627 \u0645\u0646\u0642\u0636\u06cc \u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0628\u0627\u06cc\u062f \u062f\u0627\u0626\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u062a\u06a9\u0631\u0627\u0631 \u06a9\u0646\u0647\u061b \u0628\u0627\u06cc\u062f \u062a\u0648\u06a9\u0646\u200c\u0647\u0627 \u0631\u0648 \u067e\u0627\u06a9 \u06a9\u0646\u0647 \u0648 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0647 \u0635\u0641\u062d\u0647 \u0648\u0631\u0648\u062f \u0628\u0641\u0631\u0633\u062a\u0647. \u062f\u0631 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0648\u0627\u0642\u0639\u06cc \u0628\u0627\u06cc\u062f \u0647\u0645\u200c\u0632\u0645\u0627\u0646\u06cc \u0686\u0646\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a 401 \u0631\u0648 \u0647\u0645 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u06cc\u0645\u060c \u0686\u0648\u0646 \u0645\u0645\u06a9\u0646\u0647 \u0686\u0646\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0645\u200c\u0632\u0645\u0627\u0646 \u0628\u0631\u0627\u06cc Refresh Token \u0627\u0642\u062f\u0627\u0645 \u06a9\u0646\u0646. \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u0627 <code>Mutex<\/code> \u06cc\u0627 \u06cc\u06a9 \u0633\u0627\u0632\u0648\u06a9\u0627\u0631 \u0645\u0631\u06a9\u0632\u06cc \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u062f\u06cc\u0645 \u0641\u0642\u0637 \u06cc\u06a9 Refresh \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647 \u0648 \u0628\u0642\u06cc\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0645\u0646\u062a\u0638\u0631 \u0646\u062a\u06cc\u062c\u0647 \u0627\u0648\u0646 \u0628\u0645\u0648\u0646\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0627 \u0645\u062c\u0648\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0641\u0631\u0642 \u062f\u0627\u0631\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u0645\u0641\u0627\u0647\u06cc\u0645 \u0627\u0645\u0646\u06cc\u062a API \u062a\u0641\u0627\u0648\u062a \u0628\u06cc\u0646 <strong>Authentication<\/strong> \u0648 <strong>Authorization<\/strong> \u0627\u0633\u062a. Authentication \u06cc\u0639\u0646\u06cc \u0633\u0631\u0648\u0631 \u062a\u0634\u062e\u06cc\u0635 \u0628\u062f\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0632 \u0637\u0631\u0641 \u0686\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u0648\u0645\u062f\u0647. Authorization \u06cc\u0639\u0646\u06cc \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647 \u0647\u0645\u0648\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0627\u0632\u0647 \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0648 \u062f\u0627\u0631\u0647 \u06cc\u0627 \u0646\u0647. \u062f\u0627\u0634\u062a\u0646 \u06cc\u06a9 \u062a\u0648\u06a9\u0646 \u0645\u0639\u062a\u0628\u0631 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc \u0646\u06cc\u0633\u062a \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0627\u0632\u0647 \u062f\u06cc\u062f\u0646 \u062a\u0645\u0627\u0645 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0631\u0648 \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 Endpoint \u0632\u06cc\u0631 \u062c\u0632\u0626\u06cc\u0627\u062a \u0647\u0634\u062f\u0627\u0631 \u0642\u06cc\u0645\u062a \u0631\u0648 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0648\u0646\u0647:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/alerts\/825\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0645\u06a9\u0646\u0647 \u062a\u0648\u06a9\u0646 \u0627\u06cc\u0645\u0627\u0646 \u0631\u0648 \u0628\u0641\u0631\u0633\u062a\u0647\u060c \u0627\u0645\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0634\u0646\u0627\u0633\u0647 <code>825<\/code> \u0631\u0648 \u0628\u0647 <code>826<\/code> \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647. \u0627\u06af\u0647 \u0633\u0631\u0648\u0631 \u0641\u0642\u0637 \u0645\u0639\u062a\u0628\u0631 \u0628\u0648\u062f\u0646 \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647 \u0648 \u0647\u0634\u062f\u0627\u0631 \u0634\u0645\u0627\u0631\u0647 \u06f8\u06f2\u06f6 \u0631\u0648 \u0628\u0631\u06af\u0631\u062f\u0648\u0646\u0647\u060c \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0647\u0634\u062f\u0627\u0631 \u0645\u062a\u0639\u0644\u0642 \u0628\u0647 \u0634\u062e\u0635 \u062f\u06cc\u06af\u0631\u06cc \u0631\u0648 \u0628\u0628\u06cc\u0646\u0647. \u0627\u06cc\u0646 \u0622\u0633\u06cc\u0628\u200c\u067e\u0630\u06cc\u0631\u06cc \u062f\u0631 OWASP \u0628\u0627 \u0639\u0646\u0648\u0627\u0646 Broken Object Level Authorization \u0634\u0646\u0627\u062e\u062a\u0647 \u0645\u06cc\u0634\u0647 \u0648 \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u062e\u0637\u0631\u0647\u0627\u06cc API\u0647\u0627\u0633\u062a. \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u062f\u0631 \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647 \u0634\u06cc\u0621 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0634\u062f\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u0645\u062a\u0639\u0644\u0642 \u0628\u0647 \u0647\u0645\u0648\u0646 \u06a9\u0627\u0631\u0628\u0631\u0647 \u06cc\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0645\u062c\u0648\u0632 \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u0644\u0627\u0632\u0645 \u0631\u0648 \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u0646\u0637\u0642 \u0627\u0634\u062a\u0628\u0627\u0647 \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u06cc\u0646 \u0634\u06a9\u0644\u06cc\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$alertId = $_GET&#91;'id'&#93;;\n\n$alert = findAlertById($alertId);\n\nreturnJson($alert);\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">$alertId <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> $_GET&#91;<\/span><span style=\"color: #032F62\">&#39;id&#39;<\/span><span style=\"color: #24292E\">&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$alert <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">findAlertById<\/span><span style=\"color: #24292E\">($alertId);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6F42C1\">returnJson<\/span><span style=\"color: #24292E\">($alert);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u0645\u0646\u0637\u0642 \u062f\u0631\u0633\u062a \u0628\u0627\u06cc\u062f \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u200c\u0634\u062f\u0647 \u0631\u0648 \u0647\u0645 \u062f\u0631 Query \u062f\u062e\u0627\u0644\u062a \u0628\u062f\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$userId = getAuthenticatedUserId();\n$alertId = $_GET&#91;'id'&#93;;\n\n$alert = findAlertByIdAndUserId(\n    $alertId,\n    $userId\n);\n\nif (!$alert) {\n    http_response_code(404);\n    exit;\n}\n\nreturnJson($alert);\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">$userId <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getAuthenticatedUserId<\/span><span style=\"color: #24292E\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$alertId <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> $_GET&#91;<\/span><span style=\"color: #032F62\">&#39;id&#39;<\/span><span style=\"color: #24292E\">&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$alert <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">findAlertByIdAndUserId<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    $alertId,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    $userId<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #24292E\">$alert) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">http_response_code<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">404<\/span><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    exit;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6F42C1\">returnJson<\/span><span style=\"color: #24292E\">($alert);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0642\u062a \u06a9\u0646 \u06a9\u0647 \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0646\u0628\u0627\u06cc\u062f \u0627\u0632 Body \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06af\u0631\u0641\u062a\u0647 \u0628\u0634\u0647 \u0648 \u0645\u0648\u0631\u062f\u0627\u0639\u062a\u0645\u0627\u062f \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0647. \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0627\u0648\u0646 \u0631\u0648 \u0627\u0632 \u062a\u0648\u06a9\u0646 \u0645\u0639\u062a\u0628\u0631 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u0647. \u0645\u062b\u0644\u0627\u064b \u06a9\u0627\u0631\u0628\u0631 \u0646\u0628\u0627\u06cc\u062f \u0628\u062a\u0648\u0646\u0647 \u0686\u0646\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u0628\u0641\u0631\u0633\u062a\u0647 \u0648 \u0627\u0646\u062a\u0638\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645 \u0645\u0642\u062f\u0627\u0631 <code>userId<\/code> \u0631\u0648 \u0635\u0627\u062f\u0642\u0627\u0646\u0647 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>{\n  \"userId\": 42,\n  \"productId\": 918\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">  <\/span><span style=\"color: #032F62\">&quot;userId&quot;<\/span><span style=\"color: #24292E\">: <\/span><span style=\"color: #6F42C1\">42<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">  <\/span><span style=\"color: #032F62\">&quot;productId&quot;<\/span><span style=\"color: #24292E\">: <\/span><span style=\"color: #6F42C1\">918<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0648\u062f\u0646 \u06cc\u06a9 \u06a9\u0627\u0644\u0627 \u0628\u0647 \u0639\u0644\u0627\u0642\u0647\u200c\u0645\u0646\u062f\u06cc\u200c\u0647\u0627\u060c \u0641\u0642\u0637 <code>productId<\/code> \u0628\u0627\u06cc\u062f \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u0628\u0634\u0647 \u0648 <code>userId<\/code> \u0628\u0627\u06cc\u062f \u0627\u0632 Session \u06cc\u0627 Token \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0628\u0627\u06cc\u062f \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0636\u0627\u0641\u06cc \u0627\u0632 API \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06af\u0627\u0647\u06cc \u0633\u0631\u0648\u0631 \u06cc\u06a9 \u0634\u06cc\u0621 \u06a9\u0627\u0645\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0627\u067e \u0641\u0642\u0637 \u0646\u0627\u0645 \u0646\u0645\u0627\u06cc\u0634\u06cc \u0631\u0648 \u0644\u0627\u0632\u0645 \u062f\u0627\u0631\u0647. \u0645\u062b\u0644\u0627\u064b \u067e\u0627\u0633\u062e API \u0645\u0645\u06a9\u0646\u0647 \u0634\u0627\u0645\u0644 \u0627\u06cc\u0645\u06cc\u0644\u060c \u0634\u0645\u0627\u0631\u0647 \u062a\u0644\u0641\u0646\u060c \u0646\u0642\u0634 \u062f\u0627\u062e\u0644\u06cc\u060c \u0647\u0634 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u06cc\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u0647\u0645 \u0628\u0627\u0634\u0647. \u062d\u062a\u06cc \u0627\u06af\u0647 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u06cc\u0646 \u0641\u06cc\u0644\u062f\u0647\u0627 \u0631\u0648 \u0646\u0645\u0627\u06cc\u0634 \u0646\u062f\u0647\u060c \u0647\u0645\u0647 \u0627\u0648\u0646\u200c\u0647\u0627 \u062f\u0631 \u067e\u0627\u0633\u062e \u0634\u0628\u06a9\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0646 \u0648 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u0647\u062f\u0647 \u0647\u0633\u062a\u0646. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0631\u0648 \u0628\u0631\u06af\u0631\u062f\u0648\u0646\u0647 \u06a9\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0631\u0627\u06cc \u0647\u0645\u0648\u0646 \u0635\u0641\u062d\u0647 \u0644\u0627\u0632\u0645\u200c\u0627\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062f\u0644 \u067e\u0627\u0633\u062e \u0628\u0647\u062a\u0631\u0647 \u0645\u062d\u062f\u0648\u062f \u0648 \u0647\u062f\u0641\u0645\u0646\u062f \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class UserProfileResponse(\n    val id: Long,\n    val displayName: String,\n    val avatarUrl: String?\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">UserProfileResponse<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> id: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> displayName: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> avatarUrl: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0628\u0627\u06cc\u062f \u0645\u062f\u0644 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u0631\u0648 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u067e\u0627\u0633\u062e API \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u0645. \u0686\u0648\u0646 \u0628\u0627 \u0627\u0636\u0627\u0641\u0647 \u0634\u062f\u0646 \u0647\u0631 \u0633\u062a\u0648\u0646 \u062c\u062f\u06cc\u062f \u0628\u0647 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633\u060c \u0645\u0645\u06a9\u0646\u0647 \u0646\u0627\u062e\u0648\u0627\u0633\u062a\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0647\u0645 \u0648\u0627\u0631\u062f \u067e\u0627\u0633\u062e API \u0628\u0634\u0646. OWASP \u0627\u06cc\u0646 \u0646\u0648\u0639 \u0645\u0634\u06a9\u0644 \u0631\u0648 \u062f\u0631 \u062f\u0633\u062a\u0647 \u06a9\u0646\u062a\u0631\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0631 \u0633\u0637\u062d \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u0634\u06cc\u0621 \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u0647\u061b \u06cc\u0639\u0646\u06cc \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u062e\u0648\u062f \u0634\u06cc\u0621\u060c \u0631\u0648\u06cc \u0641\u06cc\u0644\u062f\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0642\u0627\u0628\u0644 \u062e\u0648\u0627\u0646\u062f\u0646 \u06cc\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0647\u0633\u062a\u0646 \u0647\u0645 \u06a9\u0646\u062a\u0631\u0644 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u06cc\u0646 \u0645\u0648\u0636\u0648\u0639 \u062f\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0647\u0645 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647. \u0627\u06af\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0641\u0642\u0637 \u0642\u0631\u0627\u0631\u0647 \u0646\u0627\u0645 \u0646\u0645\u0627\u06cc\u0634\u06cc \u062e\u0648\u062f\u0634 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647\u060c \u0646\u0628\u0627\u06cc\u062f \u0633\u0631\u0648\u0631 \u0647\u0631 \u0641\u06cc\u0644\u062f\u06cc \u06a9\u0647 \u062f\u0631 JSON \u0627\u0631\u0633\u0627\u0644 \u0634\u062f \u0642\u0628\u0648\u0644 \u06a9\u0646\u0647. \u0648\u06af\u0631\u0646\u0647 \u0645\u0647\u0627\u062c\u0645 \u0645\u0645\u06a9\u0646\u0647 \u0641\u06cc\u0644\u062f\u06cc \u0645\u062b\u0644 <code>isAdmin<\/code> \u06cc\u0627 <code>role<\/code> \u0631\u0648 \u0647\u0645 \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0647. \u0628\u0647\u062a\u0631\u0647 \u0628\u0631\u0627\u06cc \u0647\u0631 \u0639\u0645\u0644\u06cc\u0627\u062a DTO \u062c\u062f\u0627 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class UpdateProfileRequest(\n    val displayName: String\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">UpdateProfileRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> displayName: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0627\u062c\u0631\u0627 \u0628\u0634\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 Endpoint \u0648\u0631\u0648\u062f \u0647\u06cc\u0686 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u06cc \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062f\u0631 \u0686\u0646\u062f \u062f\u0642\u06cc\u0642\u0647 \u0647\u0632\u0627\u0631\u0627\u0646 \u0631\u0645\u0632 \u0645\u062e\u062a\u0644\u0641 \u0631\u0648 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0634\u0645\u0627\u0631\u0647 \u062a\u0644\u0641\u0646 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u0647. \u06cc\u0627 \u0645\u0645\u06a9\u0646\u0647 Endpoint \u062f\u0631\u06cc\u0627\u0641\u062a \u0642\u06cc\u0645\u062a \u0631\u0648 \u0628\u0627 \u0635\u062f\u0647\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0631 \u062b\u0627\u0646\u06cc\u0647 \u0635\u062f\u0627 \u0628\u0632\u0646\u0647 \u0648 \u0645\u0646\u0627\u0628\u0639 \u0633\u0631\u0648\u0631 \u06cc\u0627 \u0633\u0631\u0648\u06cc\u0633 \u062e\u0627\u0631\u062c\u06cc \u0631\u0648 \u0645\u0635\u0631\u0641 \u06a9\u0646\u0647. \u0627\u06cc\u0646\u062c\u0627 \u0628\u0647 Rate Limiting \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645\u061b \u06cc\u0639\u0646\u06cc \u0633\u0631\u0648\u0631 \u0645\u0634\u062e\u0635 \u06a9\u0646\u0647 \u0647\u0631 IP\u060c \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06cc\u0627 Device \u062f\u0631 \u06cc\u06a9 \u0628\u0627\u0632\u0647 \u0632\u0645\u0627\u0646\u06cc \u0686\u0646\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u062c\u0627\u0632\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u062f\u06a9\u0645\u0647 \u062f\u0631 \u0627\u067e \u06cc\u0627 \u06af\u0630\u0627\u0634\u062a\u0646 Delay \u062f\u0627\u062e\u0644 \u06a9\u062f \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0627\u0645\u0646\u06cc\u062a \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0686\u0648\u0646 \u0645\u0647\u0627\u062c\u0645 \u0627\u0635\u0644\u0627\u064b \u0645\u062c\u0628\u0648\u0631 \u0646\u06cc\u0633\u062a \u0627\u0632 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0647. \u0627\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0645\u0633\u062a\u0642\u06cc\u0645 \u0628\u0647 API \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0641\u0631\u0633\u062a\u0647. Rate Limiting \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0633\u0631\u0648\u0631\u060c API Gateway\u060c Reverse Proxy \u06cc\u0627 \u0633\u0631\u0648\u06cc\u0633\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 Cloudflare \u0627\u062c\u0631\u0627 \u0628\u0634\u0647. OWASP \u0645\u0635\u0631\u0641 \u0646\u0627\u0645\u062d\u062f\u0648\u062f \u0645\u0646\u0627\u0628\u0639 \u0648 \u0646\u0628\u0648\u062f \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0645\u0646\u0627\u0633\u0628 \u0631\u0648\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0631\u0648 \u06cc\u06a9\u06cc \u0627\u0632 \u062e\u0637\u0631\u0647\u0627\u06cc \u0627\u0635\u0644\u06cc API \u0645\u0639\u0631\u0641\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0686\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0627\u0639\u062b \u0633\u0648\u0621\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u0627\u0644\u06cc \u06cc\u0627 \u0627\u0632 \u062f\u0633\u062a\u0631\u0633 \u062e\u0627\u0631\u062c \u0634\u062f\u0646 \u0633\u0631\u0648\u06cc\u0633 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644 \u0645\u0645\u06a9\u0646\u0647 \u0633\u06cc\u0627\u0633\u062a \u0633\u0631\u0648\u0631 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0627\u06cc\u0646 \u0628\u0627\u0634\u0647 \u06a9\u0647 \u0647\u0631 \u062d\u0633\u0627\u0628 \u0641\u0642\u0637 \u067e\u0646\u062c \u062a\u0644\u0627\u0634 \u0648\u0631\u0648\u062f \u062f\u0631 \u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0647\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0641\u0642\u0637 \u062a\u0639\u062f\u0627\u062f \u0645\u0634\u062e\u0635\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0642\u06cc\u0645\u062a \u062f\u0631 \u0633\u0627\u0639\u062a \u0628\u0641\u0631\u0633\u062a\u0647 \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u067e\u0631\u0647\u0632\u06cc\u0646\u0647 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0633\u062e\u062a\u200c\u06af\u06cc\u0631\u0627\u0646\u0647\u200c\u062a\u0631\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646. \u0648\u0642\u062a\u06cc \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u067e\u0631 \u0634\u062f\u060c \u0633\u0631\u0648\u0631 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u067e\u0627\u0633\u062e <code>429 Too Many Requests<\/code> \u0645\u06cc\u062f\u0647 \u0648 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0632\u0645\u0627\u0646 \u062a\u0642\u0631\u06cc\u0628\u06cc \u062a\u0644\u0627\u0634 \u0628\u0639\u062f\u06cc \u0631\u0648 \u0647\u0645 \u062f\u0631 \u0647\u062f\u0631 <code>Retry-After<\/code> \u0642\u0631\u0627\u0631 \u0628\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u0645 \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u067e\u0627\u0633\u062e \u0631\u0648 \u0628\u0647 \u0634\u06a9\u0644 \u0645\u0646\u0627\u0633\u0628\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>when (response.code()) {\n    401 -> {\n        showLoginRequired()\n    }\n\n    403 -> {\n        showPermissionDenied()\n    }\n\n    429 -> {\n        showMessage(\n            \"\u062a\u0639\u062f\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0632\u06cc\u0627\u062f \u0628\u0648\u062f\u0647. \u06a9\u0645\u06cc \u0628\u0639\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646.\"\n        )\n    }\n\n    in 500..599 -> {\n        showMessage(\n            \"\u0633\u0631\u0648\u0631 \u0645\u0648\u0642\u062a\u0627\u064b \u067e\u0627\u0633\u062e \u0646\u0645\u06cc\u062f\u0647.\"\n        )\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">when<\/span><span style=\"color: #24292E\"> (response.<\/span><span style=\"color: #6F42C1\">code<\/span><span style=\"color: #24292E\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">401<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">showLoginRequired<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">403<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">showPermissionDenied<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">429<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">showMessage<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\u062a\u0639\u062f\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0632\u06cc\u0627\u062f \u0628\u0648\u062f\u0647. \u06a9\u0645\u06cc \u0628\u0639\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">in<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">500<\/span><span style=\"color: #D73A49\">..<\/span><span style=\"color: #005CC5\">599<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">showMessage<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\u0633\u0631\u0648\u0631 \u0645\u0648\u0642\u062a\u0627\u064b \u067e\u0627\u0633\u062e \u0646\u0645\u06cc\u062f\u0647.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0631\u0648 \u062f\u0627\u062e\u0644 Log \u0686\u0627\u067e \u0646\u06a9\u0646<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0646\u06af\u0627\u0645 \u062a\u0648\u0633\u0639\u0647 \u062e\u06cc\u0644\u06cc \u0648\u0633\u0648\u0633\u0647\u200c\u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u062a\u0645\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0648 \u067e\u0627\u0633\u062e\u200c\u0647\u0627\u06cc Retrofit \u0631\u0648 \u0628\u0627 <code>HttpLoggingInterceptor<\/code> \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u06cc\u0645. \u0627\u06cc\u0646 \u0627\u0628\u0632\u0627\u0631 \u0628\u0631\u0627\u06cc Debug \u0641\u0648\u0642\u200c\u0627\u0644\u0639\u0627\u062f\u0647 \u0645\u0641\u06cc\u062f\u0647\u060c \u0627\u0645\u0627 \u0627\u06af\u0647 \u0633\u0637\u062d <code>BODY<\/code> \u062f\u0631 \u0646\u0633\u062e\u0647 \u0627\u0646\u062a\u0634\u0627\u0631 \u0641\u0639\u0627\u0644 \u0628\u0645\u0648\u0646\u0647\u060c \u0645\u0645\u06a9\u0646\u0647 \u062a\u0648\u06a9\u0646\u200c\u0647\u0627\u060c \u0634\u0645\u0627\u0631\u0647 \u062a\u0644\u0641\u0646\u060c \u0627\u06cc\u0645\u06cc\u0644\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u067e\u0631\u0648\u0641\u0627\u06cc\u0644 \u0648 Body \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u062f\u0627\u062e\u0644 Log \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0646. \u067e\u0633 Logging \u06a9\u0627\u0645\u0644 \u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u062f\u0631 \u0646\u0633\u062e\u0647 Debug \u0641\u0639\u0627\u0644 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val loggingInterceptor =\n    HttpLoggingInterceptor().apply {\n        level =\n            if (BuildConfig.DEBUG) {\n                HttpLoggingInterceptor.Level.BODY\n            } else {\n                HttpLoggingInterceptor.Level.NONE\n            }\n\n        redactHeader(\"Authorization\")\n        redactHeader(\"Cookie\")\n    }\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> loggingInterceptor <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">HttpLoggingInterceptor<\/span><span style=\"color: #24292E\">().<\/span><span style=\"color: #6F42C1\">apply<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        level <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (BuildConfig.DEBUG) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                HttpLoggingInterceptor.Level.BODY<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            } <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                HttpLoggingInterceptor.Level.NONE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">redactHeader<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;Authorization&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">redactHeader<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;Cookie&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0627\u06cc\u0646 Interceptor \u0631\u0648 \u0628\u0647 Client \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val okHttpClient =\n    OkHttpClient.Builder()\n        .addInterceptor(loggingInterceptor)\n        .addInterceptor(\n            AuthInterceptor(tokenProvider)\n        )\n        .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> okHttpClient <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    OkHttpClient.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">addInterceptor<\/span><span style=\"color: #24292E\">(loggingInterceptor)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">addInterceptor<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">AuthInterceptor<\/span><span style=\"color: #24292E\">(tokenProvider)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062a\u062f <code>redactHeader<\/code> \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u0645\u0642\u062f\u0627\u0631 \u0647\u062f\u0631\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u062d\u062a\u06cc \u062f\u0631 \u062d\u0627\u0644\u062a Debug \u0647\u0645 \u0628\u0647 \u0634\u06a9\u0644 \u06a9\u0627\u0645\u0644 \u062f\u0627\u062e\u0644 Log \u062f\u06cc\u062f\u0647 \u0646\u0634\u0647. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0646\u0628\u0627\u06cc\u062f \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0628\u0627 <code>Log.d<\/code> \u0686\u0627\u067e \u06a9\u0646\u06cc\u0645\u060c \u062f\u0627\u062e\u0644 \u067e\u06cc\u0627\u0645 \u062e\u0637\u0627 \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u06cc\u0645 \u06cc\u0627 \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0645\u0634\u06a9\u0644 \u062f\u0631 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u06af\u0632\u0627\u0631\u0634 Crash \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u0645. \u067e\u06cc\u0627\u0645 \u062e\u0637\u0627 \u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0642\u0627\u0628\u0644\u200c\u0641\u0647\u0645 \u0628\u0627\u0634\u0647\u060c \u0627\u0645\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u062f\u0627\u062e\u0644\u06cc \u0633\u0631\u0648\u0631\u060c Query \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633\u060c Stack Trace \u06cc\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc \u0646\u0628\u0627\u06cc\u062f \u062f\u0627\u062e\u0644 \u067e\u0627\u0633\u062e \u0639\u0645\u0648\u0645\u06cc API \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Certificate Pinning \u0647\u0645\u06cc\u0634\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u062e\u0648\u0628\u06cc \u0646\u06cc\u0633\u062a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Certificate Pinning \u06cc\u0639\u0646\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0642\u0637 \u06af\u0648\u0627\u0647\u06cc \u06cc\u0627 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0645\u0634\u062e\u0635\u06cc \u0631\u0648 \u0628\u0631\u0627\u06cc \u062f\u0627\u0645\u0646\u0647 \u0633\u0631\u0648\u0631 \u0642\u0628\u0648\u0644 \u06a9\u0646\u0647. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0639\u0636\u06cc \u062d\u0645\u0644\u0647\u200c\u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0631\u0648 \u0633\u062e\u062a\u200c\u062a\u0631 \u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u0647\u0632\u06cc\u0646\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc \u0632\u06cc\u0627\u062f\u06cc \u062f\u0627\u0631\u0647. \u0627\u06af\u0647 \u06af\u0648\u0627\u0647\u06cc \u0633\u0631\u0648\u0631 \u062a\u0645\u062f\u06cc\u062f \u06cc\u0627 Certificate Authority \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u0647 \u0648 Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0645\u0646\u0627\u0633\u0628\u06cc \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645\u060c \u062a\u0645\u0627\u0645 \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0645\u06a9\u0646\u0647 \u0646\u0627\u06af\u0647\u0627\u0646 \u0627\u0631\u062a\u0628\u0627\u0637\u0634\u0648\u0646 \u0631\u0648 \u0628\u0627 \u0633\u0631\u0648\u0631 \u0627\u0632 \u062f\u0633\u062a \u0628\u062f\u0646 \u0648 \u0631\u0641\u0639 \u0645\u0634\u06a9\u0644 \u0647\u0645 \u0646\u06cc\u0627\u0632\u0645\u0646\u062f \u0627\u0646\u062a\u0634\u0627\u0631 \u0622\u067e\u062f\u06cc\u062a \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f Pinning \u0631\u0648 \u0628\u0647 \u0637\u0648\u0631 \u0639\u0645\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u062a\u0648\u0635\u06cc\u0647 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0646. \u0627\u06af\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0627\u0648\u0646 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0628\u0627\u06cc\u062f \u0686\u0646\u062f Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0642\u06cc\u0642 \u0686\u0631\u062e\u0634 \u06a9\u0644\u06cc\u062f \u0648 \u062a\u0627\u0631\u06cc\u062e \u0627\u0646\u0642\u0636\u0627\u06cc \u0645\u0646\u0627\u0633\u0628 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u0645\u062b\u0644 <strong>\u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646<\/strong>\u060c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631\u0633\u062a \u0627\u0632 HTTPS\u060c \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u06af\u0648\u0627\u0647\u06cc\u060c \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0642\u0648\u06cc \u0648 \u06a9\u0646\u062a\u0631\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0645\u0647\u0645\u200c\u062a\u0631 \u0648 \u06a9\u0645\u200c\u062e\u0637\u0631\u062a\u0631 \u0627\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0634\u062a\u0627\u0628\u200c\u0632\u062f\u0647 Certificate Pinning \u0627\u0633\u062a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ProGuard \u0648 Obfuscation \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u0646\u060c \u0627\u0645\u0627 \u0627\u0645\u0646\u06cc\u062a \u0633\u0631\u0648\u0631 \u0646\u06cc\u0633\u062a\u0646<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0646\u0633\u062e\u0647 Release \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0628\u0627 R8 \u0646\u0627\u0645 \u06a9\u0644\u0627\u0633\u200c\u0647\u0627 \u0648 \u0645\u062a\u062f\u0647\u0627 \u0631\u0648 \u06a9\u0648\u062a\u0627\u0647 \u0648 \u0645\u0628\u0647\u0645 \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0645\u0647\u0646\u062f\u0633\u06cc \u0645\u0639\u06a9\u0648\u0633 \u0633\u062e\u062a\u200c\u062a\u0631 \u0628\u0634\u0647. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0627\u0631\u0632\u0634\u0645\u0646\u062f\u0647\u060c \u0627\u0645\u0627 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647\u0634 \u0645\u062b\u0644 \u06af\u0627\u0648\u0635\u0646\u062f\u0648\u0642 \u0646\u06af\u0627\u0647 \u06a9\u0646\u06cc\u0645. \u0645\u0647\u0627\u062c\u0645 \u0647\u0645\u0686\u0646\u0627\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0631\u0641\u062a\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u0631\u0634\u062a\u0647\u200c\u0647\u0627\u060c \u0622\u062f\u0631\u0633\u200c\u0647\u0627\u06cc \u0634\u0628\u06a9\u0647 \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u062e\u0631\u0648\u062c\u06cc \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647. Obfuscation \u0641\u0642\u0637 \u0647\u0632\u06cc\u0646\u0647 \u062a\u062d\u0644\u06cc\u0644 \u0631\u0648 \u0628\u0627\u0644\u0627 \u0645\u06cc\u200c\u0628\u0631\u0647\u061b \u0631\u0627\u0632 \u0648\u0627\u0642\u0639\u06cc \u0648 \u062f\u0627\u0626\u0645\u06cc \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>android {\n    buildTypes {\n        release {\n            isMinifyEnabled = true\n            isShrinkResources = true\n\n            proguardFiles(\n                getDefaultProguardFile(\n                    \"proguard-android-optimize.txt\"\n                ),\n                \"proguard-rules.pro\"\n            )\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">android<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">buildTypes<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">release<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            isMinifyEnabled <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            isShrinkResources <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">proguardFiles<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">getDefaultProguardFile<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #032F62\">&quot;proguard-android-optimize.txt&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;proguard-rules.pro&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u067e\u0633 \u062d\u062a\u06cc \u062f\u0631 \u0646\u0633\u062e\u0647 Obfuscate\u0634\u062f\u0647 \u0647\u0645 \u0646\u0628\u0627\u06cc\u062f Secret Key\u060c \u0631\u0645\u0632 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633\u060c \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0633\u0631\u0648\u0631 \u06cc\u0627 \u062a\u0648\u06a9\u0646 \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645. \u0647\u0631 \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0642\u062f\u0631\u062a \u062f\u0627\u0626\u0645\u06cc \u0648 \u06af\u0633\u062a\u0631\u062f\u0647\u200c\u0627\u06cc \u062f\u0627\u0631\u0647\u060c \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0628\u0627\u0642\u06cc \u0628\u0645\u0648\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0646\u06cc\u062a API \u0627\u0632 \u06cc\u06a9 \u062a\u0631\u0641\u0646\u062f \u06cc\u0627 \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u062e\u0627\u0635 \u0628\u0647 \u062f\u0633\u062a \u0646\u0645\u06cc\u0627\u062f. \u062f\u0631 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0627\u06cc\u062f \u062a\u0645\u0627\u0645 \u0627\u0631\u062a\u0628\u0627\u0637\u200c\u0647\u0627 \u0628\u0627 HTTPS \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0646 \u0648 Cleartext Traffic \u063a\u06cc\u0631\u0641\u0639\u0627\u0644 \u0628\u0627\u0634\u0647. \u06a9\u0627\u0631\u0628\u0631 \u0628\u0639\u062f \u0627\u0632 \u0648\u0631\u0648\u062f \u0628\u0627\u06cc\u062f Access Token \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0628\u06af\u06cc\u0631\u0647\u060c \u062a\u0648\u06a9\u0646\u200c\u0647\u0627 \u0646\u0628\u0627\u06cc\u062f \u062f\u0627\u062e\u0644 Log \u06cc\u0627 \u0633\u0648\u0631\u0633\u200c\u06a9\u062f \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0646 \u0648 \u0628\u0631\u0627\u06cc \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0647\u062a\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0645\u06cc\u0634\u0647 \u0627\u0632 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 Android Keystore \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f. OkHttp Interceptor \u0647\u062f\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0648 \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 Authenticator \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0646\u0642\u0636\u0627\u06cc Access Token \u0631\u0648 \u0628\u0627 Refresh Token \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u0628\u062e\u0634 \u0645\u0647\u0645\u200c\u062a\u0631 \u0627\u0645\u0646\u06cc\u062a \u0631\u0648\u06cc \u0633\u0631\u0648\u0631\u0647. \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u062a\u06a9\u200c\u062a\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0648 \u0645\u062c\u0648\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0648\u0646 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647\u060c \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0627\u0632 \u062a\u0648\u06a9\u0646 \u0628\u06af\u06cc\u0631\u0647\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0636\u0627\u0641\u06cc \u0628\u0631\u0646\u06af\u0631\u062f\u0648\u0646\u0647\u060c \u0641\u06cc\u0644\u062f\u0647\u0627\u06cc \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0631\u0648 \u0642\u0628\u0648\u0644 \u0646\u06a9\u0646\u0647 \u0648 \u0631\u0648\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u062d\u0633\u0627\u0633 Rate Limit \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0647\u06cc\u0686 API Key \u062b\u0627\u0628\u062a\u060c \u0622\u062f\u0631\u0633 \u0645\u062e\u0641\u06cc\u060c Obfuscation \u06cc\u0627 \u0628\u0631\u0631\u0633\u06cc \u062f\u0627\u062e\u0644 \u0627\u067e \u0646\u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062c\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0646\u062a\u0631\u0644\u200c\u0647\u0627 \u0631\u0648 \u0628\u06af\u06cc\u0631\u0647. \u0627\u0635\u0644 \u0645\u0647\u0645 \u0627\u06cc\u0646\u0647: <strong>\u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0631\u0648 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0642\u0627\u0628\u0644\u200c\u0627\u0639\u062a\u0645\u0627\u062f \u0641\u0631\u0636 \u0646\u06a9\u0646\u061b \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u067e\u0646\u062c\u0627\u0647\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">SSL Pinning<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b SSL Pinning \u0686\u06cc\u0647\u061f<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"819\" height=\"1024\" src=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-16-819x1024.avif\" alt=\"\" class=\"wp-image-6148\" srcset=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-16-819x1024.avif 819w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-16-240x300.avif 240w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-16-768x960.avif 768w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-16.avif 1122w\" sizes=\"(max-width: 819px) 100vw, 819px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u062f\u0631\u0633 \u0642\u0628\u0644\u06cc \u06af\u0641\u062a\u06cc\u0645 \u06a9\u0647 \u062a\u0645\u0627\u0645 \u0627\u0631\u062a\u0628\u0627\u0637\u200c\u0647\u0627\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0627\u06cc\u062f \u0628\u0627 HTTPS \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0646. HTTPS \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0628\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0628\u0634\u0646 \u0648 \u0633\u06cc\u0633\u062a\u0645\u200c\u0639\u0627\u0645\u0644 \u0647\u0645 \u06af\u0648\u0627\u0647\u06cc \u0633\u0631\u0648\u0631 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647. \u0627\u06af\u0647 \u06af\u0648\u0627\u0647\u06cc \u0645\u0639\u062a\u0628\u0631 \u0628\u0627\u0634\u0647 \u0648 \u0646\u0627\u0645 \u062f\u0627\u0645\u0646\u0647 \u0628\u0627 \u0627\u0648\u0646 \u062a\u0637\u0627\u0628\u0642 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0627\u062a\u0635\u0627\u0644 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u0634\u0647. \u0627\u06cc\u0646 \u0633\u0627\u0632\u0648\u06a9\u0627\u0631 \u062f\u0631 \u062d\u0627\u0644\u062a \u0639\u0627\u062f\u06cc \u0628\u0631\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u0627\u0645\u0646\u06cc\u062a \u0645\u0646\u0627\u0633\u0628\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u06cc\u06a9 \u0646\u06a9\u062a\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647: \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0641\u0642\u0637 \u0628\u0647 \u06af\u0648\u0627\u0647\u06cc \u062e\u0648\u062f \u0633\u0631\u0648\u0631 \u0627\u0639\u062a\u0645\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0628\u0644\u06a9\u0647 \u0628\u0647 \u0645\u062c\u0645\u0648\u0639\u0647 \u0628\u0632\u0631\u06af\u06cc \u0627\u0632 Certificate Authority\u0647\u0627\u06cc \u0645\u0639\u062a\u0628\u0631 \u0633\u06cc\u0633\u062a\u0645 \u0627\u0639\u062a\u0645\u0627\u062f \u062f\u0627\u0631\u0647. \u06cc\u0639\u0646\u06cc \u0627\u06af\u0647 \u06cc\u06a9\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u0645\u0631\u0627\u06a9\u0632 \u0635\u062f\u0648\u0631 \u06af\u0648\u0627\u0647\u06cc \u0627\u0634\u062a\u0628\u0627\u0647\u06cc \u0628\u0631\u0627\u06cc \u062f\u0627\u0645\u0646\u0647 \u0645\u0627 \u06af\u0648\u0627\u0647\u06cc \u0635\u0627\u062f\u0631 \u06a9\u0646\u0647 \u06cc\u0627 \u0628\u0647 \u062e\u0637\u0631 \u0628\u06cc\u0641\u062a\u0647\u060c \u0627\u0632 \u0646\u0638\u0631 \u062a\u0626\u0648\u0631\u06cc \u0645\u0645\u06a9\u0646\u0647 \u06cc\u06a9 \u0645\u0647\u0627\u062c\u0645 \u0628\u062a\u0648\u0646\u0647 \u062e\u0648\u062f\u0634 \u0631\u0648 \u062c\u0627\u06cc \u0633\u0631\u0648\u0631 \u0627\u0635\u0644\u06cc \u062c\u0627 \u0628\u0632\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>SSL Pinning<\/strong> \u06cc\u0627 \u062f\u0642\u06cc\u0642\u200c\u062a\u0631 <strong>Certificate Pinning<\/strong> \u06cc\u06a9 \u0644\u0627\u06cc\u0647 \u0645\u062d\u062f\u0648\u062f\u06a9\u0646\u0646\u062f\u0647 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0628\u0631\u0631\u0633\u06cc \u0639\u0627\u062f\u06cc TLS \u0645\u06cc\u06af\u0647: \u00ab\u0645\u0646 \u0641\u0642\u0637 \u0648\u0642\u062a\u06cc \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0627\u0645\u0646\u0647 \u0648\u0635\u0644 \u0645\u06cc\u0634\u0645 \u06a9\u0647 \u0632\u0646\u062c\u06cc\u0631\u0647 \u06af\u0648\u0627\u0647\u06cc \u0634\u0627\u0645\u0644 \u06cc\u06a9\u06cc \u0627\u0632 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u0645\u0634\u062e\u0635\u200c\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u062e\u0648\u062f\u0645 \u0628\u0627\u0634\u0647.\u00bb \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u062d\u062a\u06cc \u0627\u06af\u0647 \u0645\u0647\u0627\u062c\u0645 \u06cc\u06a9 \u06af\u0648\u0627\u0647\u06cc \u0638\u0627\u0647\u0631\u0627\u064b \u0645\u0639\u062a\u0628\u0631 \u0627\u0632 \u06cc\u06a9 CA \u0645\u0648\u0631\u062f\u0627\u0639\u062a\u0645\u0627\u062f \u0633\u06cc\u0633\u062a\u0645 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0627\u062a\u0635\u0627\u0644 \u0631\u062f \u0645\u06cc\u0634\u0647 \u0686\u0648\u0646 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0627\u0648\u0646 \u0628\u0627 Pin\u0647\u0627\u06cc \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0637\u0627\u0628\u0642 \u0646\u062f\u0627\u0631\u0647. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u0628\u0627\u06cc\u062f \u0627\u0632 \u0647\u0645\u06cc\u0646 \u0627\u0628\u062a\u062f\u0627 \u0628\u062f\u0648\u0646\u06cc\u0645 \u06a9\u0647 Android \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0639\u0645\u0648\u0645\u06cc \u0627\u0632 Certificate Pinning \u0631\u0648 \u062a\u0648\u0635\u06cc\u0647 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0686\u0648\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u06af\u0648\u0627\u0647\u06cc\u060c \u062a\u063a\u06cc\u06cc\u0631 CA \u06cc\u0627 \u0627\u0634\u062a\u0628\u0627\u0647 \u062f\u0631 \u0645\u062f\u06cc\u0631\u06cc\u062a Pin\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062a\u0645\u0627\u0645 \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0627\u0632 \u0633\u0631\u0648\u0631 \u0642\u0637\u0639 \u06a9\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HTTPS \u0628\u062f\u0648\u0646 Pinning \u0686\u0637\u0648\u0631 \u0627\u0639\u062a\u0645\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0641\u0647\u0645 Pinning \u0628\u0627\u06cc\u062f \u0627\u0648\u0644 \u0628\u062f\u0648\u0646\u06cc\u0645 \u0627\u062a\u0635\u0627\u0644 \u0639\u0627\u062f\u06cc HTTPS \u0686\u0637\u0648\u0631 \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0648\u0642\u062a\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0647 \u0622\u062f\u0631\u0633 <code>https:\/\/api.gheimatban.com<\/code> \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647\u060c \u0633\u0631\u0648\u0631 \u06af\u0648\u0627\u0647\u06cc \u062e\u0648\u062f\u0634 \u0648 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0686\u0646\u062f \u06af\u0648\u0627\u0647\u06cc \u0648\u0627\u0633\u0637\u0647 \u0631\u0648 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u062f\u0647. \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0632\u0646\u062c\u06cc\u0631\u0647 \u06af\u0648\u0627\u0647\u06cc \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0645\u06cc\u200c\u0628\u06cc\u0646\u0647 \u0622\u06cc\u0627 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0628\u0647 \u06cc\u06a9\u06cc \u0627\u0632 Root CA\u0647\u0627\u06cc \u0645\u0648\u0631\u062f\u0627\u0639\u062a\u0645\u0627\u062f \u0633\u06cc\u0633\u062a\u0645 \u0645\u06cc\u200c\u0631\u0633\u0647 \u06cc\u0627 \u0646\u0647. \u0628\u0639\u062f \u062a\u0627\u0631\u06cc\u062e \u0627\u0639\u062a\u0628\u0627\u0631 \u06af\u0648\u0627\u0647\u06cc\u060c \u0646\u0627\u0645 \u062f\u0627\u0645\u0646\u0647 \u0648 \u0627\u0645\u0636\u0627\u06cc \u062f\u06cc\u062c\u06cc\u062a\u0627\u0644 \u0647\u0645 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u0634\u0646. \u0627\u06af\u0647 \u0647\u0645\u0647\u200c\u0686\u06cc\u0632 \u062f\u0631\u0633\u062a \u0628\u0627\u0634\u0647\u060c \u06cc\u06a9 \u06a9\u0627\u0646\u0627\u0644 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0634\u06a9\u0644 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0631\u0648\u0634 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc\u0647 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u0641\u0642\u0637 \u0628\u0647 \u06cc\u06a9 \u06af\u0648\u0627\u0647\u06cc \u062e\u0627\u0635 \u0627\u0639\u062a\u0645\u0627\u062f \u0646\u062f\u0627\u0631\u0647\u061b \u062f\u0631 \u0648\u0627\u0642\u0639 \u0628\u0647 \u062a\u0645\u0627\u0645 CA\u0647\u0627\u06cc\u06cc \u0627\u0639\u062a\u0645\u0627\u062f \u062f\u0627\u0631\u0647 \u06a9\u0647 \u0633\u06cc\u0633\u062a\u0645\u200c\u0639\u0627\u0645\u0644 \u0645\u0639\u062a\u0628\u0631 \u0645\u06cc\u200c\u062f\u0648\u0646\u0647. \u0627\u06cc\u0646 \u0645\u062f\u0644 \u0628\u0631\u0627\u06cc \u0648\u0628 \u0648 \u0628\u06cc\u0634\u062a\u0631 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u200c\u0647\u0627 \u0636\u0631\u0648\u0631\u06cc\u0647\u060c \u0686\u0648\u0646 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627 \u0645\u0631\u062a\u0628 \u062a\u0645\u062f\u06cc\u062f \u0645\u06cc\u0634\u0646 \u0648 \u0645\u0645\u06a9\u0646\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0633\u0631\u0648\u0631 \u06cc\u0627 \u0634\u0631\u06a9\u062a \u0635\u0627\u062f\u0631\u06a9\u0646\u0646\u062f\u0647 \u06af\u0648\u0627\u0647\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u0647. Pinning \u0627\u06cc\u0646 \u062f\u0627\u06cc\u0631\u0647 \u0627\u0639\u062a\u0645\u0627\u062f \u0631\u0648 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0645\u06cc\u06af\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u0639\u0645\u0648\u0645\u06cc \u06af\u0648\u0627\u0647\u06cc \u06a9\u0627\u0641\u06cc \u0646\u06cc\u0633\u062a\u061b \u06cc\u06a9\u06cc \u0627\u0632 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0627\u0632 \u0642\u0628\u0644 \u062a\u0639\u06cc\u06cc\u0646\u200c\u0634\u062f\u0647 \u0647\u0645 \u0628\u0627\u06cc\u062f \u062f\u0631 \u0632\u0646\u062c\u06cc\u0631\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0648\u0646\u062f \u0639\u0627\u062f\u06cc \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u06cc\u0646 \u0634\u06a9\u0644\u06cc\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0646\u0627\u0645\u0647 \u2190 \u06af\u0648\u0627\u0647\u06cc \u0633\u0631\u0648\u0631 \u2190 \u06af\u0648\u0627\u0647\u06cc \u0648\u0627\u0633\u0637\u0647 \u2190 Root CA \u0645\u0648\u0631\u062f\u0627\u0639\u062a\u0645\u0627\u062f \u0627\u0646\u062f\u0631\u0648\u06cc\u062f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 Pinning \u06cc\u06a9 \u0634\u0631\u0637 \u062f\u06cc\u06af\u0631 \u0647\u0645 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u0634\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0632\u0646\u062c\u06cc\u0631\u0647 \u0645\u0639\u062a\u0628\u0631 TLS + \u062a\u0637\u0627\u0628\u0642 \u0628\u0627 \u06cc\u06a9\u06cc \u0627\u0632 Pin\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0686\u0631\u0627 \u0628\u0647\u0634 SSL Pinning \u0645\u06cc\u06af\u0646\u060c \u0628\u0627 \u0627\u06cc\u0646\u06a9\u0647 TLS \u062f\u0627\u0631\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0635\u0637\u0644\u0627\u062d SSL Pinning \u0647\u0646\u0648\u0632 \u062e\u06cc\u0644\u06cc \u0631\u0627\u06cc\u062c\u0647\u060c \u0627\u0645\u0627 \u0627\u0632 \u0646\u0638\u0631 \u0641\u0646\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0627\u062a\u0635\u0627\u0644\u200c\u0647\u0627\u06cc \u0627\u0645\u0631\u0648\u0632\u06cc \u0627\u0632 TLS \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646\u060c \u0646\u0647 \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0642\u062f\u06cc\u0645\u06cc SSL. \u0627\u0633\u0645 \u062f\u0642\u06cc\u0642\u200c\u062a\u0631 \u0627\u06cc\u0646 \u0645\u0641\u0647\u0648\u0645 <code>Certificate Pinning<\/code> \u06cc\u0627 <code>Public Key Pinning<\/code> \u0627\u0633\u062a. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u062f\u0631 \u0622\u0645\u0648\u0632\u0634\u200c\u0647\u0627\u060c \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0642\u062f\u06cc\u0645\u06cc \u0648 \u06af\u0641\u062a\u200c\u0648\u06af\u0648\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633\u06cc \u0647\u0645\u0686\u0646\u0627\u0646 \u0639\u0628\u0627\u0631\u062a SSL Pinning \u0632\u06cc\u0627\u062f \u062f\u06cc\u062f\u0647 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u06a9\u062a\u0647 \u0645\u0647\u0645\u200c\u062a\u0631 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0627\u0645\u0644 \u06af\u0648\u0627\u0647\u06cc \u0631\u0648 Pin \u0646\u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0628\u0644\u06a9\u0647 \u0647\u0634 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u06af\u0648\u0627\u0647\u06cc \u0631\u0648 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u062f\u0631 Network Security Configuration \u0627\u0632 \u0647\u0634 <code>SubjectPublicKeyInfo<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 OkHttp \u0647\u0645 Pin\u0647\u0627 \u0631\u0648 \u0628\u0647 \u0634\u06a9\u0644 \u0647\u0634 SHA-256 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0645\u06cc\u200c\u067e\u0630\u06cc\u0631\u0647. \u0645\u0632\u06cc\u062a Pin \u06a9\u0631\u062f\u0646 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0627\u06af\u0647 \u06af\u0648\u0627\u0647\u06cc \u0628\u0627 \u0647\u0645\u0648\u0646 \u06a9\u0644\u06cc\u062f \u062a\u0645\u062f\u06cc\u062f \u0628\u0634\u0647\u060c Pin \u0647\u0645\u0686\u0646\u0627\u0646 \u0645\u0639\u062a\u0628\u0631 \u0645\u06cc\u200c\u0645\u0648\u0646\u0647. \u0627\u0645\u0627 \u0627\u06af\u0647 \u06a9\u0644\u06cc\u062f \u062c\u062f\u06cc\u062f\u06cc \u062a\u0648\u0644\u06cc\u062f \u0628\u0634\u0647\u060c \u0628\u0627\u06cc\u062f Pin \u062c\u062f\u06cc\u062f \u0647\u0645 \u0627\u0632 \u0642\u0628\u0644 \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pinning \u062c\u0644\u0648\u06cc \u0686\u0647 \u062d\u0645\u0644\u0647\u200c\u0627\u06cc \u0631\u0648 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u0646\u0627\u0631\u06cc\u0648\u06cc \u0627\u0635\u0644\u06cc\u060c \u062d\u0645\u0644\u0647 Man-in-the-Middle \u0627\u0633\u062a. \u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u06cc\u06a9 \u0634\u0628\u06a9\u0647 Wi-Fi \u0622\u0644\u0648\u062f\u0647 \u0645\u062a\u0635\u0644 \u0634\u062f\u0647 \u0648 \u0645\u0647\u0627\u062c\u0645 \u062a\u0644\u0627\u0634 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0628\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0647. \u062f\u0631 \u0627\u062a\u0635\u0627\u0644 HTTPS \u0639\u0627\u062f\u06cc\u060c \u0645\u0647\u0627\u062c\u0645 \u0628\u0631\u0627\u06cc \u0645\u0648\u0641\u0642\u06cc\u062a \u0628\u0627\u06cc\u062f \u06af\u0648\u0627\u0647\u06cc \u0645\u0639\u062a\u0628\u0631\u06cc \u0628\u0631\u0627\u06cc \u062f\u0627\u0645\u0646\u0647 \u0645\u0627 \u0627\u0631\u0627\u0626\u0647 \u0628\u062f\u0647. \u062f\u0631 \u0628\u06cc\u0634\u062a\u0631 \u0634\u0631\u0627\u06cc\u0637 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0633\u062e\u062a \u0648 \u063a\u06cc\u0631\u0639\u0645\u0644\u06cc\u0647\u060c \u0686\u0648\u0646 \u06af\u0648\u0627\u0647\u06cc \u062c\u0639\u0644\u06cc \u062a\u0648\u0633\u0637 \u0633\u06cc\u0633\u062a\u0645 \u0631\u062f \u0645\u06cc\u0634\u0647. \u0627\u0645\u0627 \u0627\u06af\u0647 \u0645\u0647\u0627\u062c\u0645 \u0628\u0647 \u06cc\u06a9 CA \u0645\u0648\u0631\u062f\u0627\u0639\u062a\u0645\u0627\u062f \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u06cc\u06a9 CA \u0627\u0634\u062a\u0628\u0627\u0647\u06cc \u06af\u0648\u0627\u0647\u06cc \u0635\u0627\u062f\u0631 \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u0647 \u06cc\u0627 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u06a9\u0627\u0631\u0628\u0631 \u06cc\u06a9 CA \u062c\u062f\u06cc\u062f \u0646\u0635\u0628 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u0634\u0631\u0627\u06cc\u0637 \u0645\u0645\u06a9\u0646\u0647 \u0645\u062a\u0641\u0627\u0648\u062a \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pinning \u0645\u06cc\u06af\u0647 \u062d\u062a\u06cc \u0627\u06af\u0647 \u06af\u0648\u0627\u0647\u06cc \u0627\u0632 \u0646\u0638\u0631 \u0633\u06cc\u0633\u062a\u0645 \u0645\u0639\u062a\u0628\u0631\u0647\u060c \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0627\u0648\u0646 \u0628\u0627\u06cc\u062f \u0628\u0627 \u06a9\u0644\u06cc\u062f\u06cc \u06a9\u0647 \u0645\u0627 \u0627\u0632 \u0642\u0628\u0644 \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u062b\u0628\u062a \u06a9\u0631\u062f\u06cc\u0645 \u062a\u0637\u0627\u0628\u0642 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 Proxy\u0647\u0627\u06cc \u062a\u062d\u0644\u06cc\u0644 \u0634\u0628\u06a9\u0647\u060c CA\u0647\u0627\u06cc \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631 \u0648 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627\u06cc \u0635\u0627\u062f\u0631\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 CA\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0631\u062f \u0645\u06cc\u0634\u0646. \u0627\u06cc\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a \u0628\u0631\u0627\u06cc \u0628\u0639\u0636\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631 \u062d\u0633\u0627\u0633 \u0645\u062b\u0644 \u0628\u0627\u0646\u06a9\u062f\u0627\u0631\u06cc\u060c \u0633\u0627\u0645\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0633\u0627\u0632\u0645\u0627\u0646\u06cc \u062e\u0627\u0635 \u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc\u06cc \u0628\u0627 \u0645\u062f\u0644 \u062a\u0647\u062f\u06cc\u062f \u0633\u062e\u062a\u200c\u06af\u06cc\u0631\u0627\u0646\u0647 \u0645\u0645\u06a9\u0646\u0647 \u0627\u0631\u0632\u0634 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 Pinning \u062c\u0644\u0648\u06cc \u0647\u0645\u0647 \u062d\u0645\u0644\u0627\u062a \u0631\u0648 \u0646\u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. \u0627\u06af\u0647 \u062e\u0648\u062f \u06af\u0648\u0634\u06cc Root \u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c \u0645\u0647\u0627\u062c\u0645 \u0628\u062a\u0648\u0646\u0647 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647\u060c Pinning \u0631\u0648 Hook \u06a9\u0646\u0647 \u06cc\u0627 \u0646\u0633\u062e\u0647 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u0647\u060c \u0627\u0645\u06a9\u0627\u0646 \u062f\u0648\u0631 \u0632\u062f\u0646 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 Pinning \u06cc\u06a9 \u0644\u0627\u06cc\u0647 \u062f\u0641\u0627\u0639\u06cc \u0627\u0636\u0627\u0641\u0647 \u0627\u0633\u062a\u060c \u0646\u0647 \u062a\u0636\u0645\u06cc\u0646 \u0627\u0645\u0646\u06cc\u062a \u0645\u0637\u0644\u0642.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0628\u0632\u0631\u06af\u200c\u062a\u0631\u06cc\u0646 \u062e\u0637\u0631 SSL Pinning \u0686\u06cc\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0632\u0631\u06af\u200c\u062a\u0631\u06cc\u0646 \u062e\u0637\u0631 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u062e\u0648\u062f\u0645\u0648\u0646 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0648 \u0627\u0632 \u0633\u0631\u0648\u0631 \u0642\u0637\u0639 \u06a9\u0646\u06cc\u0645. \u0641\u0631\u0636 \u06a9\u0646 \u0646\u0633\u062e\u0647 \u0641\u0639\u0644\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0641\u0642\u0637 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0641\u0639\u0644\u06cc \u0633\u0631\u0648\u0631 \u0631\u0648 Pin \u06a9\u0631\u062f\u0647. \u0634\u0634 \u0645\u0627\u0647 \u0628\u0639\u062f \u06af\u0648\u0627\u0647\u06cc \u0645\u0646\u0642\u0636\u06cc \u0645\u06cc\u0634\u0647 \u0648 \u0645\u062f\u06cc\u0631 \u0633\u0631\u0648\u0631 \u0647\u0646\u06af\u0627\u0645 \u062a\u0645\u062f\u06cc\u062f\u060c \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u062c\u062f\u06cc\u062f \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647. \u06af\u0648\u0627\u0647\u06cc \u062c\u062f\u06cc\u062f \u06a9\u0627\u0645\u0644\u0627\u064b \u0645\u0639\u062a\u0628\u0631\u0647 \u0648 \u0645\u0631\u0648\u0631\u06af\u0631\u0647\u0627 \u0628\u062f\u0648\u0646 \u0645\u0634\u06a9\u0644 \u0627\u0648\u0646 \u0631\u0648 \u0642\u0628\u0648\u0644 \u0645\u06cc\u200c\u06a9\u0646\u0646\u060c \u0627\u0645\u0627 \u0646\u0633\u062e\u0647 \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0642\u0637 Pin \u0642\u062f\u06cc\u0645\u06cc \u0631\u0648 \u0645\u06cc\u200c\u0634\u0646\u0627\u0633\u0647. \u0646\u062a\u06cc\u062c\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u062a\u0645\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc API \u0628\u0627 \u062e\u0637\u0627\u06cc SSL \u0634\u06a9\u0633\u062a \u0645\u06cc\u200c\u062e\u0648\u0631\u0646 \u0648 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0646\u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0648\u0627\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u0634\u06a9\u0644 \u0628\u062f\u062a\u0631 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0631\u0641\u0639 \u0627\u06cc\u0646 \u0648\u0636\u0639\u06cc\u062a \u0628\u0627\u06cc\u062f \u0646\u0633\u062e\u0647 \u062c\u062f\u06cc\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0645\u0646\u062a\u0634\u0631 \u06a9\u0646\u06cc\u0645\u060c \u0627\u0645\u0627 \u0645\u0645\u06a9\u0646\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0646\u062a\u0648\u0646\u0646 \u0628\u0647\u200c\u0633\u0631\u0639\u062a \u0627\u0648\u0646 \u0631\u0648 \u0646\u0635\u0628 \u06a9\u0646\u0646. \u0628\u0639\u0636\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0622\u067e\u062f\u06cc\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u0631\u0648 \u062e\u0627\u0645\u0648\u0634 \u06a9\u0631\u062f\u0646\u060c \u0628\u0639\u0636\u06cc\u200c\u0647\u0627 \u0628\u0647 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u0646\u062f\u0627\u0631\u0646 \u0648 \u0628\u0639\u0636\u06cc \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0642\u062f\u06cc\u0645\u06cc \u0645\u0645\u06a9\u0646\u0647 \u0645\u0627\u0647\u200c\u0647\u0627 \u0641\u0639\u0627\u0644 \u0628\u0645\u0648\u0646\u0646. \u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u062a\u0623\u06a9\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0627\u06af\u0647 Pinning \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647\u060c \u0628\u0627\u06cc\u062f \u062d\u062a\u0645\u0627\u064b Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0648 \u0632\u0645\u0627\u0646 \u0627\u0646\u0642\u0636\u0627\u06cc \u0645\u0646\u0627\u0633\u0628 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0647\u0645\u06cc\u0634\u0647 \u0628\u0627\u06cc\u062f \u062d\u062f\u0627\u0642\u0644 \u06cc\u06a9 Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u06cc\u0686\u200c\u0648\u0642\u062a \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u0631\u0648 Pin \u06a9\u0646\u06cc\u0645. \u062d\u062f\u0627\u0642\u0644 \u0628\u0627\u06cc\u062f \u062f\u0648 Pin \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647: Pin \u0627\u0635\u0644\u06cc \u06a9\u0647 \u0633\u0631\u0648\u0631 \u0627\u0644\u0622\u0646 \u0627\u0632 \u0627\u0648\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u06cc\u06a9 Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u06a9\u0647 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0627\u0648\u0646 \u0627\u0632 \u0642\u0628\u0644 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u062e\u0648\u062f\u0645\u0648\u0646 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u0647. \u0627\u06af\u0647 \u0645\u062c\u0628\u0648\u0631 \u0634\u062f\u06cc\u0645 \u06af\u0648\u0627\u0647\u06cc \u06cc\u0627 \u06a9\u0644\u06cc\u062f \u0633\u0631\u0648\u0631 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u06cc\u0645\u060c \u06af\u0648\u0627\u0647\u06cc \u062c\u062f\u06cc\u062f \u0631\u0648 \u0628\u0627 \u06a9\u0644\u06cc\u062f \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0635\u0627\u062f\u0631 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0686\u0648\u0646 Pin \u0627\u0648\u0646 \u0627\u0632 \u0642\u0628\u0644 \u062f\u0627\u062e\u0644 \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647\u060c \u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0646\u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0646\u0633\u062e\u0647 \u062c\u062f\u06cc\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0645\u0646\u062a\u0634\u0631 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u062f\u0627\u062e\u0644 \u0627\u0648\u0646 \u06cc\u06a9 Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u062a\u0627\u0632\u0647 \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u06cc\u0645. \u0627\u06cc\u0646 \u0641\u0631\u0627\u06cc\u0646\u062f \u0628\u0627\u06cc\u062f \u0634\u0628\u06cc\u0647 \u0686\u0631\u062e\u0634 \u06a9\u0644\u06cc\u062f\u0647\u0627 \u0628\u0627\u0634\u0647\u060c \u0646\u0647 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0639\u062f \u0627\u0632 \u062e\u0631\u0627\u0628\u06cc \u062a\u0627\u0632\u0647 \u062f\u0646\u0628\u0627\u0644 \u0631\u0627\u0647\u200c\u062d\u0644 \u0628\u06af\u0631\u062f\u06cc\u0645. Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0641\u0642\u0637 \u06cc\u06a9 \u0647\u0634 \u062a\u0635\u0627\u062f\u0641\u06cc \u0646\u06cc\u0633\u062a\u061b \u0628\u0627\u06cc\u062f \u0648\u0627\u0642\u0639\u0627\u064b \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u0648\u0646 \u0631\u0648 \u062f\u0631 \u062c\u0627\u06cc \u0627\u0645\u0646 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0628\u062d\u0631\u0627\u0646 \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0631\u0633\u062a \u0627\u06cc\u0646 \u0634\u06a9\u0644\u06cc\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pin \u0641\u0639\u0627\u0644 \u0641\u0639\u0644\u06cc<br>Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0642\u0627\u0628\u0644\u200c\u06a9\u0646\u062a\u0631\u0644<br>\u0632\u0645\u0627\u0646 \u0627\u0646\u0642\u0636\u0627\u06cc Pinning<br>\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0634\u062e\u0635 \u0628\u0631\u0627\u06cc \u0686\u0631\u062e\u0634 \u06a9\u0644\u06cc\u062f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u062f\u0648\u0646 \u0627\u06cc\u0646 \u0645\u0648\u0627\u0631\u062f\u060c \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 Pinning \u0628\u06cc\u0634\u062a\u0631 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0627\u0645\u0646\u06cc\u062a \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0647\u060c \u0631\u06cc\u0633\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0631\u0648\u0634 \u0627\u0648\u0644: Pinning \u0628\u0627 Network Security Configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0627\u0632 \u0646\u0633\u062e\u0647 \u06f7\u060c \u06cc\u0639\u0646\u06cc API 24\u060c \u0642\u0627\u0628\u0644\u06cc\u062a\u06cc \u0628\u0647 \u0646\u0627\u0645 <strong>Network Security Configuration<\/strong> \u062f\u0627\u0631\u0647. \u0628\u0627 \u0627\u06cc\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0627\u0645\u0646\u06cc\u062a \u0634\u0628\u06a9\u0647 \u0631\u0648 \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644 XML \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645 \u0648 \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a <code>TrustManager<\/code> \u06cc\u0627 <code>HostnameVerifier<\/code> \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645. \u0627\u06cc\u0646 \u0631\u0648\u0634 declarative \u0627\u0633\u062a\u060c \u0641\u0642\u0637 \u0631\u0648\u06cc \u062f\u0627\u0645\u0646\u0647\u200c\u0647\u0627\u06cc \u0645\u0634\u062e\u0635 \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc\u0634\u0647 \u0648 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u062e\u0648\u062f\u0634 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0632\u0646\u062c\u06cc\u0631\u0647 \u06af\u0648\u0627\u0647\u06cc \u0631\u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0631\u0648 \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627\u06cc \u062f\u0633\u062a\u06cc \u0648 \u062e\u0637\u0627\u067e\u0630\u06cc\u0631 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc\u062f\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0627\u062e\u0644 \u0645\u0633\u06cc\u0631 \u0632\u06cc\u0631 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>res\/xml\/network_security_config.xml<\/code><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\n&lt;network-security-config>\n\n    &lt;domain-config cleartextTrafficPermitted=\"false\">\n\n        &lt;domain includeSubdomains=\"true\">\n            api.gheimatban.com\n        &lt;\/domain>\n\n        &lt;pin-set expiration=\"2028-12-31\">\n\n            &lt;pin digest=\"SHA-256\">\n                BASE64_PRIMARY_PUBLIC_KEY_HASH\n            &lt;\/pin>\n\n            &lt;pin digest=\"SHA-256\">\n                BASE64_BACKUP_PUBLIC_KEY_HASH\n            &lt;\/pin>\n\n        &lt;\/pin-set>\n\n    &lt;\/domain-config>\n\n&lt;\/network-security-config>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">?xml version<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;1.0&quot;<\/span><span style=\"color: #24292E\"> encoding<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;utf-8&quot;<\/span><span style=\"color: #24292E\">?<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">network<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">security<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">domain<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config cleartextTrafficPermitted<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;false&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">domain includeSubdomains<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;true&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            api.gheimatban.com<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">domain<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">pin<\/span><span style=\"color: #D73A49\">-set<\/span><span style=\"color: #24292E\"> expiration<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;2028-12-31&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">pin digest<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;SHA-256&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                BASE64_PRIMARY_PUBLIC_KEY_HASH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">pin<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">pin digest<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;SHA-256&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                BASE64_BACKUP_PUBLIC_KEY_HASH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">pin<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">pin<\/span><span style=\"color: #D73A49\">-set&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">domain<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">network<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">security<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0627\u062e\u0644 <code>domain<\/code> \u062f\u0627\u0645\u0646\u0647 API \u0631\u0648 \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u06cc\u0645. \u0648\u06cc\u0698\u06af\u06cc <code>includeSubdomains=\"true\"<\/code> \u06cc\u0639\u0646\u06cc \u0627\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645 \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u062f\u0627\u0645\u0646\u0647 \u0627\u0635\u0644\u06cc\u060c \u0631\u0648\u06cc \u0632\u06cc\u0631\u062f\u0627\u0645\u0646\u0647\u200c\u0647\u0627\u06cc \u0627\u0648\u0646 \u0647\u0645 \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc\u0634\u0647. \u062f\u0627\u062e\u0644 <code>pin-set<\/code> \u062f\u0648 \u0647\u0634 \u062f\u0627\u0631\u06cc\u0645\u061b \u0627\u0648\u0644\u06cc Pin \u06a9\u0644\u06cc\u062f \u0641\u0639\u0644\u06cc \u0648 \u062f\u0648\u0645\u06cc Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0627\u0633\u062a. \u0645\u0642\u062f\u0627\u0631 <code>expiration<\/code> \u0647\u0645 \u0645\u0634\u062e\u0635 \u0645\u06cc\u200c\u06a9\u0646\u0647 Pinning \u062a\u0627 \u0686\u0647 \u062a\u0627\u0631\u06cc\u062e\u06cc \u0627\u062c\u0631\u0627 \u0628\u0634\u0647. \u0628\u0639\u062f \u0627\u0632 \u0627\u0648\u0646 \u062a\u0627\u0631\u06cc\u062e\u060c \u0627\u0646\u062f\u0631\u0648\u06cc\u062f Pin\u0647\u0627 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0641\u0642\u0637 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0639\u0627\u062f\u06cc TLS \u0628\u0627\u0642\u06cc \u0645\u06cc\u200c\u0645\u0648\u0646\u0647. \u0627\u06cc\u0646 \u062a\u0627\u0631\u06cc\u062e \u06cc\u06a9 \u0631\u0627\u0647 \u0641\u0631\u0627\u0631 \u0628\u0631\u0627\u06cc \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0642\u062f\u06cc\u0645\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a \u062a\u0627 \u062f\u0631 \u0635\u0648\u0631\u062a \u062a\u063a\u06cc\u06cc\u0631 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a\u060c \u0628\u0631\u0627\u06cc \u0647\u0645\u06cc\u0634\u0647 \u0627\u0632 \u0633\u0631\u0648\u0631 \u0642\u0637\u0639 \u0646\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0631\u0648 \u062f\u0627\u062e\u0644 Manifest \u0645\u0639\u0631\u0641\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;application\n    android:name=\".GheimatBanApplication\"\n    android:networkSecurityConfig=\"@xml\/network_security_config\"\n    android:theme=\"@style\/Theme.GheimatBan\">\n\n    &lt;!-- Activities -->\n\n&lt;\/application>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">name<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;.GheimatBanApplication&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">networkSecurityConfig<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;@xml\/network_security_config&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">theme<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;@style\/Theme.GheimatBan&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;!--<\/span><span style=\"color: #24292E\"> Activities <\/span><span style=\"color: #D73A49\">--&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">application<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0632 \u0627\u06cc\u0646 \u0644\u062d\u0638\u0647 \u0628\u0647 \u0628\u0639\u062f\u060c \u062a\u0645\u0627\u0645 \u0627\u062a\u0635\u0627\u0644\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u0632 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0634\u0628\u06a9\u0647 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0648 \u0628\u0647 \u062f\u0627\u0645\u0646\u0647 \u0645\u0634\u062e\u0635\u200c\u0634\u062f\u0647 \u0645\u06cc\u0631\u0646\u060c \u0628\u0627\u06cc\u062f \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0645\u0639\u0645\u0648\u0644 TLS\u060c \u0628\u0627 \u06cc\u06a9\u06cc \u0627\u0632 Pin\u0647\u0627 \u0647\u0645 \u062a\u0637\u0627\u0628\u0642 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646. \u0627\u06af\u0647 \u0647\u06cc\u0686 Pin\u06cc \u062f\u0631 \u0632\u0646\u062c\u06cc\u0631\u0647 \u06af\u0648\u0627\u0647\u06cc \u067e\u06cc\u062f\u0627 \u0646\u0634\u0647\u060c \u0627\u062a\u0635\u0627\u0644 \u0628\u0627 \u062e\u0637\u0627\u06cc SSL \u0634\u06a9\u0633\u062a \u0645\u06cc\u200c\u062e\u0648\u0631\u0647 \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0635\u0644\u0627\u064b \u0628\u0647 API \u0646\u0645\u06cc\u0631\u0633\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0642\u062f\u0627\u0631 Pin \u0631\u0648 \u0627\u0632 \u06a9\u062c\u0627 \u0628\u06cc\u0627\u0631\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u0642\u062f\u0627\u0631 Pin \u062e\u0648\u062f \u06af\u0648\u0627\u0647\u06cc \u06cc\u0627 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0646\u06cc\u0633\u062a. \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644 \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647\u060c \u0647\u0634 SHA-256 \u0628\u062e\u0634 <code>Subject Public Key Info<\/code> \u06af\u0648\u0627\u0647\u06cc\u0647 \u06a9\u0647 \u0628\u0647 \u0634\u06a9\u0644 Base64 \u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647. \u0628\u0631\u0627\u06cc \u0628\u0647\u200c\u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0627\u0632 <code>openssl<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u0645\u0648\u0631\u062f\u0627\u0639\u062a\u0645\u0627\u062f \u0648 \u0628\u0631\u0627\u06cc \u062f\u0627\u0645\u0646\u0647 \u0648\u0627\u0642\u0639\u06cc \u0627\u062c\u0631\u0627 \u0628\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>openssl s_client \\\n  -connect api.gheimatban.com:443 \\\n  -servername api.gheimatban.com \\\n  &lt;\/dev\/null 2>\/dev\/null \\\n| openssl x509 -pubkey -noout \\\n| openssl pkey -pubin -outform der \\\n| openssl dgst -sha256 -binary \\\n| openssl enc -base64\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">openssl s_client \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">  <\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">connect api.gheimatban.com:<\/span><span style=\"color: #6F42C1\">443<\/span><span style=\"color: #24292E\"> \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">  <\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">servername api.gheimatban.com \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">  <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">dev<\/span><span style=\"color: #D73A49\">\/<\/span><span style=\"color: #005CC5\">null<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">2<\/span><span style=\"color: #D73A49\">&gt;\/<\/span><span style=\"color: #24292E\">dev<\/span><span style=\"color: #D73A49\">\/<\/span><span style=\"color: #005CC5\">null<\/span><span style=\"color: #24292E\"> \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">| openssl x509 <\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">pubkey <\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">noout \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">| openssl pkey <\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">pubin <\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">outform der \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">| openssl dgst <\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">sha256 <\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">binary \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">| openssl enc <\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">base64<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mS8W7Yh3jK9q1Zx2p0F7b6n4V8c3L5a9R2t6Q1u7X0M=\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0628\u0627\u06cc\u062f \u062f\u0627\u062e\u0644 \u062a\u06af <code>pin<\/code> \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0647\u060c \u0628\u062f\u0648\u0646 \u067e\u06cc\u0634\u0648\u0646\u062f <code>sha256\/<\/code>. \u0627\u0645\u0627 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u06a9 \u0627\u062d\u062a\u06cc\u0627\u0637 \u0645\u0647\u0645 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647: \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 Pin \u0631\u0648 \u0627\u0632 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u0646\u0627\u0634\u0646\u0627\u0633 \u0631\u0648\u06cc \u06cc\u06a9 \u0634\u0628\u06a9\u0647 \u0646\u0627\u0645\u0637\u0645\u0626\u0646 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u06cc\u0645 \u0648 \u0628\u0639\u062f \u0628\u062f\u0648\u0646 \u0628\u0631\u0631\u0633\u06cc \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645. \u0686\u0648\u0646 \u0627\u06af\u0647 \u0647\u0645\u0648\u0646 \u0644\u062d\u0638\u0647 \u062a\u062d\u062a \u062d\u0645\u0644\u0647 MITM \u0628\u0627\u0634\u06cc\u0645\u060c \u0645\u0645\u06a9\u0646\u0647 Pin \u06af\u0648\u0627\u0647\u06cc \u0645\u0647\u0627\u062c\u0645 \u0631\u0648 \u062b\u0628\u062a \u06a9\u0646\u06cc\u0645. \u0628\u0647\u062a\u0631\u0647 \u0645\u0642\u062f\u0627\u0631 Pin \u0627\u0632 \u062a\u06cc\u0645 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u06cc\u0627 \u0627\u0632 \u06af\u0648\u0627\u0647\u06cc \u0648 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0631\u0633\u0645\u06cc \u0633\u0631\u0648\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u0648 \u0645\u0633\u062a\u0642\u0644 \u062a\u0623\u06cc\u06cc\u062f \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0627\u06cc\u062f Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0631\u0648 \u0627\u0632 \u06a9\u0644\u06cc\u062f\u06cc \u0628\u06af\u06cc\u0631\u06cc\u0645 \u06a9\u0647 \u0647\u0646\u0648\u0632 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0641\u0639\u0627\u0644 \u0646\u0634\u062f\u0647\u060c \u0627\u0645\u0627 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0627\u0648\u0646 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0627\u0645\u0646 \u062e\u0648\u062f\u0645\u0648\u0646\u0647. \u0627\u06cc\u0646 \u0628\u062e\u0634 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062a\u0648\u0633\u0637 \u062a\u06cc\u0645 Backend \u06cc\u0627 DevOps \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u0634\u0647\u060c \u0646\u0647 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u062e\u0648\u062f\u0634 \u06cc\u06a9 \u0647\u0634 \u062a\u0635\u0627\u062f\u0641\u06cc \u0628\u0633\u0627\u0632\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 \u06af\u0648\u0627\u0647\u06cc Leaf \u0631\u0648 Pin \u06a9\u0646\u06cc\u0645 \u06cc\u0627 CA \u0631\u0648\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0632\u0646\u062c\u06cc\u0631\u0647 \u06af\u0648\u0627\u0647\u06cc \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0634\u0627\u0645\u0644 \u06af\u0648\u0627\u0647\u06cc \u062f\u0627\u0645\u0646\u0647 \u06cc\u0627 Leaf Certificate\u060c \u06cc\u06a9 \u06cc\u0627 \u0686\u0646\u062f \u06af\u0648\u0627\u0647\u06cc Intermediate \u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a Root CA \u0627\u0633\u062a. Pin \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0627 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0647\u0631 \u06a9\u062f\u0648\u0645 \u0627\u0632 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u0632\u0646\u062c\u06cc\u0631\u0647 \u062a\u0637\u0627\u0628\u0642 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0647\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u0632\u0627\u06cc\u0627 \u0648 \u0645\u0639\u0627\u06cc\u0628 \u062e\u0648\u062f\u0634 \u0631\u0648 \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0647 \u06af\u0648\u0627\u0647\u06cc Leaf \u0631\u0648 Pin \u06a9\u0646\u06cc\u0645\u060c \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0633\u062e\u062a\u200c\u06af\u06cc\u0631\u0627\u0646\u0647\u200c\u062a\u0631 \u0645\u06cc\u0634\u0647 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0642\u0637 \u06a9\u0644\u06cc\u062f \u0647\u0645\u0627\u0646 \u0633\u0631\u0648\u0631 \u0631\u0648 \u0642\u0628\u0648\u0644 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u0645\u0627 \u0627\u06af\u0647 \u0647\u0646\u06af\u0627\u0645 \u062a\u0645\u062f\u06cc\u062f \u06af\u0648\u0627\u0647\u06cc \u06a9\u0644\u06cc\u062f \u0639\u0648\u0636 \u0628\u0634\u0647\u060c Pin \u0647\u0645 \u0628\u0627\u06cc\u062f \u0639\u0648\u0636 \u0628\u0634\u0647. \u0627\u06af\u0647 Intermediate CA \u0631\u0648 Pin \u06a9\u0646\u06cc\u0645\u060c \u06af\u0648\u0627\u0647\u06cc \u062f\u0627\u0645\u0646\u0647 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0627 \u0627\u0646\u0639\u0637\u0627\u0641 \u0628\u06cc\u0634\u062a\u0631\u06cc \u062a\u0645\u062f\u06cc\u062f \u0628\u0634\u0647\u060c \u0627\u0645\u0627 \u0647\u0631 \u06af\u0648\u0627\u0647\u06cc \u062f\u06cc\u06af\u0631\u06cc \u06a9\u0647 \u0628\u0627 \u0647\u0645\u0648\u0646 Intermediate \u0635\u0627\u062f\u0631 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647 \u0645\u0645\u06a9\u0646\u0647 \u0634\u0631\u0637 Pin \u0631\u0648 \u0628\u0631\u0622\u0648\u0631\u062f\u0647 \u06a9\u0646\u0647. Pin \u06a9\u0631\u062f\u0646 Root CA \u0647\u0645 \u062f\u0627\u0645\u0646\u0647 \u0627\u0639\u062a\u0645\u0627\u062f \u0628\u0633\u06cc\u0627\u0631 \u0628\u0632\u0631\u06af\u200c\u062a\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0645\u0645\u06a9\u0646\u0647 \u0628\u062e\u0634 \u0628\u0632\u0631\u06af\u06cc \u0627\u0632 \u0645\u0632\u06cc\u062a Pinning \u0631\u0648 \u06a9\u0627\u0647\u0634 \u0628\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 Pinning \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0646\u060c Pin \u06a9\u0631\u062f\u0646 \u06a9\u0644\u06cc\u062f Leaf \u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u062a\u062d\u062a\u200c\u06a9\u0646\u062a\u0631\u0644 \u0627\u0646\u062a\u062e\u0627\u0628 \u062f\u0642\u06cc\u0642\u06cc\u0647. \u0627\u0645\u0627 \u062a\u0635\u0645\u06cc\u0645 \u0646\u0647\u0627\u06cc\u06cc \u0628\u0627\u06cc\u062f \u0628\u0627 \u062a\u06cc\u0645 \u0627\u0645\u0646\u06cc\u062a \u0648 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u06af\u0631\u0641\u062a\u0647 \u0628\u0634\u0647\u060c \u0686\u0648\u0646 \u0645\u062f\u0644 \u062a\u0645\u062f\u06cc\u062f \u06af\u0648\u0627\u0647\u06cc \u0648 \u0686\u0631\u062e\u0634 \u06a9\u0644\u06cc\u062f \u0647\u0631 \u0633\u0627\u0632\u0645\u0627\u0646 \u0645\u062a\u0641\u0627\u0648\u062a\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0631\u0648\u0634 \u062f\u0648\u0645: Pinning \u0628\u0627 OkHttp<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0647 \u062a\u0645\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0627 OkHttp \u0648 Retrofit \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u0634\u0646\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0627\u0632 <code>CertificatePinner<\/code> \u062e\u0648\u062f OkHttp \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0648\u0634 Pin \u0641\u0642\u0637 \u0631\u0648\u06cc \u0647\u0645\u0627\u0646 <code>OkHttpClient<\/code> \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc\u0634\u0647 \u0648 \u06a9\u0646\u062a\u0631\u0644 \u0627\u0648\u0646 \u062f\u0627\u062e\u0644 \u06a9\u062f Kotlin \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. OkHttp \u0647\u0645 \u0627\u0632 Pin\u0647\u0627\u06cc SHA-256 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u06af\u0648\u0627\u0647\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import okhttp3.CertificatePinner\nimport okhttp3.OkHttpClient\n\nprivate const val API_HOST =\n    \"api.gheimatban.com\"\n\nprivate const val PRIMARY_PIN =\n    \"sha256\/BASE64_PRIMARY_PUBLIC_KEY_HASH\"\n\nprivate const val BACKUP_PIN =\n    \"sha256\/BASE64_BACKUP_PUBLIC_KEY_HASH\"\n\nval certificatePinner =\n    CertificatePinner.Builder()\n        .add(\n            API_HOST,\n            PRIMARY_PIN\n        )\n        .add(\n            API_HOST,\n            BACKUP_PIN\n        )\n        .build()\n\nval okHttpClient =\n    OkHttpClient.Builder()\n        .certificatePinner(\n            certificatePinner\n        )\n        .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">okhttp3.CertificatePinner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">okhttp3.OkHttpClient<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> API_HOST <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;api.gheimatban.com&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> PRIMARY_PIN <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;sha256\/BASE64_PRIMARY_PUBLIC_KEY_HASH&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> BACKUP_PIN <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;sha256\/BASE64_BACKUP_PUBLIC_KEY_HASH&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> certificatePinner <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    CertificatePinner.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">add<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            API_HOST,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            PRIMARY_PIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">add<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            API_HOST,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            BACKUP_PIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> okHttpClient <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    OkHttpClient.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">certificatePinner<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            certificatePinner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0647\u0645\u06cc\u0646 Client \u0631\u0648 \u0628\u0647 Retrofit \u0645\u06cc\u062f\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val retrofit =\n    Retrofit.Builder()\n        .baseUrl(\n            \"https:\/\/api.gheimatban.com\/\"\n        )\n        .client(okHttpClient)\n        .addConverterFactory(\n            GsonConverterFactory.create()\n        )\n        .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> retrofit <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    Retrofit.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">baseUrl<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;https:\/\/api.gheimatban.com\/&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">client<\/span><span style=\"color: #24292E\">(okHttpClient)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">addConverterFactory<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            GsonConverterFactory.<\/span><span style=\"color: #6F42C1\">create<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc OkHttp \u0628\u0647 \u0633\u0631\u0648\u0631 \u0648\u0635\u0644 \u0645\u06cc\u0634\u0647\u060c \u0627\u0648\u0644 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0639\u0627\u062f\u06cc TLS \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u0634\u0647. \u0628\u0639\u062f <code>CertificatePinner<\/code> \u0632\u0646\u062c\u06cc\u0631\u0647 \u06af\u0648\u0627\u0647\u06cc \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0645\u06cc\u200c\u0628\u06cc\u0646\u0647 \u0622\u06cc\u0627 \u062f\u0633\u062a\u200c\u06a9\u0645 \u06cc\u06a9\u06cc \u0627\u0632 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u0628\u0627 Pin\u0647\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641\u200c\u0634\u062f\u0647 \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0627\u0631\u0647 \u06cc\u0627 \u0646\u0647. \u0627\u06af\u0647 \u062a\u0637\u0627\u0628\u0642 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c OkHttp \u06cc\u06a9 <code>SSLPeerUnverifiedException<\/code> \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0634\u06a9\u0633\u062a \u0645\u06cc\u200c\u062e\u0648\u0631\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pinning \u0628\u0627 XML \u0628\u0647\u062a\u0631\u0647 \u06cc\u0627 OkHttp\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u06cc\u0686 \u067e\u0627\u0633\u062e \u0645\u0637\u0644\u0642\u06cc \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u0647. Network Security Configuration \u062f\u0631 \u0633\u0637\u062d \u067e\u0644\u062a\u0641\u0631\u0645 \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc\u0634\u0647 \u0648 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc \u0631\u0648 \u0627\u0632 \u06a9\u062f \u0634\u0628\u06a9\u0647 \u062c\u062f\u0627 \u0646\u06af\u0647 \u0645\u06cc\u200c\u062f\u0627\u0631\u0647. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0631\u0648\u06cc \u0627\u062a\u0635\u0627\u0644\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0639\u0645\u0627\u0644 \u0628\u0634\u0647 \u0648 \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u060c \u062a\u0627\u0631\u06cc\u062e \u0627\u0646\u0642\u0636\u0627 \u0648 Debug Override \u0631\u0648 \u0628\u0647 \u0635\u0648\u0631\u062a \u0631\u0633\u0645\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u06a9\u0647 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0647 \u0648\u0627\u0642\u0639\u0627\u064b Pinning \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0627\u0646\u062a\u062e\u0627\u0628 \u062a\u0645\u06cc\u0632\u062a\u0631 \u0648 \u06a9\u0645\u200c\u062e\u0637\u0631\u062a\u0631\u06cc\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>CertificatePinner<\/code> \u062f\u0631 OkHttp \u0647\u0645 \u0633\u0627\u062f\u0647 \u0648 \u0642\u0627\u0628\u0644\u200c\u0641\u0647\u0645\u0647 \u0648 \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062a\u0645\u0627\u0645 \u0627\u0631\u062a\u0628\u0627\u0637 \u0634\u0628\u06a9\u0647\u200c\u0634\u0648\u0646 \u0627\u0632 \u06cc\u06a9 OkHttpClient \u0645\u0634\u062e\u0635 \u0639\u0628\u0648\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u06a9\u0646\u062a\u0631\u0644 \u0645\u0633\u062a\u0642\u06cc\u0645\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u0645\u0627 \u062a\u0627\u0631\u06cc\u062e \u0627\u0646\u0642\u0636\u0627\u06cc Pin \u0628\u0647 \u0634\u06a9\u0644 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062f\u0631 \u0627\u0648\u0646 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u0647 \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0686\u0631\u062e\u0634 Pin \u0628\u0627\u06cc\u062f \u062f\u0631 \u0645\u0646\u0637\u0642 \u0627\u0646\u062a\u0634\u0627\u0631 \u0646\u0633\u062e\u0647\u200c\u0647\u0627 \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u06af\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0632 WebView\u060c \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0634\u0628\u06a9\u0647 \u062f\u06cc\u06af\u0631\u06cc \u06cc\u0627 \u0627\u062a\u0635\u0627\u0644 \u062e\u0627\u0631\u062c \u0627\u0632 OkHttp \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0647\u060c Pinning \u062a\u0639\u0631\u06cc\u0641\u200c\u0634\u062f\u0647 \u0631\u0648\u06cc OkHttp \u0627\u0648\u0646 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0631\u0648 \u067e\u0648\u0634\u0634 \u0646\u0645\u06cc\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0628\u0627\u06cc\u062f \u0647\u0645\u200c\u0632\u0645\u0627\u0646 \u0648 \u0628\u062f\u0648\u0646 \u062f\u0644\u06cc\u0644 \u0647\u0631 \u062f\u0648 \u0631\u0648\u0634 \u0631\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u0645. \u0686\u0648\u0646 \u062f\u0631 \u0627\u0648\u0646 \u0635\u0648\u0631\u062a \u062f\u0648 \u0644\u0627\u06cc\u0647 Pinning \u0645\u0633\u062a\u0642\u0644 \u062f\u0627\u0631\u06cc\u0645 \u0648 \u0639\u06cc\u0628\u200c\u06cc\u0627\u0628\u06cc \u0648 \u0686\u0631\u062e\u0634 \u06a9\u0644\u06cc\u062f \u067e\u06cc\u0686\u06cc\u062f\u0647\u200c\u062a\u0631 \u0645\u06cc\u0634\u0647. \u06cc\u06a9 \u0631\u0648\u0634 \u0631\u0648 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u0647\u0645\u0648\u0646 \u0631\u0648 \u062f\u0642\u06cc\u0642 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0628\u0631\u0627\u06cc \u0646\u0633\u062e\u0647 Debug \u0686\u0637\u0648\u0631 Proxy \u0634\u0628\u06a9\u0647 \u0631\u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc Pinning \u0641\u0639\u0627\u0644 \u0628\u0627\u0634\u0647\u060c \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 Charles Proxy\u060c Burp Suite \u06cc\u0627 Proxyman \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0646\u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u062a\u0631\u0627\u0641\u06cc\u06a9 HTTPS \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0628\u062e\u0648\u0646\u0646. \u0627\u06cc\u0646 \u0627\u0628\u0632\u0627\u0631\u0647\u0627 \u06cc\u06a9 CA \u0645\u062e\u0635\u0648\u0635 \u062e\u0648\u062f\u0634\u0648\u0646 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u0646\u0635\u0628 \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0648 \u06af\u0648\u0627\u0647\u06cc \u0645\u0648\u0642\u062a \u0628\u0631\u0627\u06cc \u062f\u0627\u0645\u0646\u0647 API \u0645\u06cc\u200c\u0633\u0627\u0632\u0646\u060c \u0627\u0645\u0627 \u0686\u0648\u0646 \u06a9\u0644\u06cc\u062f \u0627\u0648\u0646 \u06af\u0648\u0627\u0647\u06cc \u0628\u0627 Pin \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0637\u0627\u0628\u0642 \u0646\u062f\u0627\u0631\u0647\u060c \u0627\u062a\u0635\u0627\u0644 \u0631\u062f \u0645\u06cc\u0634\u0647. \u0627\u06cc\u0646 \u0631\u0641\u062a\u0627\u0631 \u062f\u0631 \u0646\u0633\u062e\u0647 Release \u0645\u0637\u0644\u0648\u0628\u0647\u060c \u0648\u0644\u06cc \u0647\u0646\u06af\u0627\u0645 \u062a\u0648\u0633\u0639\u0647 \u0645\u0645\u06a9\u0646\u0647 \u0639\u06cc\u0628\u200c\u06cc\u0627\u0628\u06cc \u0634\u0628\u06a9\u0647 \u0631\u0648 \u062f\u0634\u0648\u0627\u0631 \u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Network Security Configuration \u0627\u0645\u06a9\u0627\u0646 <code>debug-overrides<\/code> \u0631\u0648 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0628\u0627 \u0627\u06cc\u0646 \u0628\u062e\u0634 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0641\u0642\u0637 \u062f\u0631 \u0646\u0633\u062e\u0647 Debug \u0628\u0647 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627\u06cc \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u0646\u06cc\u0645 \u0648 \u0627\u062c\u0627\u0632\u0647 \u0628\u062f\u06cc\u0645 \u0627\u0648\u0646\u200c\u0647\u0627 Pinning \u0631\u0648 \u062f\u0648\u0631 \u0628\u0632\u0646\u0646. \u0627\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645 \u0646\u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0646\u0633\u062e\u0647 Release \u0627\u062b\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\n&lt;network-security-config>\n\n    &lt;domain-config cleartextTrafficPermitted=\"false\">\n\n        &lt;domain includeSubdomains=\"true\">\n            api.gheimatban.com\n        &lt;\/domain>\n\n        &lt;pin-set expiration=\"2028-12-31\">\n\n            &lt;pin digest=\"SHA-256\">\n                BASE64_PRIMARY_PUBLIC_KEY_HASH\n            &lt;\/pin>\n\n            &lt;pin digest=\"SHA-256\">\n                BASE64_BACKUP_PUBLIC_KEY_HASH\n            &lt;\/pin>\n\n        &lt;\/pin-set>\n\n    &lt;\/domain-config>\n\n    &lt;debug-overrides>\n        &lt;trust-anchors>\n            &lt;certificates\n                src=\"user\"\n                overridePins=\"true\" \/>\n        &lt;\/trust-anchors>\n    &lt;\/debug-overrides>\n\n&lt;\/network-security-config>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">?xml version<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;1.0&quot;<\/span><span style=\"color: #24292E\"> encoding<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;utf-8&quot;<\/span><span style=\"color: #24292E\">?<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">network<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">security<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">domain<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config cleartextTrafficPermitted<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;false&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">domain includeSubdomains<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;true&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            api.gheimatban.com<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">domain<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">pin<\/span><span style=\"color: #D73A49\">-set<\/span><span style=\"color: #24292E\"> expiration<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;2028-12-31&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">pin digest<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;SHA-256&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                BASE64_PRIMARY_PUBLIC_KEY_HASH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">pin<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">pin digest<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;SHA-256&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                BASE64_BACKUP_PUBLIC_KEY_HASH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">pin<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">pin<\/span><span style=\"color: #D73A49\">-set&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">domain<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">debug<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">overrides<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">trust<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">anchors<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">certificates<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                src<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;user&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                overridePins<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;true&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">trust<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">anchors<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">debug<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">overrides<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">network<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">security<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">config<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u06cc\u0698\u06af\u06cc <code>overridePins=\"true\"<\/code> \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u0632 Trust Anchor \u0645\u062e\u0635\u0648\u0635 Debug \u0645\u06cc\u0627\u0646\u060c \u0627\u0632 \u0628\u0631\u0631\u0633\u06cc Pinning \u0639\u0628\u0648\u0631 \u06a9\u0646\u0646. \u0637\u0628\u0642 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f\u060c Debug Override \u0641\u0642\u0637 \u0632\u0645\u0627\u0646\u06cc \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc\u0634\u0647 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Debuggable \u0628\u0627\u0634\u0647 \u0648 \u0631\u0648\u06cc \u0646\u0633\u062e\u0647 Release \u0641\u0639\u0627\u0644 \u0646\u06cc\u0633\u062a. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u0628\u0627\u06cc\u062f \u0641\u0627\u06cc\u0644 \u0646\u0647\u0627\u06cc\u06cc \u0631\u0648 \u062f\u0642\u06cc\u0642 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0645\u0637\u0645\u0626\u0646 \u0628\u0634\u06cc\u0645 \u0646\u0633\u062e\u0647 \u0627\u0646\u062a\u0634\u0627\u0631 \u0648\u0627\u0642\u0639\u0627\u064b <code>debuggable=false<\/code> \u0627\u0633\u062a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062e\u0637\u0627\u06cc Pinning \u0631\u0648 \u0686\u0637\u0648\u0631 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc Pin \u0628\u0627 \u06af\u0648\u0627\u0647\u06cc \u0633\u0631\u0648\u0631 \u062a\u0637\u0627\u0628\u0642 \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0628\u0627\u06cc\u062f \u062e\u0637\u0627\u06cc \u062e\u0627\u0645 \u0648 \u0641\u0646\u06cc \u0631\u0648 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u0647. \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0641\u0631\u0642\u06cc \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647 <code>SSLPeerUnverifiedException<\/code> \u0631\u062e \u062f\u0627\u062f\u0647 \u06cc\u0627 \u0632\u0646\u062c\u06cc\u0631\u0647 \u06af\u0648\u0627\u0647\u06cc \u0627\u0634\u062a\u0628\u0627\u0647 \u0628\u0648\u062f\u0647\u061b \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0628\u062f\u0648\u0646\u0647 \u0627\u062a\u0635\u0627\u0644 \u0627\u0645\u0646 \u0628\u0627 \u0633\u0631\u0648\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u0634\u062f\u0647. \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u0627\u06cc\u0646 \u062e\u0637\u0627 \u0646\u0628\u0627\u06cc\u062f \u0645\u062b\u0644 \u0642\u0637\u0639 \u0628\u0648\u062f\u0646 \u0645\u0639\u0645\u0648\u0644\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0628\u0634\u0647\u060c \u0686\u0648\u0646 \u0645\u0645\u06a9\u0646\u0647 \u0646\u0634\u0627\u0646\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u0627\u0634\u062a\u0628\u0627\u0647 \u06af\u0648\u0627\u0647\u06cc\u060c \u062d\u0645\u0644\u0647 \u0634\u0628\u06a9\u0647 \u06cc\u0627 \u062e\u0631\u0627\u0628 \u0634\u062f\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a Pinning \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import javax.net.ssl.SSLHandshakeException\nimport javax.net.ssl.SSLPeerUnverifiedException\n\nsuspend fun loadProducts(): Result&lt;List&lt;Product>> {\n    return try {\n        val products =\n            apiService.getProducts()\n\n        Result.success(products)\n    } catch (\n        exception: SSLPeerUnverifiedException\n    ) {\n        Result.failure(\n            SecureConnectionException()\n        )\n    } catch (\n        exception: SSLHandshakeException\n    ) {\n        Result.failure(\n            SecureConnectionException()\n        )\n    } catch (\n        exception: Exception\n    ) {\n        Result.failure(exception)\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">javax.net.ssl.SSLHandshakeException<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">javax.net.ssl.SSLPeerUnverifiedException<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">loadProducts<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Result<\/span><span style=\"color: #24292E\">&lt;<\/span><span style=\"color: #6F42C1\">List<\/span><span style=\"color: #24292E\">&lt;<\/span><span style=\"color: #6F42C1\">Product<\/span><span style=\"color: #24292E\">&gt;&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">try<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> products <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            apiService.<\/span><span style=\"color: #6F42C1\">getProducts<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Result.<\/span><span style=\"color: #6F42C1\">success<\/span><span style=\"color: #24292E\">(products)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    } <\/span><span style=\"color: #D73A49\">catch<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        exception: <\/span><span style=\"color: #6F42C1\">SSLPeerUnverifiedException<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Result.<\/span><span style=\"color: #6F42C1\">failure<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">SecureConnectionException<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    } <\/span><span style=\"color: #D73A49\">catch<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        exception: <\/span><span style=\"color: #6F42C1\">SSLHandshakeException<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Result.<\/span><span style=\"color: #6F42C1\">failure<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">SecureConnectionException<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    } <\/span><span style=\"color: #D73A49\">catch<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        exception: <\/span><span style=\"color: #6F42C1\">Exception<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Result.<\/span><span style=\"color: #6F42C1\">failure<\/span><span style=\"color: #24292E\">(exception)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9 Exception \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0647\u0645 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class SecureConnectionException :\n    Exception(\n        \"Secure connection could not be established.\"\n    )\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SecureConnectionException<\/span><span style=\"color: #24292E\"> :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">Exception<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #032F62\">&quot;Secure connection could not be established.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0627\u062e\u0644 ViewModel \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u067e\u06cc\u0627\u0645 \u0645\u0646\u0627\u0633\u0628 \u0631\u0648 \u0628\u0631\u0627\u06cc \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>when (exception) {\n    is SecureConnectionException -> {\n        _uiState.update {\n            it.copy(\n                errorMessage =\n                    \"\u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u0645\u0646 \u0628\u0627 \u0633\u0631\u0648\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u0634\u062f. \" +\n                    \"\u0644\u0637\u0641\u0627\u064b \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0628\u0647\u200c\u0631\u0648\u0632 \u06a9\u0646 \u06cc\u0627 \u06a9\u0645\u06cc \u0628\u0639\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646.\"\n            )\n        }\n    }\n\n    else -> {\n        _uiState.update {\n            it.copy(\n                errorMessage =\n                    \"\u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0627 \u062e\u0637\u0627 \u0631\u0648\u0628\u0647\u200c\u0631\u0648 \u0634\u062f.\"\n            )\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">when<\/span><span style=\"color: #24292E\"> (exception) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">is<\/span><span style=\"color: #24292E\"> SecureConnectionException <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        _uiState.<\/span><span style=\"color: #6F42C1\">update<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            it.<\/span><span style=\"color: #6F42C1\">copy<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                errorMessage <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #032F62\">&quot;\u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u0645\u0646 \u0628\u0627 \u0633\u0631\u0648\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u0634\u062f. &quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #032F62\">&quot;\u0644\u0637\u0641\u0627\u064b \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0628\u0647\u200c\u0631\u0648\u0632 \u06a9\u0646 \u06cc\u0627 \u06a9\u0645\u06cc \u0628\u0639\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        _uiState.<\/span><span style=\"color: #6F42C1\">update<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            it.<\/span><span style=\"color: #6F42C1\">copy<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                errorMessage <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #032F62\">&quot;\u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0627 \u062e\u0637\u0627 \u0631\u0648\u0628\u0647\u200c\u0631\u0648 \u0634\u062f.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u06a9\u062a\u0647 \u0645\u0647\u0645 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0639\u062f \u0627\u0632 \u062e\u0637\u0627\u06cc Pinning \u0646\u0628\u0627\u06cc\u062f \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0647 HTTP \u0628\u0631\u06af\u0631\u062f\u06cc\u0645\u060c \u0628\u0631\u0631\u0633\u06cc \u06af\u0648\u0627\u0647\u06cc \u0631\u0648 \u062e\u0627\u0645\u0648\u0634 \u06a9\u0646\u06cc\u0645 \u06cc\u0627 \u0647\u0631 \u06af\u0648\u0627\u0647\u06cc\u200c\u0627\u06cc \u0631\u0648 \u0642\u0628\u0648\u0644 \u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u062a\u0645\u0627\u0645 \u0647\u062f\u0641 Pinning \u0648 \u062d\u062a\u06cc \u0627\u0645\u0646\u06cc\u062a HTTPS \u0631\u0648 \u0627\u0632 \u0628\u06cc\u0646 \u0645\u06cc\u200c\u0628\u0631\u0647. \u0627\u06af\u0647 Pinning \u0634\u06a9\u0633\u062a \u062e\u0648\u0631\u062f\u060c \u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u06cc\u062f \u0645\u062a\u0648\u0642\u0641 \u0628\u0645\u0648\u0646\u0647 \u062a\u0627 \u0639\u0644\u062a \u0648\u0627\u0642\u0639\u06cc \u0628\u0631\u0637\u0631\u0641 \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TrustManager \u0633\u0641\u0627\u0631\u0634\u06cc \u0646\u0633\u0627\u0632<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u062e\u0637\u0631\u0646\u0627\u06a9\u200c\u062a\u0631\u06cc\u0646 \u0627\u0634\u062a\u0628\u0627\u0647\u200c\u0647\u0627 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u062d\u0644 \u062e\u0637\u0627\u0647\u0627\u06cc SSL \u06cc\u06a9 <code>X509TrustManager<\/code> \u0628\u0633\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u062a\u0645\u0627\u0645 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627 \u0631\u0648 \u0642\u0628\u0648\u0644 \u06a9\u0646\u0647. \u0628\u0639\u0636\u06cc \u06a9\u062f\u0647\u0627\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u0645\u062a\u062f\u06cc \u062e\u0627\u0644\u06cc \u0628\u0631\u0627\u06cc <code>checkServerTrusted<\/code> \u0645\u06cc\u200c\u0633\u0627\u0632\u0646 \u06cc\u0627 \u06cc\u06a9 <code>HostnameVerifier<\/code> \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u0646 \u06a9\u0647 \u0647\u0645\u06cc\u0634\u0647 <code>true<\/code> \u0628\u0631\u06af\u0631\u062f\u0648\u0646\u0647. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0646\u0647\u200c\u062a\u0646\u0647\u0627 Pinning \u0646\u06cc\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u06a9\u0627\u0645\u0644 HTTPS \u0631\u0648 \u063a\u06cc\u0631\u0641\u0639\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u062d\u0645\u0644\u0647 MITM \u06a9\u0627\u0645\u0644\u0627\u064b \u0622\u0633\u06cc\u0628\u200c\u067e\u0630\u06cc\u0631 \u0645\u06cc\u200c\u0633\u0627\u0632\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0645\u0648\u0646\u0647 \u062e\u0637\u0631\u0646\u0627\u06a9 \u0627\u06cc\u0646 \u0634\u06a9\u0644\u06cc\u0647 \u0648 \u0646\u0628\u0627\u06cc\u062f \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0634\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val unsafeHostnameVerifier =\n    HostnameVerifier { _, _ ->\n        true\n    }\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> unsafeHostnameVerifier <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">HostnameVerifier<\/span><span style=\"color: #24292E\"> { _, _ <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u06cc\u0646\u200c\u0637\u0648\u0631 \u0646\u0628\u0627\u06cc\u062f \u0686\u0646\u06cc\u0646 TrustManager\u06cc \u0628\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>override fun checkServerTrusted(\n    chain: Array&lt;X509Certificate>,\n    authType: String\n) {\n    \/\/ \u0642\u0628\u0648\u0644 \u06a9\u0631\u062f\u0646 \u062a\u0645\u0627\u0645 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627\u061b \u06a9\u0627\u0645\u0644\u0627\u064b \u0646\u0627\u0627\u0645\u0646\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">checkServerTrusted<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    chain: <\/span><span style=\"color: #6F42C1\">Array<\/span><span style=\"color: #24292E\">&lt;<\/span><span style=\"color: #6F42C1\">X509Certificate<\/span><span style=\"color: #24292E\">&gt;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    authType: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6A737D\">\/\/ \u0642\u0628\u0648\u0644 \u06a9\u0631\u062f\u0646 \u062a\u0645\u0627\u0645 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627\u061b \u06a9\u0627\u0645\u0644\u0627\u064b \u0646\u0627\u0627\u0645\u0646<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0647 \u0633\u0631\u0648\u0631 \u06af\u0648\u0627\u0647\u06cc Self-signed \u062f\u0627\u0631\u0647\u060c \u0631\u0627\u0647\u200c\u062d\u0644 \u0627\u06cc\u0646 \u0646\u06cc\u0633\u062a \u06a9\u0647 \u062a\u0645\u0627\u0645 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc\u200c\u0647\u0627 \u0631\u0648 \u062e\u0627\u0645\u0648\u0634 \u06a9\u0646\u06cc\u0645. \u0628\u0627\u06cc\u062f CA \u06cc\u0627 \u06af\u0648\u0627\u0647\u06cc \u0645\u0648\u0631\u062f\u0646\u0638\u0631 \u0631\u0648 \u0628\u0647 \u0634\u06a9\u0644 \u0645\u062d\u062f\u0648\u062f \u0648 \u0645\u0634\u062e\u0635 \u062f\u0627\u062e\u0644 Network Security Configuration \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645. \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc declarative \u0631\u0648 \u0628\u0647 API\u0647\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0648 \u062e\u0637\u0627\u067e\u0630\u06cc\u0631 \u0627\u0639\u062a\u0645\u0627\u062f \u06af\u0648\u0627\u0647\u06cc \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc\u062f\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 Pin \u062f\u0627\u062e\u0644 APK \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0646\u06cc\u0633\u062a\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0686\u0631\u0627\u060c Pin \u062f\u0627\u062e\u0644 APK \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u0647 \u0648 \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0627\u0633\u062a. \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0645\u0648\u0636\u0648\u0639 \u0628\u0647 \u062e\u0648\u062f\u06cc \u062e\u0648\u062f \u0645\u0634\u06a9\u0644 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0646\u06cc\u0633\u062a\u060c \u0686\u0648\u0646 Pin \u06cc\u06a9 Secret \u0646\u06cc\u0633\u062a. Pin \u0641\u0642\u0637 \u0647\u0634 \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0633\u0631\u0648\u0631\u0647 \u0648 \u062f\u0627\u0646\u0633\u062a\u0646 \u0627\u0648\u0646 \u0647\u06cc\u0686 \u0627\u062c\u0627\u0632\u0647\u200c\u0627\u06cc \u0628\u0631\u0627\u06cc \u062c\u0639\u0644 \u0633\u0631\u0648\u0631 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647. \u0645\u0647\u0627\u062c\u0645 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06af\u0648\u0627\u0647\u06cc \u0645\u0637\u0627\u0628\u0642 \u0628\u0627 Pin \u0628\u0647 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0645\u062a\u0646\u0627\u0638\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0647 \u0648 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0646\u0628\u0627\u06cc\u062f \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u06cc\u0627 \u0645\u062e\u0632\u0646 \u06a9\u062f \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0646\u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0645\u062e\u0641\u06cc \u06a9\u0631\u062f\u0646 Pin \u0648\u0642\u062a \u0632\u06cc\u0627\u062f\u06cc \u0635\u0631\u0641 Obfuscation \u06cc\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0639\u062c\u06cc\u0628 \u06a9\u0646\u06cc\u0645. \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0645\u062d\u0631\u0645\u0627\u0646\u0647 \u0628\u0645\u0648\u0646\u0647\u060c \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0633\u0631\u0648\u0631 \u0648 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u0647. \u0627\u06cc\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627 \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0627\u0645\u0646\u060c Secret Manager \u06cc\u0627 HSM \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0634\u0646 \u0648 \u0647\u0631\u06af\u0632 \u0648\u0627\u0631\u062f APK \u0646\u0634\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0686\u0637\u0648\u0631 Pinning \u0631\u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0642\u0637 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0648\u0635\u0644 \u0634\u062f \u06a9\u0627\u0641\u06cc \u0646\u06cc\u0633\u062a. \u0628\u0627\u06cc\u062f \u0645\u0637\u0645\u0626\u0646 \u0628\u0634\u06cc\u0645 \u0627\u062a\u0635\u0627\u0644 \u0628\u0627 Pin \u0627\u0634\u062a\u0628\u0627\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u0634\u06a9\u0633\u062a \u0645\u06cc\u200c\u062e\u0648\u0631\u0647 \u0648 Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0647\u0645 \u0628\u0647\u200c\u062f\u0631\u0633\u062a\u06cc \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u0648\u0644\u06cc\u0646 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0633\u0627\u062f\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0645\u0648\u0642\u062a\u0627\u064b \u06cc\u06a9 Pin \u0627\u0634\u062a\u0628\u0627\u0647 \u062f\u0631 \u0646\u0633\u062e\u0647 Debug \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645 \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648\u0627\u0642\u0639\u06cc \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u0645. \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0627\u06cc\u062f \u0628\u0627 \u062e\u0637\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc SSL \u0634\u06a9\u0633\u062a \u0628\u062e\u0648\u0631\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>private const val WRONG_PIN =\n    \"sha256\/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> WRONG_PIN <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;sha256\/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=&quot;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0627\u06cc\u0646 Pin \u0631\u0648 \u0628\u0647\u200c\u062a\u0646\u0647\u0627\u06cc\u06cc \u062f\u0627\u062e\u0644 <code>CertificatePinner<\/code> \u0642\u0631\u0627\u0631 \u0645\u06cc\u062f\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val certificatePinner =\n    CertificatePinner.Builder()\n        .add(\n            \"api.gheimatban.com\",\n            WRONG_PIN\n        )\n        .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> certificatePinner <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    CertificatePinner.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">add<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;api.gheimatban.com&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            WRONG_PIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0634\u0631\u0627\u06cc\u0637 \u0627\u062a\u0635\u0627\u0644 \u0646\u0628\u0627\u06cc\u062f \u0628\u0631\u0642\u0631\u0627\u0631 \u0628\u0634\u0647. OkHttp \u0647\u0646\u06af\u0627\u0645 \u0634\u06a9\u0633\u062a \u0645\u0639\u0645\u0648\u0644\u0627\u064b Pin\u0647\u0627\u06cc \u0645\u0634\u0627\u0647\u062f\u0647\u200c\u0634\u062f\u0647 \u062f\u0631 \u0632\u0646\u062c\u06cc\u0631\u0647 \u06af\u0648\u0627\u0647\u06cc \u0631\u0648 \u062f\u0627\u062e\u0644 \u0645\u062a\u0646 Exception \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u062f\u0647. \u0637\u0628\u0642 \u0645\u0633\u062a\u0646\u062f\u0627\u062a OkHttp\u060c \u06cc\u06a9\u06cc \u0627\u0632 \u0631\u0648\u0634\u200c\u0647\u0627\u06cc \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0631\u0648\u06cc \u06cc\u06a9 \u0634\u0628\u06a9\u0647 \u0645\u0648\u0631\u062f\u0627\u0639\u062a\u0645\u0627\u062f \u0639\u0645\u062f\u0627\u064b Pin \u0627\u0634\u062a\u0628\u0627\u0647 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u0645 \u0648 Pin\u0647\u0627\u06cc \u0645\u0648\u0631\u062f\u0627\u0646\u062a\u0638\u0627\u0631 \u0631\u0648 \u0627\u0632 \u062e\u0637\u0627 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0646\u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0634\u0628\u06a9\u0647 \u0646\u0627\u0634\u0646\u0627\u0633 \u06cc\u0627 \u0647\u0645\u0631\u0627\u0647 \u0627\u0628\u0632\u0627\u0631 MITM \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0628\u0627\u06cc\u062f \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc \u0686\u0631\u062e\u0634 \u06a9\u0644\u06cc\u062f \u0631\u0648 \u0647\u0645 \u0642\u0628\u0644 \u0627\u0632 \u0627\u0646\u062a\u0634\u0627\u0631 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645. \u06cc\u0639\u0646\u06cc \u0646\u0633\u062e\u0647\u200c\u0627\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u06a9\u0647 Pin \u0627\u0635\u0644\u06cc \u0648 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0631\u0648 \u062f\u0627\u0631\u0647\u060c \u0628\u0627\u06cc\u062f \u0628\u062a\u0648\u0627\u0646\u062f \u0647\u0645 \u0628\u0627 \u06af\u0648\u0627\u0647\u06cc \u0641\u0639\u0644\u06cc \u0648 \u0647\u0645 \u0628\u0627 \u06af\u0648\u0627\u0647\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u06a9\u0644\u06cc\u062f \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0631\u0642\u0631\u0627\u0631 \u06a9\u0646\u0647. \u0628\u062f\u0648\u0646 \u0686\u0646\u06cc\u0646 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc\u060c \u062f\u0627\u0634\u062a\u0646 Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0641\u0642\u0637 \u0631\u0648\u06cc \u06a9\u0627\u063a\u0630 \u0628\u0627\u0642\u06cc \u0645\u06cc\u200c\u0645\u0648\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0627\u06cc\u062f SSL Pinning \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0646\u0633\u062e\u0647 \u0645\u0639\u0645\u0648\u0644\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b HTTPS \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f\u060c \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0635\u062d\u06cc\u062d \u06af\u0648\u0627\u0647\u06cc\u060c \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0645\u0646\u060c \u06a9\u0646\u062a\u0631\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0648 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u062f\u0631\u0633\u062a \u062a\u0648\u06a9\u0646\u200c\u0647\u0627 \u06a9\u0627\u0641\u06cc \u0647\u0633\u062a\u0646. Android \u0628\u0647\u200c\u0637\u0648\u0631 \u0635\u0631\u06cc\u062d Pinning \u0631\u0648 \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u200c\u0647\u0627 \u062a\u0648\u0635\u06cc\u0647 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0686\u0648\u0646 \u062e\u0637\u0631 \u0642\u0637\u0639 \u0634\u062f\u0646 \u0627\u062a\u0635\u0627\u0644 \u062f\u0631 \u0627\u062b\u0631 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0622\u06cc\u0646\u062f\u0647 \u0633\u0631\u0648\u0631 \u0628\u0627\u0644\u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pinning \u0632\u0645\u0627\u0646\u06cc \u0645\u0646\u0637\u0642\u06cc\u200c\u062a\u0631\u0647 \u06a9\u0647 \u067e\u0631\u0648\u0698\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0633\u06cc\u0627\u0631 \u062d\u0633\u0627\u0633 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u062a\u06cc\u0645 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u062a\u0648\u0627\u0646 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0686\u0631\u062e\u0634 \u06a9\u0644\u06cc\u062f \u0631\u0648 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0622\u0645\u0627\u062f\u0647 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647 \u0648 \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0642\u062f\u06cc\u0645\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0645 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0641\u0639\u0627\u0644 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0628\u0634\u0646. \u0635\u0631\u0641 \u0627\u06cc\u0646\u06a9\u0647 \u00abPinning \u0627\u0645\u0646\u06cc\u062a \u0631\u0648 \u0628\u06cc\u0634\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647\u00bb \u062f\u0644\u06cc\u0644 \u06a9\u0627\u0641\u06cc \u0628\u0631\u0627\u06cc \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u0648\u0646 \u0646\u06cc\u0633\u062a. \u0647\u0631 \u0644\u0627\u06cc\u0647 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0628\u0627\u06cc\u062f \u0647\u0632\u06cc\u0646\u0647\u060c \u062e\u0637\u0631 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u062e\u0648\u062f\u0634 \u0631\u0648 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u062a\u0635\u0645\u06cc\u0645 \u0631\u0648 \u0627\u06cc\u0646\u200c\u0637\u0648\u0631 \u0628\u06af\u06cc\u0631\u06cc\u0645: \u0627\u06af\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0642\u0637 \u0642\u06cc\u0645\u062a\u200c\u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc\u060c \u0639\u0644\u0627\u0642\u0647\u200c\u0645\u0646\u062f\u06cc\u200c\u0647\u0627 \u0648 \u0647\u0634\u062f\u0627\u0631\u0647\u0627\u06cc \u0633\u0627\u062f\u0647 \u0631\u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c Pinning \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0627\u0631\u0632\u0634 \u0631\u06cc\u0633\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc \u0631\u0648 \u0646\u062f\u0627\u0631\u0647. \u0627\u0645\u0627 \u0627\u06af\u0647 \u0628\u0639\u062f\u0627\u064b \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0627\u0644\u06cc\u060c \u067e\u0631\u062f\u0627\u062e\u062a\u060c \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u062a\u062c\u0627\u0631\u06cc \u062d\u0633\u0627\u0633 \u06cc\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u0645\u0647\u0645 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0636\u0627\u0641\u0647 \u0634\u062f\u060c \u0645\u06cc\u0634\u0647 \u0628\u0639\u062f \u0627\u0632 \u0637\u0631\u0627\u062d\u06cc \u0641\u0631\u0627\u06cc\u0646\u062f \u0686\u0631\u062e\u0634 \u06a9\u0644\u06cc\u062f \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0636\u0637\u0631\u0627\u0631\u06cc\u060c \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u06cc\u0646 \u06af\u0632\u06cc\u0646\u0647 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0631\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SSL Pinning \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0639\u0627\u062f\u06cc HTTPS\u060c \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0633\u0631\u0648\u0631 \u0631\u0648 \u0647\u0645 \u0628\u0627 Pin\u0647\u0627\u06cc \u0627\u0632 \u0642\u0628\u0644 \u062b\u0628\u062a\u200c\u0634\u062f\u0647 \u0645\u0642\u0627\u06cc\u0633\u0647 \u06a9\u0646\u0647. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u062f\u0627\u0645\u0646\u0647 \u0627\u0639\u062a\u0645\u0627\u062f \u0631\u0648 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0628\u0639\u0636\u06cc \u062d\u0645\u0644\u0647\u200c\u0647\u0627\u06cc Man-in-the-Middle \u0631\u0648 \u0633\u062e\u062a\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u0627\u0645\u0646\u06cc\u062a \u0645\u0637\u0644\u0642 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0642\u0627\u0628\u0644 \u062f\u0648\u0631 \u0632\u062f\u0646 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 Pinning \u0631\u0648 \u0628\u0627 <code>Network Security Configuration<\/code> \u06cc\u0627 <code>CertificatePinner<\/code> \u062f\u0631 OkHttp \u067e\u06cc\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. \u0631\u0648\u0634 XML \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 \u062f\u0627\u0645\u0646\u0647 \u0645\u0634\u062e\u0635\u060c Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u060c \u062a\u0627\u0631\u06cc\u062e \u0627\u0646\u0642\u0636\u0627 \u0648 Debug Override \u0631\u0648 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0631\u0633\u0645\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u062f\u0647. \u062f\u0631 \u0647\u0631 \u062f\u0648 \u0631\u0648\u0634 \u0628\u0627\u06cc\u062f \u062d\u062f\u0627\u0642\u0644 \u06cc\u06a9 Pin \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645\u060c \u0686\u0631\u062e\u0634 \u06a9\u0644\u06cc\u062f \u0631\u0648 \u0627\u0632 \u0642\u0628\u0644 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645 \u0648 \u0647\u06cc\u0686\u200c\u0648\u0642\u062a \u0628\u0639\u062f \u0627\u0632 \u0634\u06a9\u0633\u062a Pinning \u0628\u0647 \u0627\u062a\u0635\u0627\u0644 \u0646\u0627\u0627\u0645\u0646 \u0628\u0631\u0646\u06af\u0631\u062f\u06cc\u0645.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u062f\u0631\u0633 \u0627\u06cc\u0646 \u0628\u062e\u0634 \u0627\u06cc\u0646\u0647 \u06a9\u0647 <strong>Pinning \u0641\u0642\u0637 \u06cc\u06a9 \u0642\u0637\u0639\u0647 \u06a9\u062f \u0646\u06cc\u0633\u062a\u061b \u06cc\u06a9 \u062a\u0639\u0647\u062f \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc \u0628\u0644\u0646\u062f\u0645\u062f\u062a\u0647.<\/strong> \u0627\u06af\u0647 \u062a\u06cc\u0645 \u0646\u062a\u0648\u0646\u0647 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627\u060c \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u060c \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0642\u062f\u06cc\u0645\u06cc \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0636\u0637\u0631\u0627\u0631\u06cc \u0631\u0648 \u062f\u0631\u0633\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0647\u060c HTTPS \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0648 \u0633\u0627\u0644\u0645 \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u0645\u0646\u200c\u062a\u0631 \u0648 \u0642\u0627\u0628\u0644\u200c\u0627\u0639\u062a\u0645\u0627\u062f\u062a\u0631\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u067e\u0646\u062c\u0627\u0647\u200c\u0648\u06cc\u06a9\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">\u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 Hook<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b Hook \u06a9\u0631\u062f\u0646 \u06cc\u0639\u0646\u06cc \u0686\u06cc\u061f<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-17-1024x683.avif\" alt=\"\" class=\"wp-image-6150\" srcset=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-17-1024x683.avif 1024w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-17-300x200.avif 300w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-17-768x512.avif 768w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-17.avif 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0645\u062a\u062f\u06cc \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u0642\u0628\u0644 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062d\u0633\u0627\u0633 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0622\u06cc\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0648\u0627\u0631\u062f \u062d\u0633\u0627\u0628\u0634 \u0634\u062f\u0647 \u06cc\u0627 \u0646\u0647. \u0627\u06cc\u0646 \u0645\u062a\u062f \u062f\u0631 \u062d\u0627\u0644\u062a \u0639\u0627\u062f\u06cc \u0645\u0642\u062f\u0627\u0631 \u062f\u0631\u0633\u062a \u0631\u0648 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0648\u0646\u0647 \u0648 \u0627\u062c\u0627\u0632\u0647 \u0646\u0645\u06cc\u062f\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0628\u062f\u0648\u0646 \u062a\u0648\u06a9\u0646 \u0645\u0639\u062a\u0628\u0631 \u0628\u0647 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0645\u062d\u0627\u0641\u0638\u062a\u200c\u0634\u062f\u0647 \u0648\u0627\u0631\u062f \u0628\u0634\u0647. \u0627\u0645\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647 \u0648 \u0634\u062e\u0635\u06cc \u06a9\u0647 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0627\u0645\u0644 \u062f\u0633\u062a\u06af\u0627\u0647 \u0631\u0648 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u062f\u0627\u0631\u0647\u060c \u0645\u0645\u06a9\u0646\u0647 \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627 \u0631\u0641\u062a\u0627\u0631 \u0647\u0645\u06cc\u0646 \u0645\u062a\u062f \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647. \u0645\u062b\u0644\u0627\u064b \u06a9\u0627\u0631\u06cc \u06a9\u0646\u0647 \u0645\u062a\u062f \u0628\u0631\u0631\u0633\u06cc \u0648\u0631\u0648\u062f \u0647\u0645\u06cc\u0634\u0647 <code>true<\/code> \u0628\u0631\u06af\u0631\u062f\u0648\u0646\u0647\u060c \u0646\u062a\u06cc\u062c\u0647 \u062a\u0634\u062e\u06cc\u0635 Root \u0631\u0648 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc \u06a9\u0646\u0647\u060c \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0648\u0631\u0648\u062f\u06cc \u0648 \u062e\u0631\u0648\u062c\u06cc \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0631\u0648 \u0628\u062e\u0648\u0646\u0647 \u06cc\u0627 \u062a\u0648\u06a9\u0646 \u0631\u0648 \u062f\u0631\u0633\u062a \u0642\u0628\u0644 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u0647. \u0628\u0647 \u0627\u06cc\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0646 \u0631\u0641\u062a\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627\u060c \u0645\u0639\u0645\u0648\u0644\u0627\u064b <strong>Hooking<\/strong> \u06af\u0641\u062a\u0647 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hook \u0644\u0632\u0648\u0645\u0627\u064b \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc \u0646\u06cc\u0633\u062a \u06a9\u0647 \u0641\u0627\u06cc\u0644 APK \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0631\u062f\u0647. \u06af\u0627\u0647\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc \u0646\u0635\u0628 \u0634\u062f\u0647\u060c \u0627\u0645\u0627 \u0627\u0628\u0632\u0627\u0631 \u062f\u06cc\u06af\u0631\u06cc \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627 \u0648\u0627\u0631\u062f \u0641\u0631\u0627\u06cc\u0646\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u06cc\u0634\u0647 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0645\u062a\u062f\u0647\u0627 \u0631\u0648 \u06a9\u0646\u062a\u0631\u0644 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0642\u0628\u0644 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u06cc\u06a9 \u0645\u062a\u062f\u060c \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0627\u0648\u0646 \u0631\u0648 \u0639\u0648\u0636 \u06a9\u0646\u0647\u060c \u0627\u062c\u0627\u0632\u0647 \u0646\u062f\u0647 \u0628\u062f\u0646\u0647 \u0627\u0635\u0644\u06cc \u0627\u062c\u0631\u0627 \u0628\u0634\u0647 \u06cc\u0627 \u0646\u062a\u06cc\u062c\u0647 \u0633\u0627\u062e\u062a\u06af\u06cc \u0628\u0631\u06af\u0631\u062f\u0648\u0646\u0647. \u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u062f\u0627\u062e\u0644 \u0633\u0648\u0631\u0633\u200c\u06a9\u062f \u0646\u0648\u0634\u062a\u0647\u200c\u0627\u06cc\u0645\u060c \u0627\u0644\u0632\u0627\u0645\u0627\u064b \u0647\u0645\u0648\u0646 \u0686\u06cc\u0632\u06cc \u0646\u06cc\u0633\u062a \u06a9\u0647 \u0631\u0648\u06cc \u06cc\u06a9 \u062f\u0633\u062a\u06af\u0627\u0647 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647. \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 Frida\u060c Xposed \u0648 \u0628\u0639\u0636\u06cc \u0686\u0627\u0631\u0686\u0648\u0628\u200c\u0647\u0627\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 Zygisk \u0628\u0631\u0627\u06cc \u062a\u062d\u0644\u06cc\u0644 \u0627\u0645\u0646\u06cc\u062a\u06cc\u060c \u062a\u0633\u062a \u0646\u0641\u0648\u0630 \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0648\u0631 \u0632\u062f\u0646 \u06a9\u0646\u062a\u0631\u0644\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0686\u0631\u0627 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u06a9\u0627\u0645\u0644 \u0627\u0632 Hook \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0645\u0645\u06a9\u0646 \u0646\u06cc\u0633\u062a\u061f<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"683\" height=\"1024\" src=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-18-683x1024.avif\" alt=\"\" class=\"wp-image-6151\" srcset=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-18-683x1024.avif 683w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-18-200x300.avif 200w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-18-768x1152.avif 768w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-18.avif 1024w\" sizes=\"(max-width: 683px) 100vw, 683px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0642\u0628\u0644 \u0627\u0632 \u0647\u0631 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u0648\u0627\u0642\u0639\u06cc\u062a \u0645\u0647\u0645 \u0631\u0648 \u0628\u067e\u0630\u06cc\u0631\u06cc\u0645: <strong>\u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647\u06cc \u06a9\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0645\u0647\u0627\u062c\u0645 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u0647\u060c \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0635\u062f\u062f\u0631\u0635\u062f\u06cc \u0627\u0632 Hook \u0645\u0645\u06a9\u0646 \u0646\u06cc\u0633\u062a.<\/strong> \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u062d\u0627\u0641\u0638\u0647 \u0641\u0631\u0627\u06cc\u0646\u062f \u0648 \u0645\u062d\u06cc\u0637 \u0627\u062c\u0631\u0627 \u0647\u0645\u06af\u06cc \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u0646. \u0627\u06af\u0647 \u0645\u0647\u0627\u062c\u0645 \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0627\u0641\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u06a9\u0646\u062a\u0631\u0644\u200c\u0647\u0627\u06cc \u0645\u0627 \u0631\u0648 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0647\u060c \u0646\u062a\u06cc\u062c\u0647 \u0627\u0648\u0646\u200c\u0647\u0627 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647 \u06cc\u0627 \u062d\u062a\u06cc \u062e\u0648\u062f \u0645\u062a\u062f \u062a\u0634\u062e\u06cc\u0635 Hook \u0631\u0648 Hook \u06a9\u0646\u0647. \u0647\u0631 \u0628\u0631\u0631\u0633\u06cc\u200c\u0627\u06cc \u06a9\u0647 \u062f\u0627\u062e\u0644 \u0627\u067e \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u0634\u0647\u060c \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u062e\u0648\u062f\u0634 \u06cc\u06a9 \u0642\u0637\u0639\u0647 \u06a9\u062f\u0647 \u0648 \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0645\u06a9\u0646\u0647 \u0647\u062f\u0641 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u067e\u0633 \u0639\u0646\u0648\u0627\u0646 \u00ab\u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 Hook\u00bb \u0631\u0648 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u0645\u0639\u0646\u06cc \u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 \u062f\u06cc\u0648\u0627\u0631 \u063a\u06cc\u0631\u0642\u0627\u0628\u0644\u200c\u0639\u0628\u0648\u0631 \u0628\u0631\u062f\u0627\u0634\u062a \u06a9\u0646\u06cc\u0645. \u0647\u062f\u0641 \u0648\u0627\u0642\u0639\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u062d\u0645\u0644\u0647 \u0631\u0648 \u0633\u062e\u062a\u200c\u062a\u0631\u060c \u067e\u0631\u0647\u0632\u06cc\u0646\u0647\u200c\u062a\u0631 \u0648 \u0642\u0627\u0628\u0644\u200c\u0634\u0646\u0627\u0633\u0627\u06cc\u06cc\u200c\u062a\u0631 \u06a9\u0646\u06cc\u0645 \u0648 \u0645\u0647\u0645\u200c\u062a\u0631 \u0627\u0632 \u0647\u0645\u0647\u060c \u0627\u062c\u0627\u0632\u0647 \u0646\u062f\u06cc\u0645 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc \u06a9\u0644\u0627\u06cc\u0646\u062a \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u0628\u0627\u0639\u062b \u062f\u0633\u062a\u0631\u0633\u06cc \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0628\u0634\u0647. \u06cc\u0639\u0646\u06cc \u062d\u062a\u06cc \u0627\u06af\u0647 \u0645\u0647\u0627\u062c\u0645 \u062f\u06a9\u0645\u0647\u200c\u0627\u06cc \u0631\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f \u06cc\u0627 \u0646\u062a\u06cc\u062c\u0647 \u06cc\u06a9 \u0634\u0631\u0637 \u0631\u0648 \u0639\u0648\u0636 \u06a9\u0631\u062f\u060c \u0633\u0631\u0648\u0631 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0627\u06cc\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0645\u0633\u062a\u0642\u0644 \u0628\u0631\u0631\u0633\u06cc \u0648 \u062f\u0631 \u0635\u0648\u0631\u062a \u0646\u0627\u0645\u0639\u062a\u0628\u0631 \u0628\u0648\u062f\u0646 \u0631\u062f \u06a9\u0646\u0647. Play Integrity API \u0647\u0645 \u062e\u0648\u062f\u0634 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0628\u062e\u0634\u06cc \u0627\u0632 \u06cc\u06a9 \u0631\u0627\u0647\u0628\u0631\u062f \u0686\u0646\u062f\u0644\u0627\u06cc\u0647 \u0645\u0639\u0631\u0641\u06cc \u0634\u062f\u0647 \u0648 \u06af\u0648\u06af\u0644 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0646\u062a\u06cc\u062c\u0647 \u0627\u0648\u0646 \u062a\u0646\u0647\u0627 \u0645\u0639\u06cc\u0627\u0631 \u062f\u0641\u0627\u0639\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062e\u0637\u0631 \u0627\u0635\u0644\u06cc Hook \u0628\u0631\u0627\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0686\u06cc\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0645\u0645\u06a9\u0646\u0647 Hook \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0645\u062e\u062a\u0644\u0641\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0634\u0647. \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 Interceptor \u0634\u0628\u06a9\u0647 \u0631\u0648 Hook \u06a9\u0646\u0647 \u0648 \u0642\u0628\u0644 \u0627\u0632 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc\u060c \u062a\u0648\u06a9\u0646 \u06cc\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0628\u062e\u0648\u0646\u0647. \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0645\u062a\u062f \u0645\u062d\u0627\u0633\u0628\u0647 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647 \u0648 \u062a\u0635\u0648\u0631 \u06a9\u0646\u0647 \u0642\u0627\u0628\u0644\u06cc\u062a \u067e\u0648\u0644\u06cc \u0628\u0631\u0627\u0634 \u0641\u0639\u0627\u0644 \u0634\u062f\u0647. \u062d\u062a\u06cc \u0645\u0645\u06a9\u0646\u0647 \u067e\u0627\u0631\u0627\u0645\u062a\u0631 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u062f\u0631\u0633\u062a \u0642\u0628\u0644 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647\u061b \u0645\u062b\u0644\u0627\u064b \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631\u060c \u0634\u0646\u0627\u0633\u0647 \u0647\u0634\u062f\u0627\u0631 \u0642\u06cc\u0645\u062a \u06cc\u0627 \u062a\u0639\u062f\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0645\u062c\u0627\u0632 \u0631\u0648 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc \u06a9\u0646\u0647. \u0627\u06af\u0647 \u0633\u0631\u0648\u0631 \u0628\u0647 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0627\u0631\u0633\u0627\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u0646\u0647\u060c \u06cc\u06a9 Hook \u06a9\u0648\u0686\u06a9 \u0631\u0648\u06cc \u06a9\u0644\u0627\u06cc\u0646\u062a \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u062c\u062f\u06cc \u0645\u0646\u062c\u0631 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0627\u0648\u0644\u06cc\u0646 \u062f\u0641\u0627\u0639 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 Hook \u0627\u0635\u0644\u0627\u064b \u062f\u0627\u062e\u0644 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0646\u06cc\u0633\u062a\u061b \u0631\u0648\u06cc \u0633\u0631\u0648\u0631\u0647. \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0627\u0632 \u0631\u0648\u06cc Access Token \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u06a9\u0646\u0647\u060c \u0645\u0627\u0644\u06a9\u06cc\u062a \u0647\u0631 \u062f\u0627\u062f\u0647 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647 \u0648 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc \u067e\u0644\u0646 \u0631\u0648 \u0628\u0631\u0627\u0633\u0627\u0633 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062e\u0648\u062f\u0634 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 \u062a\u0639\u06cc\u06cc\u0646 \u06a9\u0646\u0647 \u06a9\u0627\u0631\u0628\u0631 Premium \u0627\u0633\u062a \u06cc\u0627 \u0627\u062c\u0627\u0632\u0647 \u062d\u0630\u0641 \u0647\u0634\u062f\u0627\u0631 \u0634\u0645\u0627\u0631\u0647 \u06f8\u06f2\u06f5 \u0631\u0648 \u062f\u0627\u0631\u0647. \u0627\u067e \u0641\u0642\u0637 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647 \u0648 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f\u0634 \u062a\u0635\u0645\u06cc\u0645 \u0646\u0647\u0627\u06cc\u06cc \u0631\u0648 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0645\u0646\u0637\u0642 \u0646\u0627\u0627\u0645\u0646 \u0627\u0633\u062a:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class CreateAlertRequest(\n    val userId: Long,\n    val productId: Long,\n    val isPremium: Boolean\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">CreateAlertRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> userId: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> productId: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> isPremium: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0686\u0648\u0646 \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627 \u0645\u0642\u062f\u0627\u0631 <code>userId<\/code> \u06cc\u0627 <code>isPremium<\/code> \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647. \u0645\u062f\u0644 \u0628\u0647\u062a\u0631 \u0641\u0642\u0637 \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u0631\u0648 \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647 \u06a9\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0627\u06cc\u062f \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u0628\u0634\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class CreateAlertRequest(\n    val productId: Long,\n    val targetPrice: Long\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">CreateAlertRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> productId: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> targetPrice: <\/span><span style=\"color: #6F42C1\">Long<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a \u0633\u0631\u0648\u0631 \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0627\u0632 \u062a\u0648\u06a9\u0646 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0648\u0636\u0639\u06cc\u062a Premium \u0631\u0648 \u0647\u0645 \u0627\u0632 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062e\u0648\u062f\u0634 \u0645\u06cc\u200c\u062e\u0648\u0646\u0647. \u062d\u062a\u06cc \u0627\u06af\u0647 \u0645\u0647\u0627\u062c\u0645 \u0645\u062f\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 Hook \u06a9\u0646\u0647\u060c \u0646\u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 Boolean \u062e\u0648\u062f\u0634 \u0631\u0648 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u067e\u0648\u0644\u06cc \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647 \u0646\u0633\u062e\u0647 Release \u0631\u0648 \u0633\u062e\u062a\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0633\u0627\u062f\u0647\u200c\u062a\u0631\u06cc\u0646 \u06a9\u0627\u0631\u0647\u0627 \u0628\u0631\u0627\u06cc \u0628\u0627\u0644\u0627 \u0628\u0631\u062f\u0646 \u0647\u0632\u06cc\u0646\u0647 \u0645\u0647\u0646\u062f\u0633\u06cc \u0645\u0639\u06a9\u0648\u0633\u060c \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 R8 \u062f\u0631 \u0646\u0633\u062e\u0647 Release \u0627\u0633\u062a. R8 \u06a9\u062f\u0647\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u200c\u0646\u0634\u062f\u0647 \u0631\u0648 \u062d\u0630\u0641 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0646\u0627\u0645 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u06a9\u0644\u0627\u0633\u200c\u0647\u0627 \u0648 \u0645\u062a\u062f\u0647\u0627 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u062f\u0647 \u0648 \u0633\u0627\u062e\u062a\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0628\u0631\u0627\u06cc \u062a\u062d\u0644\u06cc\u0644\u200c\u06af\u0631 \u0646\u0627\u062e\u0648\u0627\u0646\u0627\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u06cc\u0646 \u06a9\u0627\u0631 Hook \u0631\u0648 \u0645\u062a\u0648\u0642\u0641 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 \u0645\u062a\u062f\u06cc \u0645\u062b\u0644 <code>isDeviceSafe<\/code> \u0631\u0648 \u0633\u062e\u062a\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0686\u0648\u0646 \u0645\u0645\u06a9\u0646\u0647 \u0628\u0639\u062f \u0627\u0632 Obfuscation \u0646\u0627\u0645 \u0627\u0648\u0646 \u0628\u0647 \u0686\u06cc\u0632\u06cc \u0645\u062b\u0644 <code>a<\/code> \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>android {\n    buildTypes {\n        release {\n            isMinifyEnabled = true\n            isShrinkResources = true\n\n            proguardFiles(\n                getDefaultProguardFile(\n                    \"proguard-android-optimize.txt\"\n                ),\n                \"proguard-rules.pro\"\n            )\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">android<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">buildTypes<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">release<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            isMinifyEnabled <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            isShrinkResources <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">proguardFiles<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">getDefaultProguardFile<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #032F62\">&quot;proguard-android-optimize.txt&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;proguard-rules.pro&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0644\u0628\u062a\u0647 \u0645\u0647\u0627\u062c\u0645 \u062d\u0631\u0641\u0647\u200c\u0627\u06cc \u0641\u0642\u0637 \u0628\u0647 \u0627\u0633\u0645 \u0645\u062a\u062f\u0647\u0627 \u0648\u0627\u0628\u0633\u062a\u0647 \u0646\u06cc\u0633\u062a \u0648 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u0633\u06cc\u0631 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u06cc\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0634\u0628\u06a9\u0647\u060c \u0628\u062e\u0634 \u0645\u0648\u0631\u062f\u0646\u0638\u0631 \u0631\u0648 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0647. \u067e\u0633 Obfuscation \u06cc\u06a9 \u0644\u0627\u06cc\u0647 \u062a\u0623\u062e\u06cc\u0631\u06cc\u0647\u060c \u0646\u0647 \u06cc\u06a9 \u0645\u0631\u0632 \u0627\u0645\u0646\u06cc\u062a\u06cc. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0646\u0628\u0627\u06cc\u062f \u0628\u0627 Rule\u0647\u0627\u06cc \u0628\u06cc\u0634 \u0627\u0632 \u062d\u062f \u06af\u0633\u062a\u0631\u062f\u0647 \u0647\u0645\u0647 \u06a9\u0644\u0627\u0633\u200c\u0647\u0627 \u0631\u0648 \u0627\u0632 Obfuscation \u062e\u0627\u0631\u062c \u06a9\u0646\u06cc\u0645\u060c \u0686\u0648\u0646 \u062f\u0631 \u0627\u0648\u0646 \u0635\u0648\u0631\u062a \u0628\u062e\u0634 \u0628\u0632\u0631\u06af\u06cc \u0627\u0632 \u0641\u0627\u06cc\u062f\u0647 R8 \u0627\u0632 \u0628\u06cc\u0646 \u0645\u06cc\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062b\u0644\u0627\u064b \u0627\u06cc\u0646 Rule \u0639\u0645\u0644\u0627\u064b \u062a\u0645\u0627\u0645 \u06a9\u062f \u067e\u0631\u0648\u0698\u0647 \u0631\u0648 \u0628\u0627 \u0646\u0627\u0645 \u0627\u0635\u0644\u06cc \u0646\u06af\u0647 \u0645\u06cc\u200c\u062f\u0627\u0631\u0647 \u0648 \u0627\u0646\u062a\u062e\u0627\u0628 \u062e\u0648\u0628\u06cc \u0646\u06cc\u0633\u062a:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>-keep class com.example.gheimatban.** { *; }\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">keep <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com<\/span><span style=\"color: #24292E\">.example.gheimatban.<\/span><span style=\"color: #D73A49\">**<\/span><span style=\"color: #24292E\"> { <\/span><span style=\"color: #D73A49\">*<\/span><span style=\"color: #24292E\">; }<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647\u062a\u0631\u0647 \u0641\u0642\u0637 \u06a9\u0644\u0627\u0633\u200c\u0647\u0627\u06cc\u06cc \u0631\u0648 \u0646\u06af\u0647 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u06cc\u0627 Serialization \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0646\u0627\u0645 \u0648 \u0633\u0627\u062e\u062a\u0627\u0631 \u0627\u0648\u0646\u200c\u0647\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0647. \u0627\u06af\u0647 \u0627\u0632 Retrofit \u0648 Gson \u06cc\u0627 Moshi \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c Rule\u0647\u0627 \u0628\u0627\u06cc\u062f \u0645\u062d\u062f\u0648\u062f \u0648 \u0628\u0631\u0627\u0633\u0627\u0633 \u0646\u06cc\u0627\u0632 \u0648\u0627\u0642\u0639\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0628\u0634\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Debuggable \u0646\u0628\u0627\u06cc\u062f \u062f\u0631 \u0646\u0633\u062e\u0647 \u0627\u0646\u062a\u0634\u0627\u0631 \u0641\u0639\u0627\u0644 \u0628\u0627\u0634\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0646\u0627\u0645\u0647 Debuggable \u0627\u0645\u06a9\u0627\u0646 \u0627\u062a\u0635\u0627\u0644 Debugger \u0648 \u0628\u0639\u0636\u06cc \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u062a\u062d\u0644\u06cc\u0644 \u0631\u0648 \u0633\u0627\u062f\u0647\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. Gradle \u062f\u0631 \u062d\u0627\u0644\u062a \u0639\u0627\u062f\u06cc \u0646\u0633\u062e\u0647 Debug \u0631\u0648 \u0628\u0627 \u0642\u0627\u0628\u0644\u06cc\u062a Debug \u0648 \u0646\u0633\u062e\u0647 Release \u0631\u0648 \u0628\u062f\u0648\u0646 \u0627\u0648\u0646 \u0645\u06cc\u200c\u0633\u0627\u0632\u0647\u060c \u0627\u0645\u0627 \u0645\u0645\u06a9\u0646\u0647 \u0628\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0627\u0634\u062a\u0628\u0627\u0647 Manifest \u06cc\u0627 Build Type\u060c \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0646\u0627\u062e\u0648\u0627\u0633\u062a\u0647 \u062f\u0631 \u0646\u0633\u062e\u0647 \u0646\u0647\u0627\u06cc\u06cc \u0641\u0639\u0627\u0644 \u0628\u0645\u0648\u0646\u0647. \u0628\u0647\u062a\u0631\u0647 \u0647\u06cc\u0686\u200c\u0648\u0642\u062a <code>android:debuggable=\"true\"<\/code> \u0631\u0648 \u0628\u0647 \u0635\u0648\u0631\u062a \u062b\u0627\u0628\u062a \u062f\u0627\u062e\u0644 Manifest \u0642\u0631\u0627\u0631 \u0646\u062f\u06cc\u0645.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0633\u062e\u0647 \u062f\u0631\u0633\u062a Manifest \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0627\u0635\u0644\u0627\u064b \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0631\u0648 \u0645\u0634\u062e\u0635 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;application\n    android:name=\".GheimatBanApplication\"\n    android:theme=\"@style\/Theme.GheimatBan\">\n\n    &lt;!-- Activities -->\n\n&lt;\/application>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">name<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;.GheimatBanApplication&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">theme<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;@style\/Theme.GheimatBan&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;!--<\/span><span style=\"color: #24292E\"> Activities <\/span><span style=\"color: #D73A49\">--&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">application<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0635\u0648\u0631\u062a \u0646\u06cc\u0627\u0632 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627 \u0647\u0645 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u0622\u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 Debuggable \u0627\u0633\u062a \u06cc\u0627 \u0646\u0647. \u0627\u06cc\u0646 \u0628\u0631\u0631\u0633\u06cc \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u0636\u062f Hook \u0646\u06cc\u0633\u062a\u060c \u0627\u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062c\u0644\u0648\u06cc \u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0634\u062a\u0628\u0627\u0647 \u0646\u0633\u062e\u0647 Debug \u0631\u0648 \u0628\u06af\u06cc\u0631\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun Context.isAppDebuggable(): Boolean {\n    return applicationInfo.flags and\n        ApplicationInfo.FLAG_DEBUGGABLE != 0\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">isAppDebuggable<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> applicationInfo.flags and<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ApplicationInfo.FLAG_DEBUGGABLE <\/span><span style=\"color: #D73A49\">!=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062b\u0644\u0627\u064b \u062f\u0631 \u0646\u0633\u062e\u0647 Release \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0686\u0646\u06cc\u0646 \u0648\u0636\u0639\u06cc\u062a \u0627\u0634\u062a\u0628\u0627\u0647\u06cc \u0631\u0648 \u06af\u0632\u0627\u0631\u0634 \u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>if (!BuildConfig.DEBUG &amp;&amp; applicationContext.isAppDebuggable()) {\n    securityReporter.report(\n        SecurityEvent.UnexpectedDebuggableBuild\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #24292E\">BuildConfig.DEBUG <\/span><span style=\"color: #D73A49\">&amp;&amp;<\/span><span style=\"color: #24292E\"> applicationContext.<\/span><span style=\"color: #6F42C1\">isAppDebuggable<\/span><span style=\"color: #24292E\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    securityReporter.<\/span><span style=\"color: #6F42C1\">report<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        SecurityEvent.UnexpectedDebuggableBuild<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0628\u0627\u06cc\u062f \u0627\u0646\u062a\u0638\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645 \u06a9\u0647 \u0645\u0647\u0627\u062c\u0645 \u0646\u062a\u0648\u0646\u0647 \u0646\u062a\u06cc\u062c\u0647 \u0647\u0645\u06cc\u0646 \u0645\u062a\u062f \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647. \u0627\u0631\u0632\u0634 \u0627\u0635\u0644\u06cc \u0627\u06cc\u0646 \u0628\u0631\u0631\u0633\u06cc\u060c \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 \u062e\u0637\u0627\u0647\u0627\u06cc \u0628\u0633\u062a\u0647\u200c\u0628\u0646\u062f\u06cc \u0648 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0633\u06cc\u06af\u0646\u0627\u0644 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0627\u0636\u0627\u0641\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0634\u062e\u06cc\u0635 \u0627\u062a\u0635\u0627\u0644 Debugger<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0646\u062f\u0631\u0648\u06cc\u062f API \u0633\u0627\u062f\u0647\u200c\u0627\u06cc \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0627\u062a\u0635\u0627\u0644 Debugger \u062f\u0627\u0631\u0647. \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0627\u0646\u062c\u0627\u0645 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u062d\u0633\u0627\u0633 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u0622\u06cc\u0627 Debugger \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u062a\u0635\u0644 \u0634\u062f\u0647 \u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0646\u062a\u0638\u0631 \u0627\u062a\u0635\u0627\u0644 Debugger \u0627\u0633\u062a.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import android.os.Debug\n\nfun isDebuggerAttached(): Boolean {\n    return Debug.isDebuggerConnected() ||\n        Debug.waitingForDebugger()\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.os.Debug<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">isDebuggerAttached<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> Debug.<\/span><span style=\"color: #6F42C1\">isDebuggerConnected<\/span><span style=\"color: #24292E\">() <\/span><span style=\"color: #D73A49\">||<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Debug.<\/span><span style=\"color: #6F42C1\">waitingForDebugger<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0646\u062a\u06cc\u062c\u0647 \u0631\u0648 \u062f\u0627\u062e\u0644 \u06cc\u06a9 \u0627\u0631\u0632\u06cc\u0627\u0628\u06cc \u0686\u0646\u062f\u0644\u0627\u06cc\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>if (isDebuggerAttached()) {\n    securityReporter.report(\n        SecurityEvent.DebuggerDetected\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #6F42C1\">isDebuggerAttached<\/span><span style=\"color: #24292E\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    securityReporter.<\/span><span style=\"color: #6F42C1\">report<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        SecurityEvent.DebuggerDetected<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u06a9\u062f \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u0628\u0627\u0639\u062b \u0628\u0633\u062a\u0647 \u0634\u062f\u0646 \u0641\u0648\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0634\u0647. \u0645\u0645\u06a9\u0646\u0647 \u062f\u0631 \u0646\u0633\u062e\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062e\u0648\u062f \u062a\u06cc\u0645\u060c \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u062a\u0633\u062a \u06cc\u0627 \u0628\u0639\u0636\u06cc \u0645\u062d\u06cc\u0637\u200c\u0647\u0627\u06cc \u062e\u0627\u0635 Debugger \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0627\u0632 \u0637\u0631\u0641 \u062f\u06cc\u06af\u0631\u060c \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0646\u062a\u06cc\u062c\u0647 <code>Debug.isDebuggerConnected<\/code> \u06cc\u0627 \u0645\u062a\u062f <code>isDebuggerAttached<\/code> \u0631\u0648 Hook \u06a9\u0646\u0647 \u0648 \u0647\u0645\u06cc\u0634\u0647 <code>false<\/code> \u0628\u0631\u06af\u0631\u062f\u0648\u0646\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06cc\u0646 \u0641\u0642\u0637 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u0647 \u0627\u0633\u062a \u0648 \u0628\u0627\u06cc\u062f \u06a9\u0646\u0627\u0631 \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0628\u0631\u0631\u0633\u06cc \u0627\u0645\u0636\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc \u06cc\u06a9 \u0645\u0647\u0627\u062c\u0645 APK \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u062f\u0647 \u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0633\u062a\u0647\u200c\u0628\u0646\u062f\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0646\u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0648\u0646 \u0631\u0648 \u0628\u0627 \u06a9\u0644\u06cc\u062f \u0627\u0635\u0644\u06cc \u0627\u0646\u062a\u0634\u0627\u0631 \u0645\u0627 \u0627\u0645\u0636\u0627 \u06a9\u0646\u0647\u061b \u0645\u06af\u0631 \u0627\u06cc\u0646\u06a9\u0647 \u06a9\u0644\u06cc\u062f \u0627\u0645\u0636\u0627\u06cc \u0645\u0627 \u0647\u0645 \u0627\u0641\u0634\u0627 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647. \u067e\u0633 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0647\u0634 Certificate \u0627\u0645\u0636\u0627\u06cc \u0646\u0633\u062e\u0647 \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u0631\u0648 \u0628\u0627 \u0645\u0642\u062f\u0627\u0631 \u0645\u0648\u0631\u062f\u0627\u0646\u062a\u0638\u0627\u0631 \u0645\u0642\u0627\u06cc\u0633\u0647 \u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631\u0627\u06cc \u062a\u0634\u062e\u06cc\u0635 <strong>Repackaging<\/strong> \u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0641\u0627\u06cc\u0644 APK \u06a9\u0627\u0631\u0628\u0631\u062f \u062f\u0627\u0631\u0647\u060c \u0646\u0647 Hook \u062e\u0627\u0644\u0635 \u0631\u0648\u06cc \u0646\u0633\u062e\u0647 \u0627\u0635\u0644\u06cc\u060c \u0627\u0645\u0627 \u0686\u0648\u0646 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u062d\u0645\u0644\u0627\u062a Hook \u0628\u0627 \u0646\u0633\u062e\u0647 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u06cc\u0627 Loader \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0647\u0645\u0631\u0627\u0647 \u0645\u06cc\u0634\u0646\u060c \u0633\u06cc\u06af\u0646\u0627\u0644 \u0645\u0641\u06cc\u062f\u06cc \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u062e\u0648\u0627\u0646\u062f\u0646 \u0647\u0634 SHA-256 \u06af\u0648\u0627\u0647\u06cc \u0627\u0645\u0636\u0627 \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import android.content.Context\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport android.util.Base64\nimport java.security.MessageDigest\n\nfun Context.getSigningCertificateHashes(): Set&lt;String> {\n    val packageInfo =\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            packageManager.getPackageInfo(\n                packageName,\n                PackageManager.GET_SIGNING_CERTIFICATES\n            )\n        } else {\n            @Suppress(\"DEPRECATION\")\n            packageManager.getPackageInfo(\n                packageName,\n                PackageManager.GET_SIGNATURES\n            )\n        }\n\n    val signatures =\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            val signingInfo = packageInfo.signingInfo\n\n            if (signingInfo.hasMultipleSigners()) {\n                signingInfo.apkContentsSigners\n            } else {\n                signingInfo.signingCertificateHistory\n            }\n        } else {\n            @Suppress(\"DEPRECATION\")\n            packageInfo.signatures\n        }\n\n    return signatures.map { signature ->\n        val digest =\n            MessageDigest.getInstance(\"SHA-256\")\n                .digest(signature.toByteArray())\n\n        Base64.encodeToString(\n            digest,\n            Base64.NO_WRAP\n        )\n    }.toSet()\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.content.Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.content.pm.PackageManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.os.Build<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.util.Base64<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">java.security.MessageDigest<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">getSigningCertificateHashes<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Set<\/span><span style=\"color: #24292E\">&lt;<\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> packageInfo <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (Build.VERSION.SDK_INT <\/span><span style=\"color: #D73A49\">&gt;=<\/span><span style=\"color: #24292E\"> Build.VERSION_CODES.P) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            packageManager.<\/span><span style=\"color: #6F42C1\">getPackageInfo<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                packageName,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                PackageManager.GET_SIGNING_CERTIFICATES<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        } <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">@Suppress<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;DEPRECATION&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            packageManager.<\/span><span style=\"color: #6F42C1\">getPackageInfo<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                packageName,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                PackageManager.GET_SIGNATURES<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> signatures <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (Build.VERSION.SDK_INT <\/span><span style=\"color: #D73A49\">&gt;=<\/span><span style=\"color: #24292E\"> Build.VERSION_CODES.P) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> signingInfo <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> packageInfo.signingInfo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (signingInfo.<\/span><span style=\"color: #6F42C1\">hasMultipleSigners<\/span><span style=\"color: #24292E\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                signingInfo.apkContentsSigners<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            } <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                signingInfo.signingCertificateHistory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        } <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">@Suppress<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;DEPRECATION&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            packageInfo.signatures<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> signatures.<\/span><span style=\"color: #6F42C1\">map<\/span><span style=\"color: #24292E\"> { signature <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> digest <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            MessageDigest.<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;SHA-256&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">digest<\/span><span style=\"color: #24292E\">(signature.<\/span><span style=\"color: #6F42C1\">toByteArray<\/span><span style=\"color: #24292E\">())<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Base64.<\/span><span style=\"color: #6F42C1\">encodeToString<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            digest,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Base64.NO_WRAP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }.<\/span><span style=\"color: #6F42C1\">toSet<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f Certificate\u0647\u0627\u06cc \u0645\u062c\u0627\u0632 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>private const val RELEASE_CERTIFICATE_SHA256 =\n    \"EXPECTED_BASE64_SHA256_HASH\"\n\nfun Context.hasExpectedSignature(): Boolean {\n    return RELEASE_CERTIFICATE_SHA256 in\n        getSigningCertificateHashes()\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> RELEASE_CERTIFICATE_SHA256 <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;EXPECTED_BASE64_SHA256_HASH&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">hasExpectedSignature<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> RELEASE_CERTIFICATE_SHA256 <\/span><span style=\"color: #D73A49\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">getSigningCertificateHashes<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u0642\u062f\u0627\u0631 \u0648\u0627\u0642\u0639\u06cc \u0628\u0627\u06cc\u062f \u0627\u0632 Certificate \u0631\u0633\u0645\u06cc \u0646\u0633\u062e\u0647 Release \u06af\u0631\u0641\u062a\u0647 \u0628\u0634\u0647\u060c \u0646\u0647 \u0627\u06cc\u0646\u06a9\u0647 \u0645\u0642\u062f\u0627\u0631 \u0646\u0645\u0648\u0646\u0647 \u062f\u0627\u062e\u0644 \u06a9\u062f \u0628\u0627\u0642\u06cc \u0628\u0645\u0648\u0646\u0647. \u0627\u06af\u0647 Play App Signing \u0641\u0639\u0627\u0644 \u0628\u0627\u0634\u0647\u060c \u0628\u0627\u06cc\u062f Certificate \u0627\u0645\u0636\u0627\u06cc\u06cc \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 Google Play \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0631\u0627\u06cc \u0646\u0633\u062e\u0647 \u062a\u0648\u0632\u06cc\u0639\u200c\u0634\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0646\u0647 Upload Certificate \u0645\u062d\u0644\u06cc. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u0627\u06cc\u0646 \u06a9\u0646\u062a\u0631\u0644 \u0647\u0645 \u062f\u0627\u062e\u0644 APK \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u0647 \u0648 \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0645\u0642\u062f\u0627\u0631 \u0645\u0648\u0631\u062f\u0627\u0646\u062a\u0638\u0627\u0631\u060c \u0634\u0631\u0637 \u06cc\u0627 \u0646\u062a\u06cc\u062c\u0647 \u062a\u0627\u0628\u0639 \u0631\u0648 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc \u06a9\u0646\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0631\u0631\u0633\u06cc \u0633\u0645\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a \u0631\u0648 \u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u06cc\u06a9 \u0644\u0627\u06cc\u0647 \u0627\u0648\u0644\u06cc\u0647 \u0628\u062f\u0648\u0646\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Play Integrity \u0627\u0632 \u0628\u0631\u0631\u0633\u06cc \u0645\u062d\u0644\u06cc \u0642\u0627\u0628\u0644\u200c\u0627\u0639\u062a\u0645\u0627\u062f\u062a\u0631\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0642\u0648\u06cc\u200c\u062a\u0631 \u0627\u0635\u0627\u0644\u062a \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u06af\u0648\u06af\u0644 <strong>Play Integrity API<\/strong> \u0631\u0648 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u062f\u0647. \u0627\u06cc\u0646 API \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u06a9\u0645\u06a9 \u06a9\u0646\u0647 \u062a\u0634\u062e\u06cc\u0635 \u0628\u062f\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0632 \u0646\u0633\u062e\u0647\u200c\u0627\u06cc \u0627\u0648\u0645\u062f\u0647 \u06a9\u0647 Google Play \u0627\u0648\u0646 \u0631\u0648 \u0645\u06cc\u200c\u0634\u0646\u0627\u0633\u0647\u060c \u0628\u0627 Certificate \u0645\u0648\u0631\u062f\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0645\u0636\u0627 \u0634\u062f\u0647 \u0648 \u0631\u0648\u06cc \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0642\u0627\u0628\u0644\u200c\u0627\u0639\u062a\u0645\u0627\u062f\u062a\u0631 \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647. \u0646\u062a\u06cc\u062c\u0647 <code>appIntegrity<\/code> \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0645\u0634\u062e\u0635 \u06a9\u0646\u0647 \u0622\u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0646\u0634\u062f\u0647 \u0648 \u0634\u0646\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 Google Play \u0627\u0633\u062a \u06cc\u0627 \u0646\u0647. \u062a\u0635\u0645\u06cc\u0645 \u0627\u0635\u0644\u06cc \u0647\u0645 \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc Backend \u06af\u0631\u0641\u062a\u0647 \u0628\u0634\u0647\u060c \u0646\u0647 \u0627\u06cc\u0646\u06a9\u0647 \u0627\u067e \u062a\u0648\u06a9\u0646 Integrity \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u0647 \u0648 \u062e\u0648\u062f\u0634 \u0646\u062a\u06cc\u062c\u0647 \u0646\u0647\u0627\u06cc\u06cc \u0631\u0648 \u0627\u0639\u0644\u0627\u0645 \u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0648\u0646\u062f \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0628\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0646\u0627\u0645\u0647 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u062d\u0633\u0627\u0633 \u0631\u0648 \u0622\u0645\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647<br>\u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0632 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0645\u0647\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Hash \u0645\u06cc\u200c\u0633\u0627\u0632\u0647<br>Play Integrity \u06cc\u06a9 \u062a\u0648\u06a9\u0646 \u0627\u0645\u0636\u0627\u0634\u062f\u0647 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0648\u0646\u0647<br>\u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648 \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0628\u0631\u0627\u06cc Backend \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u0647<br>Backend \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0633\u0631\u0648\u06cc\u0633 \u06af\u0648\u06af\u0644 Decode \u0645\u06cc\u200c\u06a9\u0646\u0647<br>Backend \u0646\u062a\u06cc\u062c\u0647 Integrity \u0648 Hash \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647<br>Backend \u0627\u062c\u0627\u0632\u0647 \u06cc\u0627 \u0639\u062f\u0645 \u0627\u062c\u0627\u0632\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0648 \u062a\u0639\u06cc\u06cc\u0646 \u0645\u06cc\u200c\u06a9\u0646\u0647<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u062a\u0641\u0627\u0648\u062a \u062e\u06cc\u0644\u06cc \u0645\u0647\u0645\u0647. \u0627\u06af\u0647 \u0641\u0642\u0637 \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645 \u00ab\u062f\u0631 \u0635\u0648\u0631\u062a \u0645\u0639\u062a\u0628\u0631 \u0628\u0648\u062f\u0646 Integrity \u0627\u062f\u0627\u0645\u0647 \u0628\u062f\u0647\u00bb\u060c \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0647\u0645\u06cc\u0646 \u0634\u0631\u0637 \u0631\u0648 Hook \u06a9\u0646\u0647. \u0627\u0645\u0627 \u0648\u0642\u062a\u06cc \u062a\u0648\u06a9\u0646 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0645\u06cc\u0631\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0646 \u06cc\u06a9 \u0634\u0631\u0637 \u0645\u062d\u0644\u06cc \u06a9\u0627\u0641\u06cc \u0646\u06cc\u0633\u062a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Play Integrity \u0631\u0648 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f Play Integrity API \u0631\u0648 \u062f\u0631 Play Console \u0641\u0639\u0627\u0644 \u0648 \u067e\u0631\u0648\u0698\u0647 Google Cloud \u0631\u0648 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u062a\u0635\u0644 \u06a9\u0646\u06cc\u0645. \u0628\u0639\u062f \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0631\u0633\u0645\u06cc \u0631\u0648 \u0628\u0647 \u0645\u0627\u0698\u0648\u0644 \u0627\u067e \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0634\u0645\u0627\u0631\u0647 \u0646\u0633\u062e\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0645\u0645\u06a9\u0646\u0647 \u0628\u0627 \u06af\u0630\u0634\u062a \u0632\u0645\u0627\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u0647\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0627\u06cc\u062f \u0646\u0633\u062e\u0647 \u062c\u0627\u0631\u06cc \u0631\u0648 \u0627\u0632 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0631\u0633\u0645\u06cc \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>dependencies {\n    implementation(\n        \"com.google.android.play:integrity:CURRENT_VERSION\"\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">dependencies<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">implementation<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #032F62\">&quot;com.google.android.play:integrity:CURRENT_VERSION&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc Standard Request \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 Provider \u0622\u0645\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u0622\u0645\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0628\u0647\u062a\u0631\u0647 \u0632\u0648\u062f\u062a\u0631 \u0627\u0632 \u0644\u062d\u0638\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u062d\u0633\u0627\u0633 \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647 \u062a\u0627 \u0647\u0646\u06af\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0635\u0644\u06cc \u062a\u0623\u062e\u06cc\u0631 \u06a9\u0645\u062a\u0631\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import android.content.Context\nimport com.google.android.play.core.integrity.IntegrityManagerFactory\nimport com.google.android.play.core.integrity.StandardIntegrityManager\n\nclass IntegrityTokenProvider(\n    context: Context,\n    private val cloudProjectNumber: Long\n) {\n\n    private val integrityManager =\n        IntegrityManagerFactory\n            .createStandard(context)\n\n    private var tokenProvider:\n        StandardIntegrityManager.StandardIntegrityTokenProvider? = null\n\n    fun prepare(\n        onSuccess: () -> Unit,\n        onError: (Throwable) -> Unit\n    ) {\n        val request =\n            StandardIntegrityManager\n                .PrepareIntegrityTokenRequest\n                .builder()\n                .setCloudProjectNumber(\n                    cloudProjectNumber\n                )\n                .build()\n\n        integrityManager\n            .prepareIntegrityToken(request)\n            .addOnSuccessListener { provider ->\n                tokenProvider = provider\n                onSuccess()\n            }\n            .addOnFailureListener(onError)\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.content.Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.google.android.play.core.integrity.IntegrityManagerFactory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.google.android.play.core.integrity.StandardIntegrityManager<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">IntegrityTokenProvider<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    context: <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> cloudProjectNumber: <\/span><span style=\"color: #6F42C1\">Long<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> integrityManager <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        IntegrityManagerFactory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">createStandard<\/span><span style=\"color: #24292E\">(context)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">var<\/span><span style=\"color: #24292E\"> tokenProvider:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        StandardIntegrityManager.StandardIntegrityTokenProvider? <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">prepare<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        onSuccess: () <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> Unit,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        onError: (<\/span><span style=\"color: #6F42C1\">Throwable<\/span><span style=\"color: #24292E\">) -&gt; <\/span><span style=\"color: #6F42C1\">Unit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> request <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            StandardIntegrityManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .PrepareIntegrityTokenRequest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">setCloudProjectNumber<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    cloudProjectNumber<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        integrityManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">prepareIntegrityToken<\/span><span style=\"color: #24292E\">(request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">addOnSuccessListener<\/span><span style=\"color: #24292E\"> { provider <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                tokenProvider <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> provider<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">onSuccess<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">addOnFailureListener<\/span><span style=\"color: #24292E\">(onError)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0634\u0645\u0627\u0631\u0647 Cloud Project \u0645\u062d\u0631\u0645\u0627\u0646\u0647 \u0645\u062d\u0633\u0648\u0628 \u0646\u0645\u06cc\u0634\u0647 \u0648 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0627\u0645\u0646\u06cc\u062a \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u067e\u0627\u0633\u062e \u0627\u0645\u0636\u0627\u0634\u062f\u0647 \u06af\u0648\u06af\u0644 \u0648 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0627\u0648\u0646 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631\u0647\u060c \u0646\u0647 \u0645\u062e\u0641\u06cc \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0634\u0645\u0627\u0631\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0628\u0647 \u0646\u062a\u06cc\u062c\u0647 Integrity \u0645\u062a\u0635\u0644 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u062f \u06cc\u06a9 \u0647\u0634\u062f\u0627\u0631 \u0642\u06cc\u0645\u062a \u0628\u0627\u0627\u0631\u0632\u0634 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0647. \u0646\u0628\u0627\u06cc\u062f \u06cc\u06a9 Integrity Token \u0639\u0645\u0648\u0645\u06cc \u0628\u06af\u06cc\u0631\u06cc\u0645 \u0648 \u0628\u0631\u0627\u06cc \u0686\u0646\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u062e\u062a\u0644\u0641 \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. \u0628\u0647\u062a\u0631\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0647\u0645 \u0647\u0645\u0648\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0628\u0627 \u062a\u0631\u062a\u06cc\u0628 \u062b\u0627\u0628\u062a Serialize \u06a9\u0646\u06cc\u0645\u060c \u0627\u0632 \u0627\u0648\u0646 SHA-256 \u0628\u06af\u06cc\u0631\u06cc\u0645 \u0648 Hash \u0631\u0648 \u062f\u0627\u062e\u0644 <code>requestHash<\/code> \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645. \u062f\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u062a\u0648\u06a9\u0646 Integrity \u0641\u0642\u0637 \u0628\u0647 \u0645\u062d\u06cc\u0637 \u062f\u0633\u062a\u06af\u0627\u0647 \u0648\u0627\u0628\u0633\u062a\u0647 \u0646\u06cc\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 \u0628\u0647 \u0645\u062d\u062a\u0648\u0627\u06cc \u0647\u0645\u0627\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u0647\u0645 \u0645\u062a\u0635\u0644 \u0645\u06cc\u0634\u0647. \u06af\u0648\u06af\u0644 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0645\u0647\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0627\u062e\u0644 Hash \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0646 \u0648 \u0633\u0631\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u0647 \u0647\u0645\u0648\u0646 Hash \u0631\u0648 \u0645\u062d\u0627\u0633\u0628\u0647 \u0648 \u0645\u0642\u0627\u06cc\u0633\u0647 \u06a9\u0646\u0647. Standard Request\u0647\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u062c\u062f\u062f \u0645\u06a9\u0631\u0631 \u0627\u0632 \u06cc\u06a9 \u062a\u0648\u06a9\u0646 \u0645\u062d\u0627\u0641\u0638\u062a \u062f\u0627\u0631\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627 \u062a\u0627\u0628\u0639 \u0633\u0627\u062e\u062a Hash \u0631\u0648 \u0645\u06cc\u200c\u0646\u0648\u06cc\u0633\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import android.util.Base64\nimport java.security.MessageDigest\n\nfun sha256Base64Url(input: String): String {\n    val digest =\n        MessageDigest.getInstance(\"SHA-256\")\n            .digest(input.toByteArray(Charsets.UTF_8))\n\n    return Base64.encodeToString(\n        digest,\n        Base64.URL_SAFE or\n            Base64.NO_WRAP or\n            Base64.NO_PADDING\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.util.Base64<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">java.security.MessageDigest<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">sha256Base64Url<\/span><span style=\"color: #24292E\">(input: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> digest <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        MessageDigest.<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;SHA-256&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">digest<\/span><span style=\"color: #24292E\">(input.<\/span><span style=\"color: #6F42C1\">toByteArray<\/span><span style=\"color: #24292E\">(Charsets.UTF_8))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> Base64.<\/span><span style=\"color: #6F42C1\">encodeToString<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        digest,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Base64.URL_SAFE or<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Base64.NO_WRAP or<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Base64.NO_PADDING<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0628\u0627 \u06cc\u06a9 \u0642\u0627\u0644\u0628 \u062b\u0627\u0628\u062a \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class CreateAlertCommand(\n    val productId: Long,\n    val targetPrice: Long\n) {\n    fun stableContent(): String {\n        return \"productId=$productId\" +\n            \"&amp;targetPrice=$targetPrice\"\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">CreateAlertCommand<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> productId: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> targetPrice: <\/span><span style=\"color: #6F42C1\">Long<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">stableContent<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;productId=<\/span><span style=\"color: #005CC5\">$productId<\/span><span style=\"color: #032F62\">&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;&amp;targetPrice=<\/span><span style=\"color: #005CC5\">$targetPrice<\/span><span style=\"color: #032F62\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 Integrity Token \u0631\u0648 \u0628\u0631\u0627\u06cc \u0647\u0645\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u200c\u06af\u06cc\u0631\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun requestToken(\n    command: CreateAlertCommand,\n    onSuccess: (String) -> Unit,\n    onError: (Throwable) -> Unit\n) {\n    val provider =\n        tokenProvider ?: run {\n            onError(\n                IllegalStateException(\n                    \"Integrity provider is not prepared.\"\n                )\n            )\n            return\n        }\n\n    val requestHash =\n        sha256Base64Url(\n            command.stableContent()\n        )\n\n    val request =\n        StandardIntegrityManager\n            .StandardIntegrityTokenRequest\n            .builder()\n            .setRequestHash(requestHash)\n            .build()\n\n    provider\n        .request(request)\n        .addOnSuccessListener { response ->\n            onSuccess(response.token())\n        }\n        .addOnFailureListener(onError)\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">requestToken<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    command: <\/span><span style=\"color: #6F42C1\">CreateAlertCommand<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    onSuccess: (<\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">) -&gt; <\/span><span style=\"color: #6F42C1\">Unit<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    onError: (<\/span><span style=\"color: #6F42C1\">Throwable<\/span><span style=\"color: #24292E\">) -&gt; <\/span><span style=\"color: #6F42C1\">Unit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> provider <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        tokenProvider ?: <\/span><span style=\"color: #6F42C1\">run<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">onError<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">IllegalStateException<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #032F62\">&quot;Integrity provider is not prepared.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> requestHash <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">sha256Base64Url<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            command.<\/span><span style=\"color: #6F42C1\">stableContent<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> request <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        StandardIntegrityManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .StandardIntegrityTokenRequest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">setRequestHash<\/span><span style=\"color: #24292E\">(requestHash)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    provider<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">request<\/span><span style=\"color: #24292E\">(request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">addOnSuccessListener<\/span><span style=\"color: #24292E\"> { response <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">onSuccess<\/span><span style=\"color: #24292E\">(response.<\/span><span style=\"color: #6F42C1\">token<\/span><span style=\"color: #24292E\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">addOnFailureListener<\/span><span style=\"color: #24292E\">(onError)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0627\u062f\u0647 \u062d\u0633\u0627\u0633 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062a\u0646 \u0633\u0627\u062f\u0647 \u062f\u0627\u062e\u0644 <code>requestHash<\/code> \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0647. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0641\u0642\u0637 \u062e\u0631\u0648\u062c\u06cc SHA-256 \u0631\u0648 \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u06cc\u0645. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0641\u0631\u0645\u062a <code>stableContent<\/code> \u0628\u0627\u06cc\u062f \u062f\u0631 \u0627\u067e \u0648 \u0633\u0631\u0648\u0631 \u062f\u0642\u06cc\u0642\u0627\u064b \u06cc\u06a9\u0633\u0627\u0646 \u0628\u0627\u0634\u0647\u061b \u0686\u0648\u0646 \u0627\u06af\u0647 \u062a\u0631\u062a\u06cc\u0628 \u0641\u06cc\u0644\u062f\u0647\u0627 \u06cc\u0627 \u0646\u062d\u0648\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0627\u0639\u062f\u0627\u062f \u0645\u062a\u0641\u0627\u0648\u062a \u0628\u0627\u0634\u0647\u060c Hash\u0647\u0627 \u0628\u0627 \u0647\u0645 \u062a\u0637\u0627\u0628\u0642 \u067e\u06cc\u062f\u0627 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0648\u06a9\u0646 Integrity \u0631\u0648 \u0647\u0645\u0631\u0627\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a API \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062f\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062a\u0648\u06a9\u0646 Integrity \u0631\u0648 \u0647\u0645 \u0647\u0645\u0631\u0627\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0639\u0645\u0644\u06cc\u0627\u062a \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class CreateAlertApiRequest(\n    val productId: Long,\n    val targetPrice: Long,\n    val integrityToken: String\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">CreateAlertApiRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> productId: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> targetPrice: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> integrityToken: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 ViewModel \u06cc\u0627 Repository \u0627\u0648\u0644 \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0645\u06cc\u200c\u06af\u06cc\u0631\u06cc\u0645 \u0648 \u0628\u0639\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0635\u0644\u06cc \u0631\u0648 \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun createAlert(\n    command: CreateAlertCommand\n) {\n    integrityTokenProvider.requestToken(\n        command = command,\n        onSuccess = { integrityToken ->\n            viewModelScope.launch {\n                alertRepository.createAlert(\n                    CreateAlertApiRequest(\n                        productId =\n                            command.productId,\n                        targetPrice =\n                            command.targetPrice,\n                        integrityToken =\n                            integrityToken\n                    )\n                )\n            }\n        },\n        onError = {\n            showIntegrityError()\n        }\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">createAlert<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    command: <\/span><span style=\"color: #6F42C1\">CreateAlertCommand<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    integrityTokenProvider.<\/span><span style=\"color: #6F42C1\">requestToken<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        command <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> command,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        onSuccess <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> { integrityToken <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            viewModelScope.<\/span><span style=\"color: #6F42C1\">launch<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                alertRepository.<\/span><span style=\"color: #6F42C1\">createAlert<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #6F42C1\">CreateAlertApiRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        productId <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                            command.productId,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        targetPrice <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                            command.targetPrice,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        integrityToken <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                            integrityToken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        onError <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">showIntegrityError<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u067e\u0631\u0648\u0698\u0647 \u0648\u0627\u0642\u0639\u06cc \u0628\u0647\u062a\u0631\u0647 API\u0647\u0627\u06cc Task-based \u06af\u0648\u06af\u0644 \u0631\u0648 \u0628\u0627 Coroutine \u0647\u0645\u0627\u0647\u0646\u06af \u06a9\u0646\u06cc\u0645\u060c \u062e\u0637\u0627\u0647\u0627 \u0631\u0648 \u062f\u0633\u062a\u0647\u200c\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0622\u0645\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc Provider \u0631\u0648 \u0647\u0645 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0645\u0646\u0627\u0633\u0628 \u0627\u0646\u062c\u0627\u0645 \u0628\u062f\u06cc\u0645. \u0627\u0645\u0627 \u0627\u0635\u0644 \u0645\u0639\u0645\u0627\u0631\u06cc \u0647\u0645\u06cc\u0646 \u0627\u0633\u062a: \u062a\u0648\u06a9\u0646 \u0628\u0627\u06cc\u062f \u0646\u0632\u062f\u06cc\u06a9 \u0628\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u062d\u0633\u0627\u0633 \u062f\u0631\u06cc\u0627\u0641\u062a \u0648 \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u0634\u062e\u0635\u06cc \u0645\u062a\u0635\u0644 \u0628\u0634\u0647. \u06af\u0648\u06af\u0644 \u0647\u0645 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 verdict \u0631\u0648 \u062a\u0627 \u062c\u0627\u06cc \u0645\u0645\u06a9\u0646 \u0646\u0632\u062f\u06cc\u06a9 \u0628\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0642\u0635\u062f \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0627\u0648\u0646 \u0631\u0648 \u062f\u0627\u0631\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0635\u0645\u06cc\u0645 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u06af\u0631\u0641\u062a\u0647 \u0628\u0634\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Backend \u0628\u0639\u062f \u0627\u0632 \u062f\u0631\u06cc\u0627\u0641\u062a <code>integrityToken<\/code> \u0628\u0627\u06cc\u062f \u0627\u0648\u0646 \u0631\u0648 \u0628\u0627 \u0633\u0631\u0648\u06cc\u0633 Play Integrity Decode \u06a9\u0646\u0647. \u0633\u067e\u0633 \u0628\u0627\u06cc\u062f \u0686\u0646\u062f \u0628\u062e\u0634 \u0645\u0647\u0645 \u067e\u0627\u0633\u062e \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647: \u0646\u0627\u0645 Package\u060c \u0646\u062a\u06cc\u062c\u0647 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u060c Certificate\u060c \u0646\u0633\u062e\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u0648\u0636\u0639\u06cc\u062a \u062f\u0633\u062a\u06af\u0627\u0647 \u0648 <code>requestHash<\/code>. \u0641\u0642\u0637 \u0627\u06cc\u0646\u06a9\u0647 \u062a\u0648\u06a9\u0646 \u0642\u0627\u0628\u0644 Decode \u0628\u0648\u062f\u0647 \u06a9\u0627\u0641\u06cc \u0646\u06cc\u0633\u062a. \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0645\u0637\u0645\u0626\u0646 \u0628\u0634\u0647 Hash \u062f\u0627\u062e\u0644 verdict \u0628\u0627 Hash\u06cc \u06a9\u0647 \u062e\u0648\u062f\u0634 \u0627\u0632 <code>productId<\/code> \u0648 <code>targetPrice<\/code> \u0645\u062d\u0627\u0633\u0628\u0647 \u06a9\u0631\u062f\u0647 \u062a\u0637\u0627\u0628\u0642 \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0634\u0628\u0647\u200c\u0645\u0646\u0637\u0642 \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0628\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Decode integrity token\n\nCheck package name\n\nCheck appRecognitionVerdict == PLAY_RECOGNIZED\n\nCheck expected signing certificate\n\nRecalculate request hash\n\nCompare calculated hash with verdict requestHash\n\nApply device-integrity policy\n\nCheck authenticated user permissions\n\nPerform the requested operation\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">Decode integrity token<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">Check <\/span><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">name<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">Check appRecognitionVerdict <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> PLAY_RECOGNIZED<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">Check expected signing certificate<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">Recalculate request hash<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">Compare calculated hash with verdict requestHash<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">Apply device<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">integrity policy<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">Check authenticated user permissions<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">Perform the requested operation<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0645\u062a\u0646 \u06a9\u062f \u0646\u06cc\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 \u062a\u0631\u062a\u06cc\u0628 \u0645\u0646\u0637\u0642\u06cc \u0628\u0631\u0631\u0633\u06cc\u200c\u0647\u0627\u0633\u062a. \u0646\u06a9\u062a\u0647 \u06a9\u0644\u06cc\u062f\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 Integrity \u062c\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 Authorization \u0631\u0648 \u0646\u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. \u062d\u062a\u06cc \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0633\u0627\u0644\u0645 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u0633\u0627\u0644\u0645 \u0647\u0645 \u0646\u0628\u0627\u06cc\u062f \u0627\u062c\u0627\u0632\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u062f\u06cc\u06af\u0631\u06cc \u0631\u0648 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0646\u0647. Integrity \u0641\u0642\u0637 \u0645\u06cc\u06af\u0647 \u0645\u062d\u06cc\u0637 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0686\u0642\u062f\u0631 \u0642\u0627\u0628\u0644\u200c\u0627\u0639\u062a\u0645\u0627\u062f \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc\u0631\u0633\u0647\u061b \u0645\u062c\u0648\u0632 \u062e\u0648\u062f \u0639\u0645\u0644\u06cc\u0627\u062a \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0627\u06cc\u062f \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0628\u0631\u0631\u0633\u06cc \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0634\u062e\u06cc\u0635 Root \u06cc\u0627 \u0627\u0628\u0632\u0627\u0631 Hook \u0686\u0642\u062f\u0631 \u0627\u0631\u0632\u0634 \u062f\u0627\u0631\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u062f\u0646\u0628\u0627\u0644 \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc <code>su<\/code>\u060c Package \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0634\u0646\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647\u060c \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc Frida \u06cc\u0627 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u06af\u0631\u062f\u06cc\u0645. \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0628\u0631\u0631\u0633\u06cc\u200c\u0647\u0627 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0645\u0633\u0627\u0628\u0642\u0647 \u0645\u0648\u0634 \u0648 \u06af\u0631\u0628\u0647 \u0647\u0633\u062a\u0646. \u0646\u0627\u0645 Package \u0642\u0627\u0628\u0644 \u062a\u063a\u06cc\u06cc\u0631 \u0627\u0633\u062a\u060c \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0642\u0627\u0628\u0644 \u0645\u062e\u0641\u06cc \u0634\u062f\u0646 \u0647\u0633\u062a\u0646 \u0648 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f\u0634\u0648\u0646 \u0631\u0648 \u067e\u0646\u0647\u0627\u0646 \u06a9\u0646\u0646. \u0627\u0632 \u0637\u0631\u0641 \u062f\u06cc\u06af\u0631\u060c \u06cc\u06a9 \u062a\u0634\u062e\u06cc\u0635 \u0633\u062e\u062a\u200c\u06af\u06cc\u0631\u0627\u0646\u0647 \u0645\u0645\u06a9\u0646\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0633\u0627\u0644\u0645 \u0631\u0648 \u0647\u0645 \u0645\u0633\u062f\u0648\u062f \u06a9\u0646\u0647\u061b \u0645\u062b\u0644\u0627\u064b \u062f\u0633\u062a\u06af\u0627\u0647\u200c\u0647\u0627\u06cc \u0633\u0627\u0632\u0645\u0627\u0646\u06cc\u060c ROM\u0647\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u06cc\u0627 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc Accessibility \u0631\u0641\u062a\u0627\u0631 \u0645\u062a\u0641\u0627\u0648\u062a\u06cc \u062f\u0627\u0631\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647\u062a\u0631\u0647 \u0627\u06cc\u0646 \u0645\u0648\u0627\u0631\u062f \u0631\u0648 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062c\u0645\u0648\u0639\u0647\u200c\u0627\u06cc \u0627\u0632 Signal\u0647\u0627 \u0628\u0628\u06cc\u0646\u06cc\u0645\u060c \u0646\u0647 \u062d\u06a9\u0645 \u0642\u0637\u0639\u06cc. \u0628\u0631\u0627\u06cc \u0646\u0645\u0648\u0646\u0647 \u06cc\u06a9 \u0645\u062f\u0644 \u0627\u0631\u0632\u06cc\u0627\u0628\u06cc \u0645\u062d\u0644\u06cc \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class LocalSecuritySignals(\n    val debuggerAttached: Boolean,\n    val signatureValid: Boolean,\n    val appDebuggable: Boolean,\n    val suspiciousLibrariesFound: Boolean\n) {\n    val riskScore: Int\n        get() {\n            var score = 0\n\n            if (debuggerAttached) score += 2\n            if (!signatureValid) score += 5\n            if (appDebuggable) score += 2\n            if (suspiciousLibrariesFound) score += 2\n\n            return score\n        }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">LocalSecuritySignals<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> debuggerAttached: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> signatureValid: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> appDebuggable: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> suspiciousLibrariesFound: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> riskScore: <\/span><span style=\"color: #6F42C1\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">get<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">var<\/span><span style=\"color: #24292E\"> score <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (debuggerAttached) score <\/span><span style=\"color: #D73A49\">+=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #24292E\">signatureValid) score <\/span><span style=\"color: #D73A49\">+=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (appDebuggable) score <\/span><span style=\"color: #D73A49\">+=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (suspiciousLibrariesFound) score <\/span><span style=\"color: #D73A49\">+=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">2<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0628\u0631\u0627\u0633\u0627\u0633 \u0627\u0645\u062a\u06cc\u0627\u0632 \u062a\u0635\u0645\u06cc\u0645 \u0633\u0637\u062d\u200c\u0628\u0646\u062f\u06cc\u200c\u0634\u062f\u0647 \u0645\u06cc\u200c\u06af\u06cc\u0631\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>when {\n    signals.riskScore >= 7 -> {\n        blockSensitiveAction()\n    }\n\n    signals.riskScore >= 3 -> {\n        requireServerIntegrityCheck()\n    }\n\n    else -> {\n        continueNormally()\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">when<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    signals.riskScore <\/span><span style=\"color: #D73A49\">&gt;=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">7<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">blockSensitiveAction<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    signals.riskScore <\/span><span style=\"color: #D73A49\">&gt;=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">3<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">requireServerIntegrityCheck<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">continueNormally<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u062a\u06cc \u0627\u06cc\u0646 \u062a\u0635\u0645\u06cc\u0645 \u0628\u0647\u062a\u0631\u0647 \u0646\u0647\u0627\u06cc\u06cc \u0646\u0628\u0627\u0634\u0647\u060c \u0686\u0648\u0646 \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 <code>riskScore<\/code> \u0631\u0648 \u0647\u0645 Hook \u06a9\u0646\u0647. \u0627\u0631\u0632\u0634 \u0627\u0635\u0644\u06cc \u0633\u06cc\u06af\u0646\u0627\u0644\u200c\u0647\u0627\u06cc \u0645\u062d\u0644\u06cc \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0631\u0627\u06cc Telemetry\u060c \u06af\u0632\u0627\u0631\u0634 \u0631\u0641\u062a\u0627\u0631 \u0645\u0634\u06a9\u0648\u06a9 \u0648 \u0627\u0646\u062a\u062e\u0627\u0628 \u0632\u0645\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Play Integrity \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0634\u0646. \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0645\u0647\u0645 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0627\u06cc\u062f \u062a\u0648\u0633\u0637 \u0633\u0631\u0648\u0631 \u06a9\u0646\u062a\u0631\u0644 \u0628\u0634\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0628\u0631\u0631\u0633\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc\u200c\u0634\u062f\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0631\u0648\u0634\u200c\u0647\u0627\u06cc \u062a\u0634\u062e\u06cc\u0635 \u0627\u0628\u062a\u062f\u0627\u06cc\u06cc\u060c \u0628\u0631\u0631\u0633\u06cc \u0641\u0627\u06cc\u0644 <code>\/proc\/self\/maps<\/code> \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0641\u0647\u0631\u0633\u062a\u06cc \u0627\u0632 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u062d\u0627\u0641\u0638\u0647 \u0648 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u062f\u0631 \u0641\u0631\u0627\u06cc\u0646\u062f \u0641\u0639\u0644\u06cc \u0631\u0648 \u0646\u0634\u0648\u0646 \u0645\u06cc\u062f\u0647. \u06af\u0627\u0647\u06cc \u0646\u0627\u0645 \u0627\u0628\u0632\u0627\u0631 \u06cc\u0627 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0645\u0634\u06a9\u0648\u06a9 \u062f\u0631 \u0627\u0648\u0646 \u062f\u06cc\u062f\u0647 \u0645\u06cc\u0634\u0647. \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u062f\u0646\u0628\u0627\u0644 \u0686\u0646\u062f \u0648\u0627\u0698\u0647 \u0634\u0646\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u0628\u06af\u0631\u062f\u06cc\u0645\u060c \u0627\u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u062f\u0648\u0646\u06cc\u0645 \u06a9\u0647 \u0646\u0627\u0645\u200c\u0647\u0627 \u0642\u0627\u0628\u0644 \u062a\u063a\u06cc\u06cc\u0631\u0646 \u0648 \u0646\u062a\u06cc\u062c\u0647 \u0645\u0646\u0641\u06cc \u0628\u0647 \u0645\u0639\u0646\u06cc \u0633\u0627\u0644\u0645 \u0628\u0648\u062f\u0646 \u0642\u0637\u0639\u06cc \u0645\u062d\u06cc\u0637 \u0646\u06cc\u0633\u062a.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import java.io.File\n\nfun hasSuspiciousLoadedLibraries(): Boolean {\n    val suspiciousTerms =\n        listOf(\n            \"frida\",\n            \"xposed\",\n            \"substrate\",\n            \"zygisk\"\n        )\n\n    return runCatching {\n        File(\"\/proc\/self\/maps\")\n            .useLines { lines ->\n                lines.any { line ->\n                    suspiciousTerms.any { term ->\n                        line.contains(\n                            term,\n                            ignoreCase = true\n                        )\n                    }\n                }\n            }\n    }.getOrDefault(false)\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">java.io.File<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">hasSuspiciousLoadedLibraries<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> suspiciousTerms <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">listOf<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;frida&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;xposed&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;substrate&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;zygisk&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">runCatching<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">File<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;\/proc\/self\/maps&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">useLines<\/span><span style=\"color: #24292E\"> { lines <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                lines.<\/span><span style=\"color: #6F42C1\">any<\/span><span style=\"color: #24292E\"> { line <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    suspiciousTerms.<\/span><span style=\"color: #6F42C1\">any<\/span><span style=\"color: #24292E\"> { term <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        line.<\/span><span style=\"color: #6F42C1\">contains<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                            term,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                            ignoreCase <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }.<\/span><span style=\"color: #6F42C1\">getOrDefault<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">false<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0628\u0631\u0631\u0633\u06cc \u0645\u0645\u06a9\u0646\u0647 False Positive \u0648 False Negative \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u0628\u0647 \u062e\u0627\u0637\u0631 \u067e\u06cc\u062f\u0627 \u0634\u062f\u0646 \u06cc\u06a9 \u06a9\u0644\u0645\u0647\u060c \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0645\u0633\u062f\u0648\u062f \u06cc\u0627 \u062d\u0630\u0641 \u06a9\u0646\u06cc\u0645. \u0628\u0647\u062a\u0631\u0647 \u0627\u06cc\u0646 \u0646\u062a\u06cc\u062c\u0647 \u06a9\u0646\u0627\u0631 \u0627\u0645\u0636\u0627\u060c Debugger\u060c Integrity \u0648 \u0631\u0641\u062a\u0627\u0631 \u0633\u0631\u0648\u0631 \u0627\u0631\u0632\u06cc\u0627\u0628\u06cc \u0628\u0634\u0647. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0646\u0645\u0627\u06cc\u0634 \u062c\u0632\u0626\u06cc\u0627\u062a \u062f\u0642\u06cc\u0642 \u062a\u0634\u062e\u06cc\u0635 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0647 \u0645\u0647\u0627\u062c\u0645 \u06a9\u0645\u06a9 \u06a9\u0646\u0647 \u0628\u0641\u0647\u0645\u0647 \u06a9\u062f\u0648\u0645 \u06a9\u0646\u062a\u0631\u0644 \u0641\u0639\u0627\u0644 \u0634\u062f\u0647\u061b \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0639\u0627\u062f\u06cc \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u0639\u0645\u0648\u0645\u06cc \u06a9\u0627\u0641\u06cc \u0627\u0633\u062a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u06a9\u062f\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0631\u0648 \u0628\u06cc\u0646 \u0686\u0646\u062f \u0646\u0642\u0637\u0647 \u067e\u062e\u0634 \u0646\u06a9\u0646<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u0636\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647\u200c\u0647\u0627 \u062a\u0645\u0627\u0645 \u06a9\u0646\u062a\u0631\u0644 \u0627\u0645\u0646\u06cc\u062a \u0631\u0648 \u062f\u0627\u062e\u0644 \u06cc\u06a9 \u0645\u062a\u062f \u0645\u06cc\u200c\u0630\u0627\u0631\u0646:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun isDeviceSecure(): Boolean {\n    return !isRooted() &amp;&amp;\n        !isDebuggerAttached() &amp;&amp;\n        hasExpectedSignature() &amp;&amp;\n        !hasSuspiciousLoadedLibraries()\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">isDeviceSecure<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #6F42C1\">isRooted<\/span><span style=\"color: #24292E\">() <\/span><span style=\"color: #D73A49\">&amp;&amp;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #6F42C1\">isDebuggerAttached<\/span><span style=\"color: #24292E\">() <\/span><span style=\"color: #D73A49\">&amp;&amp;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">hasExpectedSignature<\/span><span style=\"color: #24292E\">() <\/span><span style=\"color: #D73A49\">&amp;&amp;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #6F42C1\">hasSuspiciousLoadedLibraries<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u062f\u0631 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u0645\u06cc\u200c\u0646\u0648\u06cc\u0633\u0646:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>if (isDeviceSecure()) {\n    performSensitiveAction()\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #6F42C1\">isDeviceSecure<\/span><span style=\"color: #24292E\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">performSensitiveAction<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0637\u0631\u0627\u062d\u06cc \u0628\u0631\u0627\u06cc \u0645\u0647\u0627\u062c\u0645 \u062e\u06cc\u0644\u06cc \u062c\u0630\u0627\u0628\u0647\u060c \u0686\u0648\u0646 \u0641\u0642\u0637 \u06a9\u0627\u0641\u06cc\u0647 \u0647\u0645\u06cc\u0646 \u06cc\u06a9 \u0645\u062a\u062f \u0631\u0648 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0647 \u0648 \u0646\u062a\u06cc\u062c\u0647 \u0627\u0648\u0646 \u0631\u0648 \u0647\u0645\u06cc\u0634\u0647 <code>true<\/code> \u0642\u0631\u0627\u0631 \u0628\u062f\u0647. \u0628\u0647\u062a\u0631\u0647 \u06a9\u0646\u062a\u0631\u0644\u200c\u0647\u0627 \u062f\u0631 \u0686\u0646\u062f \u0644\u0627\u06cc\u0647 \u0645\u0633\u062a\u0642\u0644 \u0628\u0627\u0634\u0646: \u0628\u0639\u0636\u06cc \u0647\u0646\u06af\u0627\u0645 \u0634\u0631\u0648\u0639 \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u0628\u0639\u0636\u06cc \u0646\u0632\u062f\u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u062d\u0633\u0627\u0633\u060c \u0628\u0639\u0636\u06cc \u062f\u0627\u062e\u0644 Repository \u0648 \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646\u200c\u0647\u0627 \u0631\u0648\u06cc Backend. \u0627\u0644\u0628\u062a\u0647 \u067e\u0631\u0627\u06a9\u0646\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u06a9\u062f \u0628\u06cc\u200c\u0646\u0638\u0645 \u062a\u0628\u062f\u06cc\u0644 \u0628\u0634\u0647\u061b \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u06cc\u06a9 <code>SecurityMonitor<\/code> \u0645\u0631\u06a9\u0632\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645\u060c \u0627\u0645\u0627 \u062a\u0635\u0645\u06cc\u0645\u200c\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0641\u0642\u0637 \u0628\u0647 \u06cc\u06a9 Boolean \u0645\u062d\u0644\u06cc \u0648\u0627\u0628\u0633\u062a\u0647 \u0646\u0628\u0627\u0634\u0646.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class SecurityMonitor(\n    private val context: Context\n) {\n\n    fun collectLocalSignals(): LocalSecuritySignals {\n        return LocalSecuritySignals(\n            debuggerAttached =\n                isDebuggerAttached(),\n            signatureValid =\n                context.hasExpectedSignature(),\n            appDebuggable =\n                context.isAppDebuggable(),\n            suspiciousLibrariesFound =\n                hasSuspiciousLoadedLibraries()\n        )\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SecurityMonitor<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> context: <\/span><span style=\"color: #6F42C1\">Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">collectLocalSignals<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">LocalSecuritySignals<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">LocalSecuritySignals<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            debuggerAttached <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">isDebuggerAttached<\/span><span style=\"color: #24292E\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            signatureValid <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                context.<\/span><span style=\"color: #6F42C1\">hasExpectedSignature<\/span><span style=\"color: #24292E\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            appDebuggable <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                context.<\/span><span style=\"color: #6F42C1\">isAppDebuggable<\/span><span style=\"color: #24292E\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            suspiciousLibrariesFound <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">hasSuspiciousLoadedLibraries<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0631\u0627\u06cc \u06af\u0632\u0627\u0631\u0634 \u0648 \u0627\u0646\u062a\u062e\u0627\u0628 \u0633\u06cc\u0627\u0633\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0634\u0647\u060c \u0627\u0645\u0627 Backend \u0628\u0627\u06cc\u062f \u0647\u0645\u0686\u0646\u0627\u0646 \u06a9\u0646\u062a\u0631\u0644 \u0646\u0647\u0627\u06cc\u06cc \u0631\u0648 \u0627\u0646\u062c\u0627\u0645 \u0628\u062f\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0631\u0641\u062a\u0627\u0631 \u0645\u0634\u06a9\u0648\u06a9 \u0631\u0648 \u062b\u0628\u062a \u06a9\u0646\u060c \u0627\u0645\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0646\u0641\u0631\u0633\u062a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc \u0646\u0634\u0627\u0646\u0647\u200c\u0627\u06cc \u0627\u0632 Hook \u06cc\u0627 Tampering \u067e\u06cc\u062f\u0627 \u0645\u06cc\u0634\u0647\u060c \u0628\u0647\u062a\u0631\u0647 \u06cc\u06a9 \u0631\u0648\u06cc\u062f\u0627\u062f \u0627\u0645\u0646\u06cc\u062a\u06cc \u0628\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 \u062b\u0628\u062a \u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u06af\u0632\u0627\u0631\u0634 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0634\u0627\u0645\u0644 \u0646\u0633\u062e\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u0646\u0648\u0639 \u0633\u06cc\u06af\u0646\u0627\u0644\u060c \u0632\u0645\u0627\u0646 \u0631\u062e\u062f\u0627\u062f\u060c \u0634\u0646\u0627\u0633\u0647 \u0646\u0627\u0634\u0646\u0627\u0633 Session \u0648 \u0648\u0636\u0639\u06cc\u062a Integrity \u0628\u0627\u0634\u0647. \u0646\u0628\u0627\u06cc\u062f \u062a\u0648\u06a9\u0646\u060c \u0631\u0645\u0632 \u0639\u0628\u0648\u0631\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062e\u0635\u0648\u0635\u06cc \u06cc\u0627 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u06a9\u0627\u0645\u0644 \u062d\u0627\u0641\u0638\u0647 \u0631\u0648 \u062f\u0627\u062e\u0644 \u06af\u0632\u0627\u0631\u0634 \u0628\u0641\u0631\u0633\u062a\u06cc\u0645. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0633\u0631\u0648\u0631 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u06af\u0632\u0627\u0631\u0634 \u062e\u0648\u062f \u0627\u067e \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u0627\u0645\u0644 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0686\u0648\u0646 \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0631\u0633\u0627\u0644 \u0627\u0648\u0646 \u0631\u0648 \u0645\u062a\u0648\u0642\u0641 \u06cc\u0627 \u0645\u062d\u062a\u0648\u0627\u06cc \u0627\u0648\u0646 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class SecurityEventRequest(\n    val eventType: String,\n    val appVersion: String,\n    val sessionId: String,\n    val occurredAt: Long\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SecurityEventRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> eventType: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> appVersion: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> sessionId: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> occurredAt: <\/span><span style=\"color: #6F42C1\">Long<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062b\u0644\u0627\u064b:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>securityApi.reportEvent(\n    SecurityEventRequest(\n        eventType = \"DEBUGGER_DETECTED\",\n        appVersion = BuildConfig.VERSION_NAME,\n        sessionId = sessionId,\n        occurredAt = System.currentTimeMillis()\n    )\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">securityApi.<\/span><span style=\"color: #6F42C1\">reportEvent<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">SecurityEventRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        eventType <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;DEBUGGER_DETECTED&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        appVersion <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> BuildConfig.VERSION_NAME,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        sessionId <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> sessionId,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        occurredAt <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> System.<\/span><span style=\"color: #6F42C1\">currentTimeMillis<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0631\u0632\u0634 \u0627\u0635\u0644\u06cc \u0627\u06cc\u0646 \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u062f\u0631 \u062a\u062d\u0644\u06cc\u0644 \u06af\u0631\u0648\u0647\u06cc \u0645\u0634\u062e\u0635 \u0645\u06cc\u0634\u0647. \u0627\u06af\u0647 \u06cc\u06a9 \u062d\u0633\u0627\u0628 \u0627\u0632 \u062f\u0647\u200c\u0647\u0627 \u062f\u0633\u062a\u06af\u0627\u0647 \u0645\u0634\u06a9\u0648\u06a9\u060c \u0628\u0627 \u0627\u0644\u06af\u0648\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u063a\u06cc\u0631\u0639\u0627\u062f\u06cc \u0648 Integrity \u0646\u0627\u0645\u0639\u062a\u0628\u0631 \u0641\u0639\u0627\u0644\u06cc\u062a \u06a9\u0646\u0647\u060c \u0633\u0631\u0648\u0631 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u0647. \u06af\u0648\u06af\u0644 \u0647\u0645 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0642\u0628\u0644 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u0633\u06cc\u0627\u0633\u062a \u0633\u062e\u062a\u200c\u06af\u06cc\u0631\u0627\u0646\u0647\u060c \u0645\u062f\u062a\u06cc verdict\u0647\u0627 \u0631\u0648 \u0641\u0642\u0637 \u062c\u0645\u0639\u200c\u0622\u0648\u0631\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0628\u0641\u0647\u0645\u06cc\u0645 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0686\u0647 \u0646\u062a\u0627\u06cc\u062c\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0648 Enforcement \u0628\u0627\u0639\u062b \u0645\u0633\u062f\u0648\u062f \u0634\u062f\u0646 \u0686\u0647 \u062a\u0639\u062f\u0627\u062f \u06a9\u0627\u0631\u0628\u0631 \u0633\u0627\u0644\u0645 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0628\u0631\u062e\u0648\u0631\u062f \u0635\u0641\u0631 \u0648 \u0635\u062f\u06cc \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0627\u0634\u062a\u0628\u0627\u0647\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 Play Integrity \u0628\u0647 \u062f\u0644\u06cc\u0644 \u0642\u062f\u06cc\u0645\u06cc \u0628\u0648\u062f\u0646 Play Store \u067e\u0627\u0633\u062e \u0642\u0627\u0628\u0644\u200c\u0627\u0633\u062a\u0641\u0627\u062f\u0647\u200c\u0627\u06cc \u0646\u062f\u0647. \u0622\u06cc\u0627 \u0628\u0627\u06cc\u062f \u0641\u0648\u0631\u0627\u064b \u062a\u0645\u0627\u0645 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0628\u0628\u0646\u062f\u06cc\u0645\u061f \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0627\u06cc \u0645\u062b\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0646\u0647. \u0628\u0647\u062a\u0631\u0647 Enforcement \u0633\u0637\u062d\u200c\u0628\u0646\u062f\u06cc\u200c\u0634\u062f\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645. \u0645\u0634\u0627\u0647\u062f\u0647 \u0642\u06cc\u0645\u062a\u200c\u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u062f\u0648\u0646 Integrity \u0633\u062e\u062a\u200c\u06af\u06cc\u0631\u0627\u0646\u0647 \u0627\u062f\u0627\u0645\u0647 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0627\u06cc\u0645\u06cc\u0644\u060c \u062d\u0630\u0641 \u062d\u0633\u0627\u0628\u060c \u062e\u0631\u06cc\u062f \u0627\u0634\u062a\u0631\u0627\u06a9 \u06cc\u0627 \u0639\u0645\u0644\u06cc\u0627\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u0646\u06cc\u0627\u0632\u0645\u0646\u062f \u0628\u0631\u0631\u0633\u06cc \u0642\u0648\u06cc\u200c\u062a\u0631 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9 \u0633\u06cc\u0627\u0633\u062a \u0646\u0645\u0648\u0646\u0647 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u06cc\u0646\u200c\u0637\u0648\u0631 \u0628\u0627\u0634\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>enum class SecurityDecision {\n    ALLOW,\n    ALLOW_WITH_LIMITS,\n    REQUIRE_REAUTHENTICATION,\n    BLOCK_SENSITIVE_ACTION\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">enum<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SecurityDecision<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ALLOW,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ALLOW_WITH_LIMITS,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    REQUIRE_REAUTHENTICATION,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    BLOCK_SENSITIVE_ACTION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0644\u06cc \u0628\u0647\u062a\u0631\u0647 \u062a\u0635\u0645\u06cc\u0645 \u0646\u0647\u0627\u06cc\u06cc \u0627\u06cc\u0646 Enum \u0627\u0632 \u067e\u0627\u0633\u062e \u0633\u0631\u0648\u0631 \u0628\u06cc\u0627\u062f:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class SecurityDecisionResponse(\n    val decision: SecurityDecision,\n    val message: String?\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SecurityDecisionResponse<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> decision: <\/span><span style=\"color: #6F42C1\">SecurityDecision<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> message: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u0631\u0648\u0631 \u0628\u0627 \u062a\u0631\u06a9\u06cc\u0628 Integrity\u060c \u0633\u0627\u0628\u0642\u0647 \u062d\u0633\u0627\u0628\u060c \u0646\u0648\u0639 \u0639\u0645\u0644\u06cc\u0627\u062a\u060c Rate Limit \u0648 \u0633\u0627\u06cc\u0631 \u0633\u06cc\u06af\u0646\u0627\u0644\u200c\u0647\u0627 \u062a\u0635\u0645\u06cc\u0645 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. \u0645\u062b\u0644\u0627\u064b \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u0634\u0627\u0647\u062f\u0647 \u0644\u06cc\u0633\u062a \u06a9\u0627\u0644\u0627\u0647\u0627 \u0631\u0648 \u0645\u062c\u0627\u0632 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u0633\u0627\u062e\u062a \u0635\u062f\u0647\u0627 \u0647\u0634\u062f\u0627\u0631 \u0642\u06cc\u0645\u062a \u06cc\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0631\u0648 \u0645\u062a\u0648\u0642\u0641 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0647\u0645 \u0627\u0645\u0646\u06cc\u062a \u0628\u0647\u062a\u0631\u06cc \u062f\u0627\u0631\u0647 \u0648 \u0647\u0645 \u0627\u062d\u062a\u0645\u0627\u0644 \u0622\u0633\u06cc\u0628 \u0632\u062f\u0646 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0633\u0627\u0644\u0645 \u0631\u0648 \u06a9\u0627\u0647\u0634 \u0645\u06cc\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Play Integrity \u062d\u062a\u06cc \u0633\u06cc\u06af\u0646\u0627\u0644 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc <code>appAccessRiskVerdict<\/code> \u0647\u0645 \u062f\u0627\u0631\u0647 \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0648\u062c\u0648\u062f \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0628\u0627 \u0642\u0627\u0628\u0644\u06cc\u062a Capture\u060c Overlay \u06cc\u0627 \u06a9\u0646\u062a\u0631\u0644 \u062f\u0633\u062a\u06af\u0627\u0647 \u0631\u0648 \u06af\u0632\u0627\u0631\u0634 \u06a9\u0646\u0647. \u0633\u0631\u0648\u06cc\u0633\u200c\u0647\u0627\u06cc Accessibility \u062a\u0623\u06cc\u06cc\u062f\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 Google Play \u0627\u0632 \u0627\u06cc\u0646 \u062a\u0634\u062e\u06cc\u0635 \u0645\u0633\u062a\u062b\u0646\u0627 \u0645\u06cc\u0634\u0646 \u062a\u0627 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0642\u0627\u0646\u0648\u0646\u06cc \u062f\u0633\u062a\u0631\u0633\u200c\u067e\u0630\u06cc\u0631\u06cc \u0628\u06cc\u200c\u062f\u0644\u06cc\u0644 \u0639\u0644\u0627\u0645\u062a\u200c\u06af\u0630\u0627\u0631\u06cc \u0646\u0634\u0646. \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a\u200c\u0647\u0627\u06cc \u062e\u06cc\u0644\u06cc \u062d\u0633\u0627\u0633 \u0645\u0641\u06cc\u062f\u0647\u060c \u0627\u0645\u0627 \u0628\u0627\u0632 \u0647\u0645 \u0646\u0628\u0627\u06cc\u062f \u0628\u062f\u0648\u0646 \u0628\u0631\u0631\u0633\u06cc \u0627\u062b\u0631 \u0627\u0648\u0646 \u0631\u0648\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc\u060c \u0628\u0647 \u0645\u0633\u062f\u0648\u062f\u0633\u0627\u0632\u06cc \u06a9\u0627\u0645\u0644 \u0645\u0646\u062c\u0631 \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u067e\u06cc\u0627\u0645 \u0645\u0646\u0627\u0633\u0628 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0686\u06cc \u0628\u0627\u0634\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0642\u0637 \u0628\u0646\u0648\u06cc\u0633\u0647 \u00abFrida \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u0634\u062f\u00bb \u06cc\u0627 \u00abXposed \u067e\u06cc\u062f\u0627 \u0634\u062f\u00bb\u060c \u0647\u0645 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0639\u0627\u062f\u06cc \u0646\u0627\u0645\u0641\u0647\u0648\u0645\u0647 \u0648 \u0647\u0645 \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0646\u062a\u0631\u0644 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0631\u0648 \u0628\u0647 \u0645\u0647\u0627\u062c\u0645 \u0627\u0639\u0644\u0627\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u067e\u06cc\u0627\u0645 \u0628\u0647\u062a\u0631 \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0639\u0645\u0644\u06cc \u06a9\u0647 \u0641\u0639\u0644\u0627\u064b \u0642\u0627\u0628\u0644 \u0627\u0646\u062c\u0627\u0645 \u0646\u06cc\u0633\u062a \u062a\u0645\u0631\u06a9\u0632 \u06a9\u0646\u0647\u060c \u0646\u0647 \u0631\u0648\u0634 \u062a\u0634\u062e\u06cc\u0635.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062b\u0644\u0627\u064b:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val message =\n    \"\u0627\u0645\u06a9\u0627\u0646 \u062a\u0623\u06cc\u06cc\u062f \u0627\u0645\u0646\u06cc\u062a \u0627\u06cc\u0646 \u062f\u0633\u062a\u06af\u0627\u0647 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a. \" +\n    \"\u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a\u060c \u0646\u0633\u062e\u0647 \u0631\u0633\u0645\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \" +\n    \"\u0627\u0632 Google Play \u0646\u0635\u0628 \u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u062a\u0644\u0627\u0634 \u06a9\u0646.\"\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> message <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;\u0627\u0645\u06a9\u0627\u0646 \u062a\u0623\u06cc\u06cc\u062f \u0627\u0645\u0646\u06cc\u062a \u0627\u06cc\u0646 \u062f\u0633\u062a\u06af\u0627\u0647 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a. &quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;\u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a\u060c \u0646\u0633\u062e\u0647 \u0631\u0633\u0645\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 &quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;\u0627\u0632 Google Play \u0646\u0635\u0628 \u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u062a\u0644\u0627\u0634 \u06a9\u0646.&quot;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0628\u0639\u0636\u06cc \u0634\u0631\u0627\u06cc\u0637 Play Integrity \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 Remediation Dialog \u0631\u0633\u0645\u06cc Google Play \u0631\u0648 \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u0647 \u062a\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0646\u0633\u062e\u0647 \u0631\u0633\u0645\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u0647 \u06cc\u0627 \u0645\u0634\u06a9\u0644 \u0642\u0627\u0628\u0644\u200c\u062d\u0644 \u0645\u062d\u06cc\u0637 \u0631\u0648 \u0628\u0631\u0637\u0631\u0641 \u06a9\u0646\u0647. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0633\u0627\u0644\u0645 \u0628\u0647\u062a\u0631 \u0627\u0632 \u0646\u0645\u0627\u06cc\u0634 \u06cc\u06a9 \u062e\u0637\u0627\u06cc \u0628\u0633\u062a\u0647 \u0648 \u0628\u062f\u0648\u0646 \u0631\u0627\u0647\u200c\u062d\u0644\u0647. \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0631\u0633\u0645\u06cc \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0648\u0642\u062a\u06cc verdict \u0645\u0634\u06a9\u0644\u06cc \u0645\u062b\u0644 \u0646\u0633\u062e\u0647 \u0646\u0627\u0634\u0646\u0627\u062e\u062a\u0647 \u06cc\u0627 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0631\u0648 \u0646\u0634\u0648\u0646 \u0645\u06cc\u062f\u0647\u060c \u062f\u0631 \u0635\u0648\u0631\u062a \u0645\u0646\u0627\u0633\u0628 \u0628\u0648\u062f\u0646 \u0627\u0632 \u0647\u0645\u06cc\u0646 \u0641\u0631\u0627\u06cc\u0646\u062f\u0647\u0627\u06cc \u0627\u0635\u0644\u0627\u062d\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u06a9\u0627\u0631\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0646\u0628\u0627\u06cc\u062f \u0627\u0646\u062c\u0627\u0645 \u0628\u062f\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0628\u0627\u06cc\u062f \u06a9\u0644 \u0627\u0645\u0646\u06cc\u062a \u0631\u0648 \u0631\u0648\u06cc \u0645\u062e\u0641\u06cc \u06a9\u0631\u062f\u0646 \u0646\u0627\u0645 \u06a9\u0644\u0627\u0633\u200c\u0647\u0627 \u06cc\u0627 \u0686\u0646\u062f \u0634\u0631\u0637 \u0645\u062d\u0644\u06cc \u0628\u0646\u0627 \u06a9\u0646\u06cc\u0645. \u0646\u0628\u0627\u06cc\u062f \u0628\u0639\u062f \u0627\u0632 \u062a\u0634\u062e\u06cc\u0635 \u0627\u0628\u0632\u0627\u0631 \u0645\u0634\u06a9\u0648\u06a9 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u067e\u0627\u06a9 \u06a9\u0646\u06cc\u0645\u060c \u062d\u0633\u0627\u0628\u0634 \u0631\u0648 \u062d\u0630\u0641 \u06a9\u0646\u06cc\u0645 \u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0639\u0645\u062f\u0627\u064b Crash \u0628\u062f\u06cc\u0645. \u0627\u06cc\u0646 \u0631\u0641\u062a\u0627\u0631 \u0645\u0645\u06a9\u0646\u0647 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0633\u0627\u0644\u0645 \u0622\u0633\u06cc\u0628 \u0628\u0632\u0646\u0647 \u0648 \u0628\u0631\u0627\u06cc \u0645\u0647\u0627\u062c\u0645 \u062d\u0631\u0641\u0647\u200c\u0627\u06cc \u0647\u0645 \u0645\u0627\u0646\u0639 \u062c\u062f\u06cc \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0646\u0628\u0627\u06cc\u062f Secret Key \u062f\u0627\u0626\u0645\u06cc \u062f\u0627\u062e\u0644 \u06a9\u062f Native \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645 \u0648 \u062a\u0635\u0648\u0631 \u06a9\u0646\u06cc\u0645 \u0686\u0648\u0646 \u0641\u0627\u06cc\u0644 C++ \u0633\u062e\u062a\u200c\u062a\u0631 \u062a\u062d\u0644\u06cc\u0644 \u0645\u06cc\u0634\u0647\u060c \u06a9\u0644\u06cc\u062f \u0627\u0645\u0646 \u0634\u062f\u0647. \u06a9\u062f Native \u062a\u062d\u0644\u06cc\u0644 \u0631\u0648 \u0633\u062e\u062a\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u0647\u0645\u0686\u0646\u0627\u0646 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647 \u0648 \u0642\u0627\u0628\u0644 \u0628\u0631\u0631\u0633\u06cc \u06cc\u0627 Hook \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0628\u0627\u06cc\u062f Play Integrity Token \u0631\u0648 \u0641\u0642\u0637 \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 Decode \u06cc\u0627 \u0646\u062a\u06cc\u062c\u0647 \u0627\u0648\u0646 \u0631\u0648 \u0645\u062d\u0644\u06cc \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645. \u062a\u0648\u06a9\u0646 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0633\u0631\u0648\u0631 \u0627\u0631\u0633\u0627\u0644 \u0628\u0634\u0647 \u0648 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0648\u06cc Backend \u0627\u0631\u0632\u06cc\u0627\u0628\u06cc \u0628\u0634\u0647. \u0646\u0628\u0627\u06cc\u062f \u06cc\u06a9 Integrity Token \u0631\u0648 \u0628\u0631\u0627\u06cc \u062a\u0645\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 Cache \u06a9\u0646\u06cc\u0645\u060c \u0686\u0648\u0646 \u0627\u062a\u0635\u0627\u0644 \u0627\u0648\u0646 \u0628\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u062e\u0627\u0635 \u0627\u0632 \u0628\u06cc\u0646 \u0645\u06cc\u0631\u0647 \u0648 \u062e\u0637\u0631 \u0633\u0648\u0621\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u06cc\u0634\u062a\u0631 \u0645\u06cc\u0634\u0647. \u06af\u0648\u06af\u0644 \u0647\u0645 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 verdict\u0647\u0627 Cache \u0646\u0634\u0646 \u0648 \u0628\u0631\u0627\u06cc Standard Request \u0627\u0632 <code>requestHash<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0634\u0647 \u062a\u0627 \u067e\u0627\u0633\u062e \u0628\u0647 \u0645\u062d\u062a\u0648\u0627\u06cc \u0647\u0645\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u062a\u0635\u0644 \u0628\u0645\u0648\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hooking \u06cc\u0639\u0646\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0646 \u0631\u0641\u062a\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627\u061b \u0645\u062b\u0644\u0627\u064b \u0639\u0648\u0636 \u06a9\u0631\u062f\u0646 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u060c \u062e\u0648\u0627\u0646\u062f\u0646 \u062a\u0648\u06a9\u0646\u060c \u0631\u062f \u0646\u06a9\u0631\u062f\u0646 \u0634\u0631\u0637\u200c\u0647\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc \u06cc\u0627 \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0646 \u0646\u062a\u06cc\u062c\u0647 \u0633\u0627\u062e\u062a\u06af\u06cc \u0627\u0632 \u06cc\u06a9 \u0645\u062a\u062f. \u0686\u0648\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647\u060c \u0647\u06cc\u0686 \u0631\u0648\u0634 \u0645\u062d\u0644\u06cc\u200c\u0627\u06cc \u0646\u0645\u06cc\u200c\u062a\u0648\u0646\u0647 Hook \u0631\u0648 \u0628\u0647\u200c\u0637\u0648\u0631 \u0642\u0637\u0639\u06cc \u0645\u062a\u0648\u0642\u0641 \u06a9\u0646\u0647. R8\u060c \u0628\u0631\u0631\u0633\u06cc Debugger\u060c \u06a9\u0646\u062a\u0631\u0644 Certificate \u0627\u0645\u0636\u0627\u060c \u062c\u0633\u062a\u200c\u0648\u062c\u0648\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0645\u0634\u06a9\u0648\u06a9 \u0648 \u0628\u0631\u0631\u0633\u06cc Debuggable \u0628\u0648\u062f\u0646 \u0641\u0642\u0637 \u0647\u0632\u06cc\u0646\u0647 \u062d\u0645\u0644\u0647 \u0631\u0648 \u0628\u0627\u0644\u0627 \u0645\u06cc\u200c\u0628\u0631\u0646 \u0648 \u0633\u06cc\u06af\u0646\u0627\u0644\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0628\u0631\u0627\u06cc \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0641\u0627\u0639 \u0627\u0635\u0644\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc Backend \u0628\u0627\u0634\u0647. \u0633\u0631\u0648\u0631 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631\u060c \u0648\u0636\u0639\u06cc\u062a Premium\u060c \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627 \u06cc\u0627 \u062a\u0635\u0645\u06cc\u0645\u200c\u0647\u0627\u06cc \u0627\u0631\u0633\u0627\u0644\u200c\u0634\u062f\u0647 \u0627\u0632 \u0627\u067e \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u0646\u0647. \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u062d\u0633\u0627\u0633 \u0647\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0627\u0632 Play Integrity API \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645\u060c Hash \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0645\u0647\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u062f\u0627\u062e\u0644 <code>requestHash<\/code> \u0628\u0630\u0627\u0631\u06cc\u0645 \u0648 verdict \u0631\u0648 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645. \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u0633\u0627\u0633 \u0686\u0646\u062f \u0633\u06cc\u06af\u0646\u0627\u0644 \u0645\u062e\u062a\u0644\u0641 \u062a\u0635\u0645\u06cc\u0645 \u0628\u06af\u06cc\u0631\u0647 \u06a9\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0648 \u0645\u062c\u0627\u0632\u060c \u0645\u062d\u062f\u0648\u062f \u06cc\u0627 \u0645\u0633\u062f\u0648\u062f \u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0635\u0644 \u0645\u0647\u0645 \u0627\u06cc\u0646 \u062f\u0631\u0633 \u0627\u06cc\u0646\u0647: <strong>\u0633\u0639\u06cc \u0646\u06a9\u0646 Hook \u0631\u0648 \u0641\u0642\u0637 \u0628\u0627 \u06cc\u06a9 \u0645\u062a\u062f \u062a\u0634\u062e\u06cc\u0635 \u0628\u062f\u06cc\u061b \u06a9\u0627\u0631\u06cc \u06a9\u0646 \u06a9\u0647 \u062d\u062a\u06cc \u0628\u0627 Hook \u0634\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u0645\u0647\u0627\u062c\u0645 \u0646\u062a\u0648\u0646\u0647 \u0633\u0631\u0648\u0631 \u0631\u0648 \u0645\u062c\u0628\u0648\u0631 \u0628\u0647 \u0627\u0646\u062c\u0627\u0645 \u0639\u0645\u0644\u06cc\u0627\u062a \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u06a9\u0646\u0647.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u067e\u0646\u062c\u0627\u0647\u200c\u0648\u062f\u0648\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">\u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 Root Abuse<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0635\u0644\u0627\u064b Root \u0634\u062f\u0646 \u06af\u0648\u0634\u06cc \u0686\u0647 \u062a\u063a\u06cc\u06cc\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647\u061f<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-01-1-768x1024.avif\" alt=\"\" class=\"wp-image-6153\" srcset=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-01-1-768x1024.avif 768w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-01-1-225x300.avif 225w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-01-1.avif 1086w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u062d\u0627\u0644\u062a \u0639\u0627\u062f\u06cc\u060c \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u062f\u0627\u062e\u0644 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u062c\u062f\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0627\u062c\u0627\u0632\u0647 \u0646\u0645\u06cc\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u0628\u0647\u200c\u0631\u0627\u062d\u062a\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u060c \u062d\u0627\u0641\u0638\u0647 \u0648 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u062e\u0635\u0648\u0635\u06cc \u0647\u0645\u062f\u06cc\u06af\u0647 \u0631\u0648 \u0628\u062e\u0648\u0646\u0646. Root \u0634\u062f\u0646 \u062f\u0633\u062a\u06af\u0627\u0647 \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u06a9\u0627\u0631\u0628\u0631 \u06cc\u0627 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u0631\u0648\u06cc \u06af\u0648\u0634\u06cc \u0628\u0647 \u0633\u0637\u062d \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0628\u0627\u0644\u0627\u062a\u0631\u06cc \u0628\u0631\u0633\u0646 \u0648 \u0628\u0639\u0636\u06cc \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645\u200c\u0639\u0627\u0645\u0644 \u0631\u0648 \u062f\u0648\u0631 \u0628\u0632\u0646\u0646. \u062f\u0631 \u0686\u0646\u06cc\u0646 \u0645\u062d\u06cc\u0637\u06cc \u0645\u0645\u06a9\u0646\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u062e\u0635\u0648\u0635\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u0627\u0646\u062f\u0647 \u0628\u0634\u0646\u060c \u062a\u0648\u06a9\u0646\u200c\u0647\u0627 \u0627\u0632 \u062d\u0627\u0641\u0638\u0647 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0628\u0634\u0646\u060c \u0631\u0641\u062a\u0627\u0631 \u0645\u062a\u062f\u0647\u0627 \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u0647 \u06cc\u0627 \u0646\u0633\u062e\u0647 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u062c\u0631\u0627 \u0628\u0634\u0647. \u0627\u0644\u0628\u062a\u0647 Root \u0628\u0648\u062f\u0646 \u062f\u0633\u062a\u06af\u0627\u0647 \u0628\u0647\u200c\u062a\u0646\u0647\u0627\u06cc\u06cc \u062b\u0627\u0628\u062a \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647 \u06a9\u0647 \u0635\u0627\u062d\u0628 \u06af\u0648\u0634\u06cc \u0645\u0647\u0627\u062c\u0645\u0647\u061b \u062e\u06cc\u0644\u06cc\u200c\u0647\u0627 \u0628\u0631\u0627\u06cc \u0646\u0635\u0628 \u0631\u0627\u0645 \u0633\u0641\u0627\u0631\u0634\u06cc\u060c \u0634\u062e\u0635\u06cc\u200c\u0633\u0627\u0632\u06cc \u0633\u06cc\u0633\u062a\u0645 \u06cc\u0627 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u062e\u0648\u062f\u0634\u0648\u0646 \u0631\u0648 Root \u0645\u06cc\u200c\u06a9\u0646\u0646. \u0645\u0633\u0626\u0644\u0647 \u0645\u0627 \u062e\u0648\u062f Root \u0646\u06cc\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 <strong>\u0633\u0648\u0621\u0627\u0633\u062a\u0641\u0627\u062f\u0647\u200c\u0627\u06cc\u0647 \u06a9\u0647 \u0628\u0627 \u06a9\u0645\u06a9 \u062f\u0633\u062a\u0631\u0633\u06cc Root \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u0634\u0647<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u062a\u0639\u062f\u0627\u062f \u0647\u0634\u062f\u0627\u0631\u0647\u0627\u06cc \u0631\u0627\u06cc\u06af\u0627\u0646 \u0631\u0648 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u06cc\u0645. \u06a9\u0627\u0631\u0628\u0631 \u0639\u0627\u062f\u06cc \u0641\u0642\u0637 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u067e\u0646\u062c \u0647\u0634\u062f\u0627\u0631 \u0642\u06cc\u0645\u062a \u0628\u0633\u0627\u0632\u0647\u060c \u0627\u0645\u0627 \u06a9\u0627\u0631\u0628\u0631 Premium \u0627\u062c\u0627\u0632\u0647 \u0633\u0627\u062e\u062a \u062a\u0639\u062f\u0627\u062f \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0648 \u062f\u0627\u0631\u0647. \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 Root\u0634\u062f\u0647\u060c \u0645\u0647\u0627\u062c\u0645 \u0645\u0645\u06a9\u0646\u0647 \u0645\u0642\u062f\u0627\u0631 \u0645\u062d\u0644\u06cc <code>isPremium<\/code> \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647\u060c \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062f\u0627\u062e\u0644\u06cc \u0631\u0648 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0646\u0647 \u06cc\u0627 \u0646\u062a\u06cc\u062c\u0647 \u0645\u062a\u062f \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0631\u0648 Hook \u06a9\u0646\u0647. \u0627\u06af\u0647 \u0633\u0631\u0648\u0631 \u0628\u0647 \u0646\u062a\u06cc\u062c\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0627\u067e \u0641\u0631\u0633\u062a\u0627\u062f\u0647 \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u0646\u0647\u060c \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0631\u0648 \u062f\u0648\u0631 \u0628\u0632\u0646\u0647. \u067e\u0633 \u0627\u0648\u0644\u06cc\u0646 \u0627\u0635\u0644 \u0627\u06cc\u0646 \u062f\u0631\u0633 \u0627\u06cc\u0646\u0647 \u06a9\u0647 Root Abuse \u0631\u0648 \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u0628\u0627 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc Root \u062d\u0644 \u06a9\u0646\u06cc\u0645\u061b \u0628\u0627\u06cc\u062f \u0645\u0639\u0645\u0627\u0631\u06cc \u0631\u0648 \u0637\u0648\u0631\u06cc \u0628\u0633\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u062d\u062a\u06cc \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 Root\u0634\u062f\u0647\u060c \u062a\u0635\u0645\u06cc\u0645\u200c\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0647\u0645\u0686\u0646\u0627\u0646 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0633\u0631\u0648\u0631 \u0628\u0645\u0648\u0646\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0634\u062e\u06cc\u0635 Root \u0628\u0627 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0633\u0648\u0621\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0641\u0631\u0642 \u062f\u0627\u0631\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u06cc\u0644\u06cc \u0627\u0632 \u0622\u0645\u0648\u0632\u0634\u200c\u0647\u0627 \u0686\u0646\u062f \u0645\u0633\u06cc\u0631 \u0645\u062b\u0644 <code>\/system\/bin\/su<\/code> \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0648 \u0628\u0639\u062f \u0645\u06cc\u06af\u0646 \u00ab\u062f\u0633\u062a\u06af\u0627\u0647 Root \u0634\u062f\u0647 \u0627\u0633\u062a\u00bb. \u0627\u06cc\u0646 \u0646\u0648\u0639 \u062a\u0634\u062e\u06cc\u0635 \u0645\u0645\u06a9\u0646\u0647 \u0628\u0639\u0636\u06cc \u062f\u0633\u062a\u06af\u0627\u0647\u200c\u0647\u0627 \u0631\u0648 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u0642\u0627\u0628\u0644\u200c\u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u0627\u0645\u0644 \u0646\u06cc\u0633\u062a. \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc Root \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0648 Package\u0647\u0627\u06cc \u062e\u0648\u062f\u0634\u0648\u0646 \u0631\u0648 \u0645\u062e\u0641\u06cc \u06a9\u0646\u0646\u060c \u0646\u062a\u06cc\u062c\u0647 \u0645\u062a\u062f\u0647\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0646 \u06cc\u0627 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u0645\u062d\u06cc\u0637 \u0638\u0627\u0647\u0631\u0627\u064b \u0633\u0627\u0644\u0645\u06cc \u0628\u0633\u0627\u0632\u0646. \u0627\u0632 \u0637\u0631\u0641 \u062f\u06cc\u06af\u0631\u060c \u0628\u0639\u0636\u06cc \u062f\u0633\u062a\u06af\u0627\u0647\u200c\u0647\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc\u060c \u0631\u0627\u0645\u200c\u0647\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u06cc\u0627 \u0645\u062d\u06cc\u0637\u200c\u0647\u0627\u06cc \u062e\u0627\u0635 \u0645\u0645\u06a9\u0646\u0647 \u0628\u062f\u0648\u0646 \u0633\u0648\u0621\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0648\u0627\u0642\u0639\u06cc \u0628\u0639\u0636\u06cc \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627\u06cc Root \u0631\u0648 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0647\u062a\u0631\u0647 \u0628\u06cc\u0646 \u0633\u0647 \u0645\u0641\u0647\u0648\u0645 \u062a\u0641\u0627\u0648\u062a \u0628\u0630\u0627\u0631\u06cc\u0645. \u0645\u0641\u0647\u0648\u0645 \u0627\u0648\u0644 <strong>Root Detection<\/strong> \u0627\u0633\u062a\u061b \u06cc\u0639\u0646\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0633\u0637\u062d \u0628\u0627\u0644\u0627. \u0645\u0641\u0647\u0648\u0645 \u062f\u0648\u0645 <strong>Device Integrity<\/strong> \u0627\u0633\u062a\u061b \u06cc\u0639\u0646\u06cc \u0627\u0631\u0632\u06cc\u0627\u0628\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0633\u06cc\u0633\u062a\u0645\u200c\u0639\u0627\u0645\u0644\u060c Bootloader \u0648 \u0646\u0633\u062e\u0647 \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0686\u0642\u062f\u0631 \u0642\u0627\u0628\u0644\u200c\u0627\u0639\u062a\u0645\u0627\u062f \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc\u0631\u0633\u0646. \u0645\u0641\u0647\u0648\u0645 \u0633\u0648\u0645 <strong>Abuse Prevention<\/strong> \u0627\u0633\u062a\u061b \u06cc\u0639\u0646\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u062a\u0648\u0646\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0627\u0646\u062c\u0627\u0645 \u0628\u062f\u0647. \u0645\u0648\u0631\u062f \u0633\u0648\u0645 \u0647\u062f\u0641 \u0627\u0635\u0644\u06cc \u0645\u0627\u0633\u062a. \u062f\u0648 \u0645\u0648\u0631\u062f \u0627\u0648\u0644 \u0641\u0642\u0637 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0646 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u0646 \u0628\u0647 \u0647\u062f\u0641 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0635\u0645\u06cc\u0645\u200c\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0631\u0648 \u0647\u06cc\u0686\u200c\u0648\u0642\u062a \u0628\u0647 \u06a9\u0644\u0627\u06cc\u0646\u062a \u0646\u0633\u067e\u0627\u0631<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0647\u0634\u062f\u0627\u0631 \u0642\u06cc\u0645\u062a \u0686\u0646\u06cc\u0646 \u0645\u062f\u0644\u06cc \u0631\u0648 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0628\u0641\u0631\u0633\u062a\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class CreateAlertRequest(\n    val userId: Long,\n    val productId: Long,\n    val targetPrice: Long,\n    val currentAlertCount: Int,\n    val isPremium: Boolean\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">CreateAlertRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> userId: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> productId: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> targetPrice: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> currentAlertCount: <\/span><span style=\"color: #6F42C1\">Int<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> isPremium: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0645\u062f\u0644 \u0627\u0632 \u0646\u0638\u0631 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0645\u0634\u06a9\u0644 \u062f\u0627\u0631\u0647. \u062a\u0645\u0627\u0645 \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631\u0647\u0627 \u062f\u0627\u062e\u0644 \u062f\u0633\u062a\u06af\u0627\u0647 \u0633\u0627\u062e\u062a\u0647 \u0645\u06cc\u0634\u0646 \u0648 \u0631\u0648\u06cc \u06cc\u06a9 \u06af\u0648\u0634\u06cc Root\u0634\u062f\u0647 \u0642\u0627\u0628\u0644 \u062a\u063a\u06cc\u06cc\u0631\u0646. \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 <code>isPremium<\/code> \u0631\u0648 <code>true<\/code> \u06a9\u0646\u0647\u060c \u062a\u0639\u062f\u0627\u062f \u0647\u0634\u062f\u0627\u0631\u0647\u0627 \u0631\u0648 \u0635\u0641\u0631 \u0628\u0641\u0631\u0633\u062a\u0647 \u06cc\u0627 \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062f\u06cc\u06af\u0631\u06cc \u0631\u0648 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u0647. \u0645\u062f\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u0634\u0627\u0645\u0644 \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u0628\u0627\u0634\u0647 \u06a9\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u06a9\u0627\u0631\u0628\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u06cc\u200c\u06a9\u0646\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class CreateAlertRequest(\n    val productId: Long,\n    val targetPrice: Long\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">CreateAlertRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> productId: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> targetPrice: <\/span><span style=\"color: #6F42C1\">Long<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0627\u0632 Access Token \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u0647\u060c \u0646\u0648\u0639 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0631\u0648 \u0627\u0632 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062e\u0648\u062f\u0634 \u0628\u062e\u0648\u0646\u0647 \u0648 \u062a\u0639\u062f\u0627\u062f \u0647\u0634\u062f\u0627\u0631\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0648 \u062e\u0648\u062f\u0634 \u0628\u0634\u0645\u0631\u0647. \u0645\u0646\u0637\u0642 \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0634\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$userId = getAuthenticatedUserId();\n$productId = (int) $request&#91;'productId'&#93;;\n$targetPrice = (int) $request&#91;'targetPrice'&#93;;\n\n$user = findUserById($userId);\n\nif (!$user) {\n    http_response_code(401);\n    exit;\n}\n\n$alertCount = countActiveAlerts($userId);\n\n$maximumAlerts = $user&#91;'is_premium'&#93; ? 100 : 5;\n\nif ($alertCount >= $maximumAlerts) {\n    http_response_code(403);\n\n    echo json_encode(&#91;\n        'message' => 'Alert limit reached.'\n    &#93;);\n\n    exit;\n}\n\ncreateAlert(\n    userId: $userId,\n    productId: $productId,\n    targetPrice: $targetPrice\n);\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">$userId <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getAuthenticatedUserId<\/span><span style=\"color: #24292E\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$productId <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> (int) $request&#91;<\/span><span style=\"color: #032F62\">&#39;productId&#39;<\/span><span style=\"color: #24292E\">&#93;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$targetPrice <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> (int) $request&#91;<\/span><span style=\"color: #032F62\">&#39;targetPrice&#39;<\/span><span style=\"color: #24292E\">&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$user <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">findUserById<\/span><span style=\"color: #24292E\">($userId);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #24292E\">$user) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">http_response_code<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">401<\/span><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    exit;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$alertCount <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">countActiveAlerts<\/span><span style=\"color: #24292E\">($userId);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$maximumAlerts <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> $user&#91;<\/span><span style=\"color: #032F62\">&#39;is_premium&#39;<\/span><span style=\"color: #24292E\">&#93; ? <\/span><span style=\"color: #005CC5\">100<\/span><span style=\"color: #24292E\"> : <\/span><span style=\"color: #6F42C1\">5<\/span><span style=\"color: #24292E\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> ($alertCount <\/span><span style=\"color: #D73A49\">&gt;=<\/span><span style=\"color: #24292E\"> $maximumAlerts) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">http_response_code<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">403<\/span><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    echo <\/span><span style=\"color: #6F42C1\">json_encode<\/span><span style=\"color: #24292E\">(&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #032F62\">&#39;message&#39;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=&gt;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&#39;Alert limit reached.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    &#93;);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    exit;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6F42C1\">createAlert<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    userId: $userId,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    productId: $productId,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    targetPrice: $targetPrice<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u062a\u06cc \u0627\u06af\u0647 \u0645\u0647\u0627\u062c\u0645 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc Premium \u0631\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0646\u0647\u060c \u062f\u06a9\u0645\u0647\u200c\u0647\u0627\u06cc \u0645\u062e\u0641\u06cc \u0631\u0648 \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u0647 \u06cc\u0627 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0645\u062d\u0644\u06cc \u0631\u0648 \u062d\u0630\u0641 \u06a9\u0646\u0647\u060c \u0633\u0631\u0648\u0631 \u0647\u0645\u0686\u0646\u0627\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0631\u0648 \u0631\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u06cc\u0646 \u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u062f\u0641\u0627\u0639 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 Root Abuse \u0627\u0633\u062a\u061b \u0646\u0647 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062e\u0627\u0635 \u0631\u0648\u06cc \u06af\u0648\u0634\u06cc.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0628\u0627 \u06cc\u06a9 \u0628\u0631\u0631\u0633\u06cc \u0645\u062d\u0644\u06cc \u0633\u0627\u062f\u0647 \u0634\u0631\u0648\u0639 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0631\u0631\u0633\u06cc\u200c\u0647\u0627\u06cc \u0645\u062d\u0644\u06cc \u0642\u0637\u0639\u06cc \u0646\u06cc\u0633\u062a\u0646\u060c \u0647\u0645\u0686\u0646\u0627\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 Signal \u0627\u0648\u0644\u06cc\u0647 \u0645\u0641\u06cc\u062f \u0628\u0627\u0634\u0646. \u0645\u062b\u0644\u0627\u064b \u0648\u062c\u0648\u062f \u0641\u0627\u06cc\u0644 <code>su<\/code>\u060c Package\u0647\u0627\u06cc \u0634\u0646\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a Root\u060c Build Tag\u0647\u0627\u06cc \u063a\u06cc\u0631\u0645\u0639\u0645\u0648\u0644 \u06cc\u0627 \u0642\u0627\u0628\u0644\u200c\u0646\u0648\u0634\u062a\u0646 \u0628\u0648\u062f\u0646 \u0628\u0639\u0636\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645\u06cc \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0631\u06cc\u0633\u06a9 \u0645\u062d\u06cc\u0637 \u0631\u0648 \u0628\u0627\u0644\u0627\u062a\u0631 \u0628\u0628\u0631\u0647. \u0628\u0647\u062a\u0631\u0647 \u0627\u06cc\u0646 \u0628\u0631\u0631\u0633\u06cc\u200c\u0647\u0627 \u0631\u0648 \u062f\u0627\u062e\u0644 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0645\u0633\u062a\u0642\u0644 \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645 \u0648 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0648 \u0628\u0647 \u0634\u06a9\u0644 \u0686\u0646\u062f \u0646\u0634\u0627\u0646\u0647 \u0628\u0631\u06af\u0631\u062f\u0648\u0646\u06cc\u0645\u060c \u0646\u0647 \u06cc\u06a9 Boolean \u0642\u0637\u0639\u06cc.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class RootSignals(\n    val suBinaryFound: Boolean,\n    val rootManagerFound: Boolean,\n    val suspiciousBuildTags: Boolean,\n    val dangerousSystemProperties: Boolean\n) {\n    val score: Int\n        get() {\n            var result = 0\n\n            if (suBinaryFound) result += 3\n            if (rootManagerFound) result += 2\n            if (suspiciousBuildTags) result += 1\n            if (dangerousSystemProperties) result += 2\n\n            return result\n        }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">RootSignals<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> suBinaryFound: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> rootManagerFound: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> suspiciousBuildTags: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> dangerousSystemProperties: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> score: <\/span><span style=\"color: #6F42C1\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">get<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">var<\/span><span style=\"color: #24292E\"> result <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (suBinaryFound) result <\/span><span style=\"color: #D73A49\">+=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (rootManagerFound) result <\/span><span style=\"color: #D73A49\">+=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (suspiciousBuildTags) result <\/span><span style=\"color: #D73A49\">+=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (dangerousSystemProperties) result <\/span><span style=\"color: #D73A49\">+=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">2<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u06a9\u0644\u0627\u0633 \u0628\u0631\u0631\u0633\u06cc \u0631\u0648 \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import android.content.Context\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport java.io.File\n\nclass RootSignalCollector(\n    private val context: Context\n) {\n\n    private val suPaths =\n        listOf(\n            \"\/system\/bin\/su\",\n            \"\/system\/xbin\/su\",\n            \"\/sbin\/su\",\n            \"\/system\/sd\/xbin\/su\",\n            \"\/system\/bin\/failsafe\/su\",\n            \"\/data\/local\/su\",\n            \"\/data\/local\/bin\/su\",\n            \"\/data\/local\/xbin\/su\"\n        )\n\n    private val rootManagerPackages =\n        listOf(\n            \"com.topjohnwu.magisk\",\n            \"eu.chainfire.supersu\",\n            \"com.koushikdutta.superuser\",\n            \"com.noshufou.android.su\"\n        )\n\n    fun collect(): RootSignals {\n        return RootSignals(\n            suBinaryFound = hasSuBinary(),\n            rootManagerFound = hasRootManager(),\n            suspiciousBuildTags = hasSuspiciousBuildTags(),\n            dangerousSystemProperties =\n                hasDangerousSystemProperties()\n        )\n    }\n\n    private fun hasSuBinary(): Boolean {\n        return suPaths.any { path ->\n            runCatching {\n                File(path).exists()\n            }.getOrDefault(false)\n        }\n    }\n\n    private fun hasRootManager(): Boolean {\n        return rootManagerPackages.any { packageName ->\n            isPackageInstalled(packageName)\n        }\n    }\n\n    private fun isPackageInstalled(\n        packageName: String\n    ): Boolean {\n        return try {\n            context.packageManager.getPackageInfo(\n                packageName,\n                PackageManager.PackageInfoFlags.of(0)\n            )\n\n            true\n        } catch (\n            exception: PackageManager.NameNotFoundException\n        ) {\n            false\n        }\n    }\n\n    private fun hasSuspiciousBuildTags(): Boolean {\n        return Build.TAGS\n            ?.contains(\"test-keys\") == true\n    }\n\n    private fun hasDangerousSystemProperties(): Boolean {\n        val properties =\n            listOf(\n                \"ro.debuggable\" to \"1\",\n                \"ro.secure\" to \"0\"\n            )\n\n        return properties.any { (name, expectedValue) ->\n            readSystemProperty(name) == expectedValue\n        }\n    }\n\n    private fun readSystemProperty(\n        name: String\n    ): String? {\n        return runCatching {\n            val process =\n                Runtime.getRuntime().exec(\n                    arrayOf(\n                        \"getprop\",\n                        name\n                    )\n                )\n\n            process.inputStream\n                .bufferedReader()\n                .use { reader ->\n                    reader.readLine()\n                }\n        }.getOrNull()\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.content.Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.content.pm.PackageManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.os.Build<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">java.io.File<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">RootSignalCollector<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> context: <\/span><span style=\"color: #6F42C1\">Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> suPaths <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">listOf<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\/system\/bin\/su&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\/system\/xbin\/su&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\/sbin\/su&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\/system\/sd\/xbin\/su&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\/system\/bin\/failsafe\/su&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\/data\/local\/su&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\/data\/local\/bin\/su&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\/data\/local\/xbin\/su&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> rootManagerPackages <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">listOf<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;com.topjohnwu.magisk&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;eu.chainfire.supersu&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;com.koushikdutta.superuser&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;com.noshufou.android.su&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">collect<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">RootSignals<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">RootSignals<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            suBinaryFound <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">hasSuBinary<\/span><span style=\"color: #24292E\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            rootManagerFound <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">hasRootManager<\/span><span style=\"color: #24292E\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            suspiciousBuildTags <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">hasSuspiciousBuildTags<\/span><span style=\"color: #24292E\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            dangerousSystemProperties <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">hasDangerousSystemProperties<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">hasSuBinary<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> suPaths.<\/span><span style=\"color: #6F42C1\">any<\/span><span style=\"color: #24292E\"> { path <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">runCatching<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">File<\/span><span style=\"color: #24292E\">(path).<\/span><span style=\"color: #6F42C1\">exists<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }.<\/span><span style=\"color: #6F42C1\">getOrDefault<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">false<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">hasRootManager<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> rootManagerPackages.<\/span><span style=\"color: #6F42C1\">any<\/span><span style=\"color: #24292E\"> { packageName <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">isPackageInstalled<\/span><span style=\"color: #24292E\">(packageName)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">isPackageInstalled<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        packageName: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">try<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            context.packageManager.<\/span><span style=\"color: #6F42C1\">getPackageInfo<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                packageName,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                PackageManager.PackageInfoFlags.<\/span><span style=\"color: #6F42C1\">of<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">0<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        } <\/span><span style=\"color: #D73A49\">catch<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            exception: <\/span><span style=\"color: #6F42C1\">PackageManager<\/span><span style=\"color: #24292E\">.NameNotFoundException<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #005CC5\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">hasSuspiciousBuildTags<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> Build.TAGS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ?.<\/span><span style=\"color: #6F42C1\">contains<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;test-keys&quot;<\/span><span style=\"color: #24292E\">) <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">hasDangerousSystemProperties<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> properties <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">listOf<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;ro.debuggable&quot;<\/span><span style=\"color: #24292E\"> to <\/span><span style=\"color: #032F62\">&quot;1&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;ro.secure&quot;<\/span><span style=\"color: #24292E\"> to <\/span><span style=\"color: #032F62\">&quot;0&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> properties.<\/span><span style=\"color: #6F42C1\">any<\/span><span style=\"color: #24292E\"> { (name, expectedValue) <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">readSystemProperty<\/span><span style=\"color: #24292E\">(name) <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> expectedValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">readSystemProperty<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        name: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">runCatching<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> process <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                Runtime.<\/span><span style=\"color: #6F42C1\">getRuntime<\/span><span style=\"color: #24292E\">().<\/span><span style=\"color: #6F42C1\">exec<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #6F42C1\">arrayOf<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        <\/span><span style=\"color: #032F62\">&quot;getprop&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            process.inputStream<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">bufferedReader<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">use<\/span><span style=\"color: #24292E\"> { reader <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    reader.<\/span><span style=\"color: #6F42C1\">readLine<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }.<\/span><span style=\"color: #6F42C1\">getOrNull<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u06a9\u062f \u0641\u0642\u0637 \u0686\u0646\u062f \u0646\u0634\u0627\u0646\u0647 \u0631\u0627\u06cc\u062c \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0646\u062a\u06cc\u062c\u0647 \u0645\u0646\u0641\u06cc \u0628\u0647 \u0645\u0639\u0646\u06cc \u0633\u0627\u0644\u0645 \u0628\u0648\u062f\u0646 \u0642\u0637\u0639\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u0646\u06cc\u0633\u062a \u0648 \u0646\u062a\u06cc\u062c\u0647 \u0645\u062b\u0628\u062a \u0647\u0645 \u0628\u0647\u200c\u062a\u0646\u0647\u0627\u06cc\u06cc \u0646\u0628\u0627\u06cc\u062f \u0628\u0627\u0639\u062b \u062d\u0630\u0641 \u062d\u0633\u0627\u0628 \u06cc\u0627 \u0628\u0633\u062a\u0646 \u06a9\u0627\u0645\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0634\u0647. \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc Root \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0627\u06cc\u0646 \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627 \u0631\u0648 \u0645\u062e\u0641\u06cc \u06a9\u0646\u0646 \u0648 \u062e\u0648\u062f \u062a\u0627\u0628\u0639 collect \u0647\u0645 \u0642\u0627\u0628\u0644 Hook \u0634\u062f\u0646\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u062c\u0645\u0639\u200c\u0622\u0648\u0631\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0648\u0644\u06cc\u0647\u060c \u062b\u0628\u062a Telemetry \u0648 \u0627\u0646\u062a\u062e\u0627\u0628 \u0633\u0637\u062d \u0633\u062e\u062a\u200c\u06af\u06cc\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0686\u0631\u0627 \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u0628\u06af\u06cc\u0645 \u00abRoot \u067e\u06cc\u062f\u0627 \u0634\u062f\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0628\u0628\u0646\u062f\u00bb\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0631\u0648 \u0631\u0648\u06cc \u06af\u0648\u0634\u06cc Root\u0634\u062f\u0647 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647\u060c \u0627\u0645\u0627 \u0641\u0642\u0637 \u0645\u06cc\u200c\u062e\u0648\u0627\u062f \u0642\u06cc\u0645\u062a \u06a9\u0627\u0644\u0627\u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u0631\u0648 \u0628\u0628\u06cc\u0646\u0647. \u0628\u0633\u062a\u0646 \u06a9\u0627\u0645\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0648\u0627\u06a9\u0646\u0634 \u0628\u06cc\u0634 \u0627\u0632 \u062d\u062f \u0633\u062e\u062a\u200c\u06af\u06cc\u0631\u0627\u0646\u0647\u200c\u0627\u06cc\u0647. \u0645\u0634\u0627\u0647\u062f\u0647 \u0642\u06cc\u0645\u062a \u0639\u0645\u0648\u0645\u06cc \u0631\u06cc\u0633\u06a9 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0632\u06cc\u0627\u062f\u06cc \u0646\u062f\u0627\u0631\u0647\u060c \u0627\u0645\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0627\u06cc\u0645\u06cc\u0644\u060c \u062e\u0631\u06cc\u062f \u0627\u0634\u062a\u0631\u0627\u06a9\u060c \u0645\u062f\u06cc\u0631\u06cc\u062a \u062d\u0633\u0627\u0628 \u06cc\u0627 \u0627\u0646\u062c\u0627\u0645 \u0639\u0645\u0644\u06cc\u0627\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u062d\u0633\u0627\u0633\u200c\u062a\u0631\u0647. \u067e\u0633 \u0628\u0647\u062a\u0631\u0647 \u0633\u06cc\u0627\u0633\u062a \u0645\u0627 \u0645\u062a\u0646\u0627\u0633\u0628 \u0628\u0627 \u0646\u0648\u0639 \u0639\u0645\u0644\u06cc\u0627\u062a \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0639\u0645\u0644\u06cc\u0627\u062a\u200c\u0647\u0627 \u0631\u0648 \u062f\u0633\u062a\u0647\u200c\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>enum class OperationSensitivity {\n    PUBLIC,\n    ACCOUNT,\n    FINANCIAL,\n    ADMINISTRATIVE\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">enum<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">OperationSensitivity<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    PUBLIC,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ACCOUNT,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    FINANCIAL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ADMINISTRATIVE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0646\u062a\u06cc\u062c\u0647 \u0628\u0631\u0631\u0633\u06cc \u0645\u062d\u0644\u06cc \u0631\u0648 \u0628\u0647 \u06cc\u06a9 \u062a\u0635\u0645\u06cc\u0645 \u0627\u0648\u0644\u06cc\u0647 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>enum class LocalSecurityDecision {\n    ALLOW,\n    REQUIRE_SERVER_CHECK,\n    RESTRICT_SENSITIVE_ACTIONS\n}\n\nfun decideLocally(\n    signals: RootSignals,\n    sensitivity: OperationSensitivity\n): LocalSecurityDecision {\n    if (sensitivity == OperationSensitivity.PUBLIC) {\n        return LocalSecurityDecision.ALLOW\n    }\n\n    return when {\n        signals.score >= 5 -> {\n            LocalSecurityDecision.RESTRICT_SENSITIVE_ACTIONS\n        }\n\n        signals.score >= 2 -> {\n            LocalSecurityDecision.REQUIRE_SERVER_CHECK\n        }\n\n        else -> {\n            LocalSecurityDecision.ALLOW\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">enum<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">LocalSecurityDecision<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ALLOW,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    REQUIRE_SERVER_CHECK,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    RESTRICT_SENSITIVE_ACTIONS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">decideLocally<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    signals: <\/span><span style=\"color: #6F42C1\">RootSignals<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    sensitivity: <\/span><span style=\"color: #6F42C1\">OperationSensitivity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">): <\/span><span style=\"color: #6F42C1\">LocalSecurityDecision<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (sensitivity <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> OperationSensitivity.PUBLIC) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> LocalSecurityDecision.ALLOW<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">when<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        signals.score <\/span><span style=\"color: #D73A49\">&gt;=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">5<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            LocalSecurityDecision.RESTRICT_SENSITIVE_ACTIONS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        signals.score <\/span><span style=\"color: #D73A49\">&gt;=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">2<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            LocalSecurityDecision.REQUIRE_SERVER_CHECK<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            LocalSecurityDecision.ALLOW<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u062a\u0635\u0645\u06cc\u0645 \u0647\u0646\u0648\u0632 \u0646\u0647\u0627\u06cc\u06cc \u0646\u06cc\u0633\u062a. \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 Score \u06cc\u0627 \u062e\u0631\u0648\u062c\u06cc \u062a\u0627\u0628\u0639 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647. \u0641\u0627\u06cc\u062f\u0647 \u0627\u0648\u0646 \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631\u0627\u06cc \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0648\u0644\u06cc\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633\u062a. \u062a\u0635\u0645\u06cc\u0645 \u0648\u0627\u0642\u0639\u06cc \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u062d\u0633\u0627\u0633 \u0628\u0627\u06cc\u062f \u0628\u0639\u062f \u0627\u0632 \u0628\u0631\u0631\u0633\u06cc \u0633\u0631\u0648\u0631 \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u062c\u062f\u06cc\u200c\u062a\u0631 \u0627\u0632 Play Integrity \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Play Integrity API \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0647 Backend \u06a9\u0645\u06a9 \u06a9\u0646\u0647 \u062a\u0634\u062e\u06cc\u0635 \u0628\u062f\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0632 \u0646\u0633\u062e\u0647 \u0634\u0646\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u06cc\u06a9 \u062f\u0633\u062a\u06af\u0627\u0647 \u0642\u0627\u0628\u0644\u200c\u0627\u0639\u062a\u0645\u0627\u062f \u0645\u06cc\u0627\u062f \u06cc\u0627 \u0646\u0647. \u062f\u0631 verdict \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Device Integrity\u060c \u0628\u0631\u0686\u0633\u0628 <code>MEETS_DEVICE_INTEGRITY<\/code> \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0646\u0634\u0648\u0646 \u0645\u06cc\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648\u06cc \u06cc\u06a9 \u062f\u0633\u062a\u06af\u0627\u0647 \u0648\u0627\u0642\u0639\u06cc \u0648 \u062a\u0623\u06cc\u06cc\u062f\u0634\u062f\u0647 \u0627\u062c\u0631\u0627 \u0634\u062f\u0647. \u062f\u0631 Android 13 \u0648 \u0628\u0627\u0644\u0627\u062a\u0631\u060c \u0627\u06cc\u0646 verdict \u0634\u0627\u0645\u0644 \u0627\u062b\u0628\u0627\u062a \u0633\u062e\u062a\u200c\u0627\u0641\u0632\u0627\u0631\u06cc \u0642\u0641\u0644 \u0628\u0648\u062f\u0646 Bootloader \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0635\u0648\u06cc\u0631 \u062a\u0623\u06cc\u06cc\u062f\u0634\u062f\u0647 \u0633\u0627\u0632\u0646\u062f\u0647 \u0647\u0645 \u0645\u06cc\u0634\u0647. \u0627\u06af\u0647 verdict \u062e\u0627\u0644\u06cc \u0628\u0627\u0634\u0647\u060c \u0645\u0645\u06a9\u0646\u0647 \u062f\u0633\u062a\u06af\u0627\u0647 \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627\u06cc Root\u060c Hook\u060c \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc \u0633\u06cc\u0633\u062a\u0645 \u06cc\u0627 \u0645\u062d\u06cc\u0637 \u0634\u0628\u06cc\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0634\u062f\u0647 \u0646\u0627\u0645\u0639\u062a\u0628\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0641\u0639\u0644\u06cc Play Integrity \u0631\u0648 \u0628\u0647 \u067e\u0631\u0648\u0698\u0647 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>dependencies {\n    implementation(\n        \"com.google.android.play:integrity:1.6.0\"\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">dependencies<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">implementation<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #032F62\">&quot;com.google.android.play:integrity:1.6.0&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0633\u062e\u0647 <code>1.6.0<\/code> \u062f\u0631 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a\u200c\u0647\u0627\u06cc \u0627\u0646\u062a\u0634\u0627\u0631 \u0631\u0633\u0645\u06cc \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0646\u0633\u062e\u0647 \u0645\u0646\u062a\u0634\u0631\u0634\u062f\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u062b\u0628\u062a \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc Standard Request \u0627\u0628\u062a\u062f\u0627 Provider \u0631\u0648 \u0622\u0645\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import android.content.Context\nimport com.google.android.play.core.integrity.IntegrityManagerFactory\nimport com.google.android.play.core.integrity.StandardIntegrityManager\nimport kotlinx.coroutines.tasks.await\n\nclass IntegrityProvider(\n    context: Context,\n    private val cloudProjectNumber: Long\n) {\n\n    private val manager =\n        IntegrityManagerFactory.createStandard(context)\n\n    private var preparedProvider:\n        StandardIntegrityManager.StandardIntegrityTokenProvider? =\n        null\n\n    suspend fun prepare() {\n        val request =\n            StandardIntegrityManager\n                .PrepareIntegrityTokenRequest\n                .builder()\n                .setCloudProjectNumber(\n                    cloudProjectNumber\n                )\n                .build()\n\n        preparedProvider =\n            manager\n                .prepareIntegrityToken(request)\n                .await()\n    }\n\n    suspend fun requestToken(\n        requestHash: String\n    ): String {\n        val provider =\n            preparedProvider\n                ?: error(\n                    \"Integrity provider is not prepared.\"\n                )\n\n        val request =\n            StandardIntegrityManager\n                .StandardIntegrityTokenRequest\n                .builder()\n                .setRequestHash(requestHash)\n                .build()\n\n        return provider\n            .request(request)\n            .await()\n            .token()\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.content.Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.google.android.play.core.integrity.IntegrityManagerFactory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.google.android.play.core.integrity.StandardIntegrityManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">kotlinx.coroutines.tasks.await<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">IntegrityProvider<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    context: <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> cloudProjectNumber: <\/span><span style=\"color: #6F42C1\">Long<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> manager <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        IntegrityManagerFactory.<\/span><span style=\"color: #6F42C1\">createStandard<\/span><span style=\"color: #24292E\">(context)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">var<\/span><span style=\"color: #24292E\"> preparedProvider:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        StandardIntegrityManager.StandardIntegrityTokenProvider? <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">prepare<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> request <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            StandardIntegrityManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .PrepareIntegrityTokenRequest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">setCloudProjectNumber<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    cloudProjectNumber<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        preparedProvider <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            manager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">prepareIntegrityToken<\/span><span style=\"color: #24292E\">(request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">await<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">requestToken<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        requestHash: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> provider <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preparedProvider<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ?: <\/span><span style=\"color: #6F42C1\">error<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #032F62\">&quot;Integrity provider is not prepared.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> request <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            StandardIntegrityManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .StandardIntegrityTokenRequest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">setRequestHash<\/span><span style=\"color: #24292E\">(requestHash)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> provider<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">request<\/span><span style=\"color: #24292E\">(request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">await<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">token<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0647 \u0627\u0632 <code>await<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0648\u0627\u0628\u0633\u062a\u06af\u06cc Coroutines Play Services \u0647\u0645 \u0644\u0627\u0632\u0645\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>dependencies {\n    implementation(\n        \"org.jetbrains.kotlinx:\" +\n            \"kotlinx-coroutines-play-services:\" +\n            \"CURRENT_VERSION\"\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">dependencies<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">implementation<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #032F62\">&quot;org.jetbrains.kotlinx:&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;kotlinx-coroutines-play-services:&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;CURRENT_VERSION&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0648\u06a9\u0646 Integrity \u0631\u0648 \u0628\u0647 \u0647\u0645\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062d\u0633\u0627\u0633 \u0648\u0635\u0644 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0636 \u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u062f \u0627\u06cc\u0645\u06cc\u0644 \u062d\u0633\u0627\u0628\u0634 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647. \u0646\u0628\u0627\u06cc\u062f \u06cc\u06a9 \u062a\u0648\u06a9\u0646 Integrity \u0639\u0645\u0648\u0645\u06cc \u0628\u06af\u06cc\u0631\u06cc\u0645 \u0648 \u0628\u0631\u0627\u06cc \u0686\u0646\u062f \u0639\u0645\u0644\u06cc\u0627\u062a \u0645\u062e\u062a\u0644\u0641 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. \u0628\u0647\u062a\u0631\u0647 Hash \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u0647\u0645\u0648\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0648 \u0628\u0633\u0627\u0632\u06cc\u0645 \u0648 \u062f\u0627\u062e\u0644 <code>requestHash<\/code> \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645. \u0628\u0639\u062f \u0633\u0631\u0648\u0631 \u0647\u0645\u0648\u0646 \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0631\u0648 \u062f\u0648\u0628\u0627\u0631\u0647 Hash \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647 verdict \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0647\u0645\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0648\u062f\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import android.util.Base64\nimport java.security.MessageDigest\n\nfun sha256Base64Url(\n    value: String\n): String {\n    val bytes =\n        MessageDigest\n            .getInstance(\"SHA-256\")\n            .digest(\n                value.toByteArray(\n                    Charsets.UTF_8\n                )\n            )\n\n    return Base64.encodeToString(\n        bytes,\n        Base64.URL_SAFE or\n            Base64.NO_WRAP or\n            Base64.NO_PADDING\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.util.Base64<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">java.security.MessageDigest<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">sha256Base64Url<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">value<\/span><span style=\"color: #24292E\">: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> bytes <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        MessageDigest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;SHA-256&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">digest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #D73A49\">value<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">toByteArray<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    Charsets.UTF_8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> Base64.<\/span><span style=\"color: #6F42C1\">encodeToString<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        bytes,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Base64.URL_SAFE or<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Base64.NO_WRAP or<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Base64.NO_PADDING<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062f\u0644 \u0641\u0631\u0645\u0627\u0646 \u0631\u0648 \u0628\u0627 \u06cc\u06a9 \u0646\u0645\u0627\u06cc\u0634 \u062b\u0627\u0628\u062a \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class ChangeEmailCommand(\n    val newEmail: String,\n    val requestId: String\n) {\n    fun stableContent(): String {\n        return buildString {\n            append(\"newEmail=\")\n            append(newEmail.trim().lowercase())\n            append(\"&amp;requestId=\")\n            append(requestId)\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">ChangeEmailCommand<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> newEmail: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> requestId: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">stableContent<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">buildString<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">append<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;newEmail=&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">append<\/span><span style=\"color: #24292E\">(newEmail.<\/span><span style=\"color: #6F42C1\">trim<\/span><span style=\"color: #24292E\">().<\/span><span style=\"color: #6F42C1\">lowercase<\/span><span style=\"color: #24292E\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">append<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;&amp;requestId=&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">append<\/span><span style=\"color: #24292E\">(requestId)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 Repository \u0642\u0628\u0644 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c \u062a\u0648\u06a9\u0646 Integrity \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class ChangeEmailRequest(\n    val newEmail: String,\n    val requestId: String,\n    val integrityToken: String\n)\n\nclass AccountRepository(\n    private val accountApi: AccountApi,\n    private val integrityProvider: IntegrityProvider\n) {\n\n    suspend fun changeEmail(\n        command: ChangeEmailCommand\n    ) {\n        val requestHash =\n            sha256Base64Url(\n                command.stableContent()\n            )\n\n        val integrityToken =\n            integrityProvider.requestToken(\n                requestHash\n            )\n\n        accountApi.changeEmail(\n            ChangeEmailRequest(\n                newEmail = command.newEmail,\n                requestId = command.requestId,\n                integrityToken = integrityToken\n            )\n        )\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">ChangeEmailRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> newEmail: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> requestId: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> integrityToken: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">AccountRepository<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> accountApi: <\/span><span style=\"color: #6F42C1\">AccountApi<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> integrityProvider: <\/span><span style=\"color: #6F42C1\">IntegrityProvider<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">changeEmail<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        command: <\/span><span style=\"color: #6F42C1\">ChangeEmailCommand<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> requestHash <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">sha256Base64Url<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                command.<\/span><span style=\"color: #6F42C1\">stableContent<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> integrityToken <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            integrityProvider.<\/span><span style=\"color: #6F42C1\">requestToken<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                requestHash<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        accountApi.<\/span><span style=\"color: #6F42C1\">changeEmail<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">ChangeEmailRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                newEmail <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> command.newEmail,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                requestId <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> command.requestId,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                integrityToken <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> integrityToken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062a\u0648\u06a9\u0646 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u0627\u06cc\u062f \u0628\u0647 Backend \u0641\u0631\u0633\u062a\u0627\u062f\u0647 \u0628\u0634\u0647 \u0648 \u0633\u0631\u0648\u0631 \u0628\u0627 API \u0631\u0633\u0645\u06cc \u06af\u0648\u06af\u0644 \u0627\u0648\u0646 \u0631\u0648 Decode \u0648 Verify \u06a9\u0646\u0647. \u06af\u0648\u06af\u0644 \u0635\u0631\u0627\u062d\u062a\u0627\u064b \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 verdict \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0628\u0631\u0631\u0633\u06cc \u0628\u0634\u0647 \u0648 \u0627\u0628\u062a\u062f\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c \u0627\u0632 \u062c\u0645\u0644\u0647 <code>requestHash<\/code>\u060c \u0628\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0635\u0644\u06cc \u062a\u0637\u0627\u0628\u0642 \u062f\u0627\u062f\u0647 \u0628\u0634\u0647. Standard Integrity \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u062c\u062f\u062f \u0645\u06a9\u0631\u0631 \u0627\u0632 \u06cc\u06a9 \u062a\u0648\u06a9\u0646\u060c \u0645\u062d\u0627\u0641\u0638\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 Replay \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0633\u0631\u0648\u0631 \u062f\u0642\u06cc\u0642\u0627\u064b \u0686\u0647 \u0686\u06cc\u0632\u0647\u0627\u06cc\u06cc \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u0631\u0648\u0631 \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u062f\u0646\u0628\u0627\u0644 \u0639\u0628\u0627\u0631\u062a <code>MEETS_DEVICE_INTEGRITY<\/code> \u0628\u06af\u0631\u062f\u0647. \u0627\u0648\u0644 \u0628\u0627\u06cc\u062f \u0645\u0637\u0645\u0626\u0646 \u0628\u0634\u0647 \u062a\u0648\u06a9\u0646 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0631\u0627\u06cc Package \u062e\u0648\u062f \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0635\u0627\u062f\u0631 \u0634\u062f\u0647\u060c \u0646\u0633\u062e\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 Certificate \u0627\u0645\u0636\u0627 \u062f\u0631\u0633\u062a \u0647\u0633\u062a\u0646 \u0648 Hash \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0627 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a\u06cc \u062a\u0637\u0627\u0628\u0642 \u062f\u0627\u0631\u0647. \u0628\u0639\u062f Device Integrity \u0648 \u0646\u0648\u0639 \u0639\u0645\u0644\u06cc\u0627\u062a \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u0634\u0647. \u062a\u0631\u062a\u06cc\u0628 \u0645\u0646\u0637\u0642\u06cc \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0686\u0646\u06cc\u0646 \u0686\u06cc\u0632\u06cc \u0628\u0627\u0634\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0627\u0645 Package \u062f\u0631\u0633\u062a \u0627\u0633\u062a<br>\u0646\u0633\u062e\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0642\u0627\u0628\u0644\u200c\u0642\u0628\u0648\u0644 \u0627\u0633\u062a<br>Certificate \u0627\u0645\u0636\u0627 \u0645\u0648\u0631\u062f\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0633\u062a<br>\u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0648\u0633\u0637 Google Play \u0634\u0646\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a<br>Hash \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0627 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc API \u062a\u0637\u0627\u0628\u0642 \u062f\u0627\u0631\u062f<br>Device Integrity \u0633\u06cc\u0627\u0633\u062a \u0644\u0627\u0632\u0645 \u0631\u0648 \u0628\u0631\u0622\u0648\u0631\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f<br>Access Token \u0645\u0639\u062a\u0628\u0631 \u0627\u0633\u062a<br>\u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0627\u0632\u0647 \u0627\u0646\u062c\u0627\u0645 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0648 \u062f\u0627\u0631\u062f<br>Rate Limit \u0646\u0642\u0636 \u0646\u0634\u062f\u0647 \u0627\u0633\u062a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0645\u0648\u0646\u0647 \u0633\u0627\u062f\u0647 \u062a\u0635\u0645\u06cc\u0645\u200c\u06af\u06cc\u0631\u06cc \u0633\u0645\u062a \u0633\u0631\u0648\u0631:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$verdict = decodeIntegrityToken(\n    $request&#91;'integrityToken'&#93;\n);\n\nif (\n    $verdict&#91;'packageName'&#93;\n    !== 'com.example.gheimatban'\n) {\n    denyRequest('INVALID_APP');\n}\n\n$expectedHash = createRequestHash([\n    'newEmail' => normalizeEmail(\n        $request&#91;'newEmail'&#93;\n    ),\n    'requestId' => $request&#91;'requestId'&#93;\n]);\n\nif (\n    !hash_equals(\n        $expectedHash,\n        $verdict&#91;'requestHash'&#93;\n    )\n) {\n    denyRequest('REQUEST_MISMATCH');\n}\n\n$deviceVerdicts =\n    $verdict&#91;'deviceRecognitionVerdict'&#93;\n        ?? [];\n\n$meetsDeviceIntegrity =\n    in_array(\n        'MEETS_DEVICE_INTEGRITY',\n        $deviceVerdicts,\n        true\n    );\n\nif (!$meetsDeviceIntegrity) {\n    denyRequest('DEVICE_INTEGRITY_REQUIRED');\n}\n\n$userId = getAuthenticatedUserId();\n\nchangeUserEmail(\n    userId: $userId,\n    newEmail: $request&#91;'newEmail'&#93;\n);\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">$verdict <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">decodeIntegrityToken<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    $request&#91;<\/span><span style=\"color: #032F62\">&#39;integrityToken&#39;<\/span><span style=\"color: #24292E\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    $verdict&#91;<\/span><span style=\"color: #032F62\">&#39;packageName&#39;<\/span><span style=\"color: #24292E\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">!==<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&#39;com.example.gheimatban&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">denyRequest<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&#39;INVALID_APP&#39;<\/span><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$expectedHash <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">createRequestHash<\/span><span style=\"color: #24292E\">([<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&#39;newEmail&#39;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=&gt;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">normalizeEmail<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        $request&#91;<\/span><span style=\"color: #032F62\">&#39;newEmail&#39;<\/span><span style=\"color: #24292E\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&#39;requestId&#39;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=&gt;<\/span><span style=\"color: #24292E\"> $request&#91;<\/span><span style=\"color: #032F62\">&#39;requestId&#39;<\/span><span style=\"color: #24292E\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">]);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #6F42C1\">hash_equals<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        $expectedHash,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        $verdict&#91;<\/span><span style=\"color: #032F62\">&#39;requestHash&#39;<\/span><span style=\"color: #24292E\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">denyRequest<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&#39;REQUEST_MISMATCH&#39;<\/span><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$deviceVerdicts <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    $verdict&#91;<\/span><span style=\"color: #032F62\">&#39;deviceRecognitionVerdict&#39;<\/span><span style=\"color: #24292E\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ?? [];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$meetsDeviceIntegrity <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">in_array<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #032F62\">&#39;MEETS_DEVICE_INTEGRITY&#39;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        $deviceVerdicts,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><span style=\"color: #D73A49\">!<\/span><span style=\"color: #24292E\">$meetsDeviceIntegrity) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">denyRequest<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&#39;DEVICE_INTEGRITY_REQUIRED&#39;<\/span><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">$userId <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getAuthenticatedUserId<\/span><span style=\"color: #24292E\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6F42C1\">changeUserEmail<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    userId: $userId,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    newEmail: $request&#91;<\/span><span style=\"color: #032F62\">&#39;newEmail&#39;<\/span><span style=\"color: #24292E\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u067e\u0631\u0648\u0698\u0647 \u0648\u0627\u0642\u0639\u06cc\u060c Decode \u06a9\u0631\u062f\u0646 \u062a\u0648\u06a9\u0646 \u0628\u0627\u06cc\u062f \u0627\u0632 \u0637\u0631\u06cc\u0642 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Server-to-Server \u0628\u0647 \u0633\u0631\u0648\u06cc\u0633 Play Integrity \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647 \u0648 \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0646\u0628\u0627\u06cc\u062f \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0627\u067e \u0642\u0627\u0628\u0644\u200c\u0627\u0639\u062a\u0645\u0627\u062f \u0641\u0631\u0636 \u0628\u0634\u0646. \u067e\u0627\u0633\u062e Decode\u0634\u062f\u0647 \u0634\u0627\u0645\u0644 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 <code>requestDetails<\/code>\u060c <code>appIntegrity<\/code>\u060c <code>deviceIntegrity<\/code> \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u062d\u06cc\u0637\u0647 \u06a9\u0647 Backend \u0628\u0631\u0627\u0633\u0627\u0633 \u0633\u06cc\u0627\u0633\u062a \u062e\u0648\u062f\u0634 \u0627\u0631\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0647\u0645\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a\u200c\u0647\u0627 \u0628\u0647 Strong Integrity \u0646\u06cc\u0627\u0632 \u0646\u062f\u0627\u0631\u0646<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Play Integrity \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 <code>MEETS_DEVICE_INTEGRITY<\/code> \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062f\u0631 \u0635\u0648\u0631\u062a \u0641\u0639\u0627\u0644\u200c\u0633\u0627\u0632\u06cc\u060c \u0628\u0631\u0686\u0633\u0628\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 <code>MEETS_BASIC_INTEGRITY<\/code> \u0648 <code>MEETS_STRONG_INTEGRITY<\/code> \u0647\u0645 \u0628\u062f\u0647. <code>MEETS_STRONG_INTEGRITY<\/code> \u0628\u0631\u0627\u06cc Android 13 \u0648 \u0628\u0627\u0644\u0627\u062a\u0631 \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0633\u0644\u0627\u0645\u062a \u062f\u0633\u062a\u06af\u0627\u0647\u060c \u0628\u0647 \u062c\u062f\u06cc\u062f \u0628\u0648\u062f\u0646 \u0648\u0635\u0644\u0647\u200c\u0647\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0648 Vendor \u0647\u0645 \u062a\u0648\u062c\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0633\u0637\u062d \u0628\u0631\u0627\u06cc \u062a\u0645\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0639\u0627\u062f\u06cc \u0645\u0645\u06a9\u0646\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0633\u0627\u0644\u0645\u06cc \u0631\u0648 \u06a9\u0647 \u06af\u0648\u0634\u06cc \u0642\u062f\u06cc\u0645\u06cc\u200c\u062a\u0631 \u06cc\u0627 \u0622\u067e\u062f\u06cc\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc \u0639\u0642\u0628\u200c\u0627\u0641\u062a\u0627\u062f\u0647 \u062f\u0627\u0631\u0646\u060c \u0628\u06cc\u200c\u062f\u0644\u06cc\u0644 \u0645\u0633\u062f\u0648\u062f \u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0633\u06cc\u0627\u0633\u062a \u0645\u0631\u062d\u0644\u0647\u200c\u0627\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645. \u062f\u06cc\u062f\u0646 \u0642\u06cc\u0645\u062a\u200c\u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u062d\u062a\u06cc \u0628\u062f\u0648\u0646 verdict \u06a9\u0627\u0645\u0644 \u0645\u062c\u0627\u0632 \u0628\u0627\u0634\u0647. \u0633\u0627\u062e\u062a \u0647\u0634\u062f\u0627\u0631 \u0642\u06cc\u0645\u062a \u0628\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u06a9\u0646\u062a\u0631\u0644 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u062a\u063a\u06cc\u06cc\u0631 \u0627\u06cc\u0645\u06cc\u0644\u060c \u062d\u0630\u0641 \u062d\u0633\u0627\u0628 \u06cc\u0627 \u062e\u0631\u06cc\u062f \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u0647 <code>MEETS_DEVICE_INTEGRITY<\/code> \u0648\u0627\u0628\u0633\u062a\u0647 \u0628\u0627\u0634\u0647. \u0641\u0642\u0637 \u0639\u0645\u0644\u06cc\u0627\u062a\u200c\u0647\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u0628\u0633\u06cc\u0627\u0631 \u062d\u0633\u0627\u0633 \u06cc\u0627 \u067e\u0631\u062f\u0627\u062e\u062a\u200c\u0647\u0627\u06cc \u067e\u0631\u0631\u06cc\u0633\u06a9\u060c \u062f\u0631 \u0635\u0648\u0631\u062a \u0646\u06cc\u0627\u0632 \u0648\u0627\u0642\u0639\u06cc\u060c \u0627\u0632 <code>MEETS_STRONG_INTEGRITY<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0627\u062d\u062a\u0645\u0627\u0644 False Positive \u0648 \u0645\u0633\u062f\u0648\u062f \u0634\u062f\u0646 \u0628\u06cc\u200c\u062f\u0644\u06cc\u0644 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0633\u0627\u0644\u0645 \u0631\u0648 \u06a9\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0646\u062a\u06cc\u062c\u0647 \u0633\u0631\u0648\u0631 \u0631\u0648 \u0628\u0647 \u0645\u062f\u0644 \u0642\u0627\u0628\u0644\u200c\u0645\u062f\u06cc\u0631\u06cc\u062a \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647\u062a\u0631\u0647 Backend \u0641\u0642\u0637 \u06cc\u06a9 \u062e\u0637\u0627\u06cc \u0645\u0628\u0647\u0645 403 \u0628\u0631\u0646\u06af\u0631\u062f\u0648\u0646\u0647. \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062a\u0635\u0645\u06cc\u0645 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0645\u0634\u062e\u0635\u06cc \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u062f\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>enum class SecurityAction {\n    ALLOW,\n    LIMIT,\n    REQUIRE_REAUTHENTICATION,\n    REQUIRE_INTEGRITY_REMEDIATION,\n    BLOCK\n}\n\ndata class SecurityResponse(\n    val action: SecurityAction,\n    val message: String?,\n    val integrityDialogTypeCode: Int?\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">enum<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SecurityAction<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ALLOW,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    LIMIT,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    REQUIRE_REAUTHENTICATION,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    REQUIRE_INTEGRITY_REMEDIATION,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    BLOCK<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SecurityResponse<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> action: <\/span><span style=\"color: #6F42C1\">SecurityAction<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> message: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">?,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> integrityDialogTypeCode: <\/span><span style=\"color: #6F42C1\">Int<\/span><span style=\"color: #24292E\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0627\u062e\u0644 ViewModel \u0628\u0631\u0627\u0633\u0627\u0633 \u067e\u0627\u0633\u062e \u0633\u0631\u0648\u0631 \u0631\u0641\u062a\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>when (response.action) {\n    SecurityAction.ALLOW -> {\n        continueOperation()\n    }\n\n    SecurityAction.LIMIT -> {\n        showLimitedMode()\n    }\n\n    SecurityAction.REQUIRE_REAUTHENTICATION -> {\n        navigateToLogin()\n    }\n\n    SecurityAction.REQUIRE_INTEGRITY_REMEDIATION -> {\n        showIntegrityRepair(\n            response.integrityDialogTypeCode\n        )\n    }\n\n    SecurityAction.BLOCK -> {\n        showSecurityMessage(\n            response.message\n                ?: \"\u0627\u06cc\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u0642\u0627\u0628\u0644 \u0627\u0646\u062c\u0627\u0645 \u0646\u06cc\u0633\u062a.\"\n        )\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">when<\/span><span style=\"color: #24292E\"> (response.action) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    SecurityAction.ALLOW <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">continueOperation<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    SecurityAction.LIMIT <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">showLimitedMode<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    SecurityAction.REQUIRE_REAUTHENTICATION <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">navigateToLogin<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    SecurityAction.REQUIRE_INTEGRITY_REMEDIATION <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">showIntegrityRepair<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            response.integrityDialogTypeCode<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    SecurityAction.BLOCK <\/span><span style=\"color: #D73A49\">-&gt;<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">showSecurityMessage<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            response.message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ?: <\/span><span style=\"color: #032F62\">&quot;\u0627\u06cc\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u0642\u0627\u0628\u0644 \u0627\u0646\u062c\u0627\u0645 \u0646\u06cc\u0633\u062a.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u06a9\u062a\u0647 \u0645\u0647\u0645 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u06a9\u062f Dialog \u0628\u0627\u06cc\u062f \u0627\u0632 \u062a\u0635\u0645\u06cc\u0645 \u0633\u0631\u0648\u0631 \u0628\u06cc\u0627\u062f\u060c \u0686\u0648\u0646 Backend verdict \u0648\u0627\u0642\u0639\u06cc \u0631\u0648 \u062f\u06cc\u062f\u0647. \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u0628\u0631\u0627\u0633\u0627\u0633 \u0646\u062a\u06cc\u062c\u0647 Root Detection \u0645\u062d\u0644\u06cc \u062a\u0635\u0645\u06cc\u0645 \u0628\u06af\u06cc\u0631\u0647 \u06a9\u062f\u0648\u0645 Dialog \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0641\u0631\u0635\u062a \u0627\u0635\u0644\u0627\u062d \u0648\u0636\u0639\u06cc\u062a \u0631\u0648 \u0645\u06cc\u062f\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Play Integrity \u0627\u0645\u06a9\u0627\u0646 \u0646\u0645\u0627\u06cc\u0634 Remediation Dialog \u0631\u0648 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0647. Dialog \u0646\u0648\u0639 <code>GET_INTEGRITY<\/code> \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062f\u0631 \u0628\u0639\u0636\u06cc \u0634\u0631\u0627\u06cc\u0637 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u06a9\u0645\u06a9 \u06a9\u0646\u0647 \u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u0645\u062b\u0644 \u0646\u0633\u062e\u0647 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u0646\u0635\u0628 \u063a\u06cc\u0631\u0645\u062c\u0627\u0632\u060c \u0645\u0634\u06a9\u0644 Play Services \u06cc\u0627 \u0636\u0639\u06cc\u0641 \u0628\u0648\u062f\u0646 Device Integrity \u0631\u0648 \u0628\u0631\u0637\u0631\u0641 \u06a9\u0646\u0647. \u06af\u0648\u06af\u0644 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0633\u0631\u0648\u0631 \u067e\u0633 \u0627\u0632 \u0628\u0631\u0631\u0633\u06cc verdict \u062a\u0639\u06cc\u06cc\u0646 \u06a9\u0646\u0647 \u06a9\u062f\u0648\u0645 Dialog \u0628\u0627\u06cc\u062f \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u060c \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0627\u0632 StandardIntegrityManager.showDialog \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import android.app.Activity\nimport com.google.android.play.core.integrity.StandardIntegrityDialogRequest\nimport com.google.android.play.core.integrity.StandardIntegrityManager\nimport kotlinx.coroutines.tasks.await\n\nclass IntegrityRemediationManager(\n    private val manager: StandardIntegrityManager\n) {\n\n    suspend fun showDialog(\n        activity: Activity,\n        dialogTypeCode: Int,\n        integrityToken: String\n    ): Int {\n        val request =\n            StandardIntegrityDialogRequest\n                .builder()\n                .setActivity(activity)\n                .setTypeCode(dialogTypeCode)\n                .setStandardIntegrityResponse(\n                    StandardIntegrityDialogRequest\n                        .StandardIntegrityResponse\n                        .TokenResponse(\n                            integrityToken\n                        )\n                )\n                .build()\n\n        return manager\n            .showDialog(request)\n            .await()\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.app.Activity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.google.android.play.core.integrity.StandardIntegrityDialogRequest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.google.android.play.core.integrity.StandardIntegrityManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">kotlinx.coroutines.tasks.await<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">IntegrityRemediationManager<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> manager: <\/span><span style=\"color: #6F42C1\">StandardIntegrityManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">showDialog<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        activity: <\/span><span style=\"color: #6F42C1\">Activity<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        dialogTypeCode: <\/span><span style=\"color: #6F42C1\">Int<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        integrityToken: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">Int<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> request <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            StandardIntegrityDialogRequest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">builder<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">setActivity<\/span><span style=\"color: #24292E\">(activity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">setTypeCode<\/span><span style=\"color: #24292E\">(dialogTypeCode)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">setStandardIntegrityResponse<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    StandardIntegrityDialogRequest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        .StandardIntegrityResponse<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        .<\/span><span style=\"color: #6F42C1\">TokenResponse<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                            integrityToken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> manager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">showDialog<\/span><span style=\"color: #24292E\">(request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">await<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0627\u0632 \u0628\u0633\u062a\u0647 \u0634\u062f\u0646 Dialog \u0646\u0628\u0627\u06cc\u062f \u0641\u0631\u0636 \u06a9\u0646\u06cc\u0645 \u0645\u0634\u06a9\u0644 \u062d\u062a\u0645\u0627\u064b \u062d\u0644 \u0634\u062f\u0647. \u0628\u0627\u06cc\u062f Provider \u0631\u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u0622\u0645\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645\u060c \u062a\u0648\u06a9\u0646 \u062a\u0627\u0632\u0647 \u0628\u06af\u06cc\u0631\u06cc\u0645 \u0648 \u0646\u062a\u06cc\u062c\u0647 \u062c\u062f\u06cc\u062f \u0631\u0648 \u0628\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 \u0628\u0641\u0631\u0633\u062a\u06cc\u0645. \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0631\u0633\u0645\u06cc \u0647\u0645 \u062a\u0623\u06a9\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u0646 \u0628\u0639\u062f \u0627\u0632 Remediation \u0628\u0627\u06cc\u062f \u06cc\u06a9 Integrity Check \u062a\u0627\u0632\u0647 \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0631\u0648 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 Root\u0634\u062f\u0647 \u06a9\u0645\u062a\u0631 \u0646\u06af\u0647 \u062f\u0627\u0631<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u062a\u06cc \u0628\u0627 Play Integrity \u0628\u0627\u06cc\u062f \u0641\u0631\u0636 \u06a9\u0646\u06cc\u0645 \u062f\u0633\u062a\u06af\u0627\u0647 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0647 \u062e\u0637\u0631 \u0628\u06cc\u0641\u062a\u0647. Access Token\u0647\u0627 \u0628\u0627\u06cc\u062f \u0639\u0645\u0631 \u06a9\u0648\u062a\u0627\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646 \u0648 Refresh Token \u0628\u0627\u06cc\u062f \u0642\u0627\u0628\u0644 \u0644\u063a\u0648 \u0628\u0627\u0634\u0647. \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u06a9\u0647 \u0627\u067e \u0648\u0627\u0642\u0639\u0627\u064b \u0644\u0627\u0632\u0645 \u0646\u062f\u0627\u0631\u0647 \u0646\u0628\u0627\u06cc\u062f \u062f\u0631 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u0645\u062d\u0644\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0628\u0634\u0646. \u0631\u0645\u0632\u0647\u0627\u060c Secret Key\u0647\u0627\u06cc \u0633\u0631\u0648\u0631\u060c \u062a\u0648\u06a9\u0646\u200c\u0647\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u0648 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062f\u0627\u0626\u0645\u06cc \u0633\u0631\u0648\u06cc\u0633\u200c\u0647\u0627\u06cc \u062e\u0627\u0631\u062c\u06cc \u0647\u0631\u06af\u0632 \u0646\u0628\u0627\u06cc\u062f \u062f\u0627\u062e\u0644 APK \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0646. Android Keystore \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0645\u0633\u062a\u0642\u06cc\u0645 \u06a9\u0644\u06cc\u062f\u0647\u0627 \u0631\u0648 \u0633\u062e\u062a\u200c\u062a\u0631 \u06a9\u0646\u0647\u060c \u0627\u0645\u0627 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647\u06cc \u06a9\u0647 \u0641\u0631\u0627\u06cc\u0646\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u062d\u062a \u06a9\u0646\u062a\u0631\u0644 \u0645\u0647\u0627\u062c\u0645 \u0642\u0631\u0627\u0631 \u06af\u0631\u0641\u062a\u0647\u060c \u062a\u0636\u0645\u06cc\u0646 \u0645\u0637\u0644\u0642 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0647\u062a\u0631\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a\u200c\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0628\u0647 Session \u0641\u0639\u0644\u06cc \u0645\u062a\u0635\u0644 \u0628\u0627\u0634\u0646. \u0645\u062b\u0644\u0627\u064b \u062a\u063a\u06cc\u06cc\u0631 \u0627\u06cc\u0645\u06cc\u0644 \u0641\u0642\u0637 \u0628\u0627 Access Token\u060c \u062a\u0623\u06cc\u06cc\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0631\u0645\u0632 \u06cc\u0627 \u06a9\u062f \u06cc\u06a9\u200c\u0628\u0627\u0631\u0645\u0635\u0631\u0641 \u0648 Integrity Token \u0647\u0645\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0646\u062c\u0627\u0645 \u0628\u0634\u0647. \u0627\u06af\u0647 \u0645\u0647\u0627\u062c\u0645 \u06cc\u06a9 \u062a\u0648\u06a9\u0646 \u0642\u062f\u06cc\u0645\u06cc \u0631\u0648 \u0627\u0632 \u062d\u0627\u0641\u0638\u0647 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0631\u062f\u060c \u0639\u0645\u0631 \u06a9\u0648\u062a\u0627\u0647 \u0648 \u06a9\u0646\u062a\u0631\u0644\u200c\u0647\u0627\u06cc \u0633\u0631\u0648\u0631 \u062f\u0627\u0645\u0646\u0647 \u0622\u0633\u06cc\u0628 \u0631\u0648 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc\u200c\u06a9\u0646\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Root Signal\u0647\u0627 \u0631\u0648 \u06af\u0632\u0627\u0631\u0634 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0627\u0645\u0627 \u0628\u0647\u0634\u0648\u0646 \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u0627\u0645\u0644 \u0646\u062f\u0627\u0631\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0646\u062a\u06cc\u062c\u0647 \u0628\u0631\u0631\u0633\u06cc\u200c\u0647\u0627\u06cc \u0645\u062d\u0644\u06cc \u0631\u0648 \u0628\u0631\u0627\u06cc \u062a\u062d\u0644\u06cc\u0644 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0628\u0647 \u0633\u0631\u0648\u0631 \u0628\u0641\u0631\u0633\u062a\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class DeviceSecurityTelemetry(\n    val suBinaryFound: Boolean,\n    val rootManagerFound: Boolean,\n    val suspiciousBuildTags: Boolean,\n    val localRiskScore: Int,\n    val appVersion: String,\n    val createdAt: Long\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">DeviceSecurityTelemetry<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> suBinaryFound: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> rootManagerFound: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> suspiciousBuildTags: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> localRiskScore: <\/span><span style=\"color: #6F42C1\">Int<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> appVersion: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> createdAt: <\/span><span style=\"color: #6F42C1\">Long<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u0627\u06cc\u0646 \u06af\u0632\u0627\u0631\u0634 \u0646\u0628\u0627\u06cc\u062f \u0645\u0639\u06cc\u0627\u0631 \u0642\u0637\u0639\u06cc \u0628\u0627\u0634\u0647\u060c \u0686\u0648\u0646 \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0645\u0642\u062f\u0627\u0631\u0647\u0627 \u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0628\u062f\u0647 \u06cc\u0627 \u0627\u0631\u0633\u0627\u0644 \u06af\u0632\u0627\u0631\u0634 \u0631\u0648 \u0645\u062a\u0648\u0642\u0641 \u06a9\u0646\u0647. \u06a9\u0627\u0631\u0628\u0631\u062f \u0627\u0635\u0644\u06cc Telemetry \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 \u0627\u0644\u06af\u0648\u0647\u0627\u0633\u062a. \u0645\u062b\u0644\u0627\u064b \u0627\u06af\u0647 \u06cc\u06a9 \u062d\u0633\u0627\u0628 \u0627\u0632 \u062f\u0647\u200c\u0647\u0627 \u062f\u0633\u062a\u06af\u0627\u0647 \u0628\u0627 verdict \u0646\u0627\u0645\u0639\u062a\u0628\u0631\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u067e\u0631\u062a\u0639\u062f\u0627\u062f \u0648 \u0631\u0641\u062a\u0627\u0631 \u063a\u06cc\u0631\u0639\u0627\u062f\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0647\u060c \u0633\u0631\u0648\u0631 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 Rate Limit \u0633\u062e\u062a\u200c\u062a\u0631\u06cc \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u0647 \u06cc\u0627 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u062e\u0648\u0627\u062f. Play Integrity \u062d\u062a\u06cc \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 Recent Device Activity \u0648 Device Recall \u0631\u0648 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u062f\u0647 \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u062f\u0631 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u067e\u0631\u062a\u0639\u062f\u0627\u062f \u06cc\u0627 \u0633\u0648\u0621\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062a\u06a9\u0631\u0627\u0631\u0634\u0648\u0646\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u062f\u0633\u062a\u06af\u0627\u0647 \u06a9\u0645\u06a9 \u06a9\u0646\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Root Abuse \u06cc\u0639\u0646\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0633\u0637\u062d \u0628\u0627\u0644\u0627\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u0628\u0631\u0627\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u0631\u0641\u062a\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u060c \u062f\u0648\u0631 \u0632\u062f\u0646 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627 \u06cc\u0627 \u0633\u0627\u062e\u062a \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u063a\u06cc\u0631\u0645\u062c\u0627\u0632. \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 \u0641\u0627\u06cc\u0644 <code>su<\/code> \u06cc\u0627 Package\u0647\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a Root \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u06cc\u06a9 Signal \u0627\u0648\u0644\u06cc\u0647 \u0628\u062f\u0647\u060c \u0627\u0645\u0627 \u0647\u06cc\u0686 \u0628\u0631\u0631\u0633\u06cc \u0645\u062d\u0644\u06cc\u200c\u0627\u06cc \u0642\u0637\u0639\u06cc \u0646\u06cc\u0633\u062a \u0648 \u0647\u0631 \u0645\u062a\u062f\u06cc \u062f\u0627\u062e\u0644 \u0627\u067e \u0645\u0645\u06a9\u0646\u0647 Hook \u06cc\u0627 Patch \u0628\u0634\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0646\u0628\u0627\u06cc\u062f \u062a\u0635\u0645\u06cc\u0645\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 \u0646\u0648\u0639 \u0627\u0634\u062a\u0631\u0627\u06a9\u060c \u0645\u0627\u0644\u06a9\u06cc\u062a \u062f\u0627\u062f\u0647\u060c \u062a\u0639\u062f\u0627\u062f \u0647\u0634\u062f\u0627\u0631 \u0645\u062c\u0627\u0632 \u06cc\u0627 \u0627\u062c\u0627\u0632\u0647 \u0627\u0646\u062c\u0627\u0645 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0648 \u0628\u0647 \u06a9\u0644\u0627\u06cc\u0646\u062a \u0628\u0633\u067e\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0641\u0627\u0639 \u0648\u0627\u0642\u0639\u06cc \u0686\u0646\u062f\u0644\u0627\u06cc\u0647 \u0627\u0633\u062a. \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0645\u062d\u0644\u06cc \u0631\u0648 \u062c\u0645\u0639 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0639\u0645\u0644\u06cc\u0627\u062a\u200c\u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u0648 \u062d\u0633\u0627\u0633 \u0631\u0648 \u0627\u0632 \u0647\u0645 \u062c\u062f\u0627 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0645\u0647\u0645 Play Integrity Token \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. Backend \u062a\u0648\u06a9\u0646 \u0631\u0648 Decode \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c <code>requestHash<\/code>\u060c \u0627\u0635\u0627\u0644\u062a \u0628\u0631\u0646\u0627\u0645\u0647\u060c Device Integrity\u060c Access Token\u060c \u0645\u0627\u0644\u06a9\u06cc\u062a \u062f\u0627\u062f\u0647 \u0648 Rate Limit \u0631\u0648 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0628\u0639\u062f \u062a\u0635\u0645\u06cc\u0645 \u0646\u0647\u0627\u06cc\u06cc \u0631\u0648 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. \u0627\u06af\u0647 \u0645\u0634\u06a9\u0644 \u0642\u0627\u0628\u0644\u200c\u0627\u0635\u0644\u0627\u062d \u0628\u0627\u0634\u0647\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 Remediation Dialog \u0631\u0633\u0645\u06cc Google Play \u0631\u0648 \u0646\u0645\u0627\u06cc\u0634 \u0628\u062f\u0647 \u0648 \u0628\u0639\u062f \u06cc\u06a9 Integrity Check \u062a\u0627\u0632\u0647 \u0627\u0646\u062c\u0627\u0645 \u0628\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0635\u0644 \u0645\u0647\u0645 \u0627\u06cc\u0646 \u062f\u0631\u0633 \u0627\u06cc\u0646\u0647: <strong>\u0647\u062f\u0641 \u0645\u0627 \u0645\u0645\u0646\u0648\u0639 \u06a9\u0631\u062f\u0646 \u0647\u0645\u0647 \u06af\u0648\u0634\u06cc\u200c\u0647\u0627\u06cc Root\u0634\u062f\u0647 \u0646\u06cc\u0633\u062a\u061b \u0647\u062f\u0641 \u0627\u06cc\u0646\u0647 \u06a9\u0647 Root \u0634\u062f\u0646 \u062f\u0633\u062a\u06af\u0627\u0647 \u0646\u062a\u0648\u0646\u0647 \u0642\u062f\u0631\u062a \u062a\u0635\u0645\u06cc\u0645\u200c\u06af\u06cc\u0631\u06cc \u0633\u0631\u0648\u0631 \u0631\u0648 \u0627\u0632 \u0628\u06cc\u0646 \u0628\u0628\u0631\u0647.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u062f\u0631\u0633 \u067e\u0646\u062c\u0627\u0647\u200c\u0648\u0633\u0648\u0645<\/h3>\n\n\n\n<h1 class=\"wp-block-heading\">\u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0627\u0637\u0644\u0627\u0639\u0627\u062a<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0641\u0642\u0637 \u06cc\u0639\u0646\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0631\u062f\u0646\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc \u062f\u0631\u0628\u0627\u0631\u0647 \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0631\u0641 \u0645\u06cc\u200c\u0632\u0646\u06cc\u0645\u060c \u0627\u0648\u0644\u06cc\u0646 \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u0647 \u0630\u0647\u0646 \u0645\u06cc\u0627\u062f \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc\u0647. \u0627\u0645\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0641\u0642\u0637 \u06cc\u06a9\u06cc \u0627\u0632 \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u06cc \u0645\u062d\u0627\u0641\u0638\u062a\u0647. \u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u067e\u0631\u0633\u06cc\u0645 \u00ab\u0627\u06cc\u0646 \u062f\u0627\u062f\u0647 \u0631\u0648 \u0686\u0637\u0648\u0631 Encrypt \u06a9\u0646\u06cc\u0645\u061f\u00bb \u0628\u0627\u06cc\u062f \u0628\u067e\u0631\u0633\u06cc\u0645 \u0627\u0635\u0644\u0627\u064b \u0686\u0631\u0627 \u0627\u06cc\u0646 \u062f\u0627\u062f\u0647 \u0631\u0648 \u062c\u0645\u0639 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u06a9\u062c\u0627 \u0646\u06af\u0647\u0634 \u0645\u06cc\u200c\u062f\u0627\u0631\u06cc\u0645\u060c \u062a\u0627 \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u0628\u0647\u0634 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645\u060c \u0686\u0647 \u06a9\u0633\u06cc \u0628\u0627\u06cc\u062f \u0628\u0647\u0634 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647 \u0648 \u0622\u06cc\u0627 \u0648\u0627\u0642\u0639\u0627\u064b \u0644\u0627\u0632\u0645 \u0627\u0633\u062a \u0646\u0633\u062e\u0647\u200c\u0627\u06cc \u0627\u0632 \u0627\u0648\u0646 \u0631\u0648\u06cc \u06af\u0648\u0634\u06cc \u0628\u0627\u0642\u06cc \u0628\u0645\u0648\u0646\u0647 \u06cc\u0627 \u0646\u0647. \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0627\u0635\u0644\u0627\u064b \u0630\u062e\u06cc\u0631\u0647 \u0646\u0634\u062f\u0647\u060c \u062f\u0632\u062f\u06cc\u062f\u0647 \u0647\u0645 \u0646\u0645\u06cc\u0634\u0647. \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0628\u0639\u062f \u0627\u0632 \u067e\u0627\u06cc\u0627\u0646 \u0646\u06cc\u0627\u0632 \u067e\u0627\u06a9 \u0634\u062f\u0647\u060c \u062f\u0631 \u062d\u0645\u0644\u0647 \u0622\u06cc\u0646\u062f\u0647 \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0646\u06cc\u0633\u062a. \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u06a9\u0647 \u0641\u0642\u0637 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0645\u06cc\u0634\u0646\u060c \u0627\u0632 \u0637\u0631\u06cc\u0642 \u062e\u0648\u0627\u0646\u062f\u0646 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u0645\u062d\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0641\u0634\u0627 \u0646\u0645\u06cc\u0634\u0646. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0632 <strong>\u06a9\u0645\u06cc\u0646\u0647\u200c\u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647<\/strong> \u0634\u0631\u0648\u0639 \u0645\u06cc\u0634\u0647\u060c \u0646\u0647 \u0627\u0632 \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0647\u0645\u0647 \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u062d\u0633\u0627\u0633\u06cc\u062a \u06cc\u06a9\u0633\u0627\u0646\u06cc \u0646\u062f\u0627\u0631\u0646. \u0646\u0627\u0645 \u06a9\u0627\u0644\u0627\u060c \u0642\u06cc\u0645\u062a \u0639\u0645\u0648\u0645\u06cc \u0648 \u062f\u0633\u062a\u0647\u200c\u0628\u0646\u062f\u06cc \u0645\u062d\u0635\u0648\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0639\u0645\u0648\u0645\u06cc \u0647\u0633\u062a\u0646. \u0641\u0647\u0631\u0633\u062a \u0639\u0644\u0627\u0642\u0647\u200c\u0645\u0646\u062f\u06cc\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0634\u062e\u0635\u06cc \u0645\u062d\u0633\u0648\u0628 \u0645\u06cc\u0634\u0647\u060c \u0627\u0645\u0627 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062d\u0633\u0627\u0633\u06cc\u062a \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u06cc\u0627 Refresh Token \u0631\u0648 \u0646\u062f\u0627\u0631\u0647. \u0627\u06cc\u0645\u06cc\u0644\u060c \u0634\u0645\u0627\u0631\u0647 \u062a\u0644\u0641\u0646\u060c Session\u060c \u062a\u0648\u06a9\u0646 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u067e\u0631\u062f\u0627\u062e\u062a \u062d\u0633\u0627\u0633\u200c\u062a\u0631 \u0647\u0633\u062a\u0646. \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0647\u0645 \u0627\u0635\u0648\u0644\u0627\u064b \u0646\u0628\u0627\u06cc\u062f \u0628\u0639\u062f \u0627\u0632 \u0648\u0631\u0648\u062f \u062f\u0631 \u06af\u0648\u0634\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0628\u0634\u0647. \u0627\u06cc\u0646 \u062f\u0633\u062a\u0647\u200c\u0628\u0646\u062f\u06cc \u0631\u0648\u06cc \u0645\u062d\u0644 \u0630\u062e\u06cc\u0631\u0647\u060c \u0632\u0645\u0627\u0646 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc\u060c \u0627\u0645\u06a9\u0627\u0646 Backup \u0648 \u0646\u062d\u0648\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0647\u0631 \u062f\u0627\u062f\u0647 \u0627\u062b\u0631 \u0645\u06cc\u200c\u0630\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0647\u0645 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0642\u0637 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0634\u062e\u0635\u06cc\u200c\u0627\u06cc \u0631\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u0647 \u06a9\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0627\u0648\u0646\u200c\u0647\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0647\u061b \u0686\u0648\u0646 \u06a9\u0627\u0647\u0634 \u062f\u0633\u062a\u0631\u0633\u06cc \u0648 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u062f\u0627\u062f\u0647\u060c \u0633\u0637\u062d \u062e\u0637\u0631 \u0631\u0648 \u0647\u0645 \u06a9\u0627\u0647\u0634 \u0645\u06cc\u062f\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0648\u0644 \u0645\u0634\u062e\u0635 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0686\u0647 \u0686\u06cc\u0632\u06cc \u06a9\u062c\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0628\u0634\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0686\u0646\u062f \u0645\u062d\u0644 \u0627\u0635\u0644\u06cc \u0628\u0631\u0627\u06cc \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0627\u0631\u06cc\u0645. \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc Internal Storage\u060c \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062e\u0635\u0648\u0635\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u060c DataStore \u0648 SharedPreferences \u062f\u0631 \u062d\u0627\u0644\u062a \u0639\u0627\u062f\u06cc \u062f\u0627\u062e\u0644 Sandbox \u0628\u0631\u0646\u0627\u0645\u0647 \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0646 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0646\u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u0645\u0633\u062a\u0642\u06cc\u0645 \u0628\u0647\u0634\u0648\u0646 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646. Shared Storage \u06cc\u0627 \u062d\u0627\u0641\u0638\u0647 \u0639\u0645\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc\u06cc \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u06a9\u0647 \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u06a9\u0627\u0631\u0628\u0631 \u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0647\u0645 \u0628\u0628\u06cc\u0646\u0646\u061b \u0645\u062b\u0644 \u062a\u0635\u0648\u06cc\u0631\u060c \u0648\u06cc\u062f\u0626\u0648 \u06cc\u0627 \u0633\u0646\u062f \u0642\u0627\u0628\u0644 \u0627\u0634\u062a\u0631\u0627\u06a9. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u062a\u0648\u06a9\u0646\u060c \u0641\u0627\u06cc\u0644 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644 \u062e\u0635\u0648\u0635\u06cc\u060c \u062e\u0631\u0648\u062c\u06cc \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u06cc\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0628 \u062f\u0627\u062e\u0644 Downloads \u06cc\u0627 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u0627\u0646\u062a\u062e\u0627\u0628 \u062e\u0637\u0631\u0646\u0627\u06a9\u06cc\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0631\u0633\u0645\u06cc \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u06a9\u0647 \u0646\u0628\u0627\u06cc\u062f \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0628\u0627\u0634\u0646 \u062f\u0627\u062e\u0644 Internal Storage\u060c Preferences \u06cc\u0627 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062e\u0635\u0648\u0635\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0634\u0646. \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0646\u0628\u0627\u06cc\u062f \u0628\u06cc\u200c\u062f\u0644\u06cc\u0644 \u0648\u0627\u0631\u062f Shared Storage \u0628\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0686\u0646\u06cc\u0646 \u0633\u06cc\u0627\u0633\u062a\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062a\u0646 \u0639\u0645\u0648\u0645\u06cc \u06a9\u0627\u0644\u0627\u0647\u0627 \u0648 \u0642\u06cc\u0645\u062a\u200c\u0647\u0627\u06cc Cache\u0634\u062f\u0647 \u062f\u0627\u062e\u0644 Room \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u0634\u0646. \u062a\u0646\u0638\u06cc\u0645\u0627\u062a\u06cc \u0645\u062b\u0644 \u0627\u0646\u062a\u062e\u0627\u0628 Theme \u06cc\u0627 \u0641\u0639\u0627\u0644 \u0628\u0648\u062f\u0646 \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627 \u062f\u0627\u062e\u0644 DataStore \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0646. Access Token \u0648 Refresh Token \u0628\u0647 \u0634\u06a9\u0644 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u0634\u0646. \u062a\u0635\u0627\u0648\u06cc\u0631 \u0639\u0645\u0648\u0645\u06cc \u06a9\u0627\u0644\u0627 \u0645\u06cc\u200c\u062a\u0648\u0646\u0646 \u062f\u0627\u062e\u0644 Cache \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0646. \u0631\u0645\u0632 \u0639\u0628\u0648\u0631\u060c \u06a9\u062f \u06cc\u06a9\u200c\u0628\u0627\u0631\u0645\u0635\u0631\u0641\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0645\u0644 \u06a9\u0627\u0631\u062a \u0628\u0627\u0646\u06a9\u06cc \u0648 Secret Key \u0633\u0631\u0648\u0631 \u0627\u0635\u0644\u0627\u064b \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0646\u0645\u06cc\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u06a9\u062a\u0647 \u0645\u0647\u0645 \u0627\u06cc\u0646\u0647 \u06a9\u0647 Internal Storage \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u0628\u0647 \u0645\u0639\u0646\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u062f\u0627\u062f\u0647 \u0646\u06cc\u0633\u062a. Sandbox \u062c\u0644\u0648\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u0639\u0645\u0648\u0644 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0631\u0648 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647\u060c \u0627\u0645\u0627 \u062f\u0631 \u062f\u0633\u062a\u06af\u0627\u0647 Root\u0634\u062f\u0647 \u06cc\u0627 \u0641\u0631\u0627\u06cc\u0646\u062f \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u0645\u0645\u06a9\u0646\u0647 \u0627\u06cc\u0646 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627 \u062f\u0648\u0631 \u0632\u062f\u0647 \u0628\u0634\u0646. \u067e\u0633 \u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0633\u06cc\u0627\u0631 \u062d\u0633\u0627\u0633\u060c \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u062d\u0644 \u062e\u0635\u0648\u0635\u06cc\u060c \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0647\u0645 \u0645\u0646\u0637\u0642\u06cc\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">DataStore \u0627\u0645\u0646\u200c\u062a\u0631 \u0627\u0632 SharedPreferences \u0646\u06cc\u0633\u062a\u061b \u0645\u062f\u0631\u0646\u200c\u062a\u0631\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u0642\u062f\u06cc\u0645\u06cc \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0648 \u062d\u062a\u06cc \u062a\u0648\u06a9\u0646\u200c\u0647\u0627 \u062f\u0627\u062e\u0644 <code>SharedPreferences<\/code> \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u0634\u062f\u0646. \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f\u060c Android \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataStore \u0631\u0648 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0686\u0648\u0646 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 Coroutine \u0648 Flow \u0627\u0633\u062a \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a \u0646\u0648\u0634\u062a\u0646 \u0631\u0648 \u0628\u0647 \u0634\u06a9\u0644 \u0633\u0627\u0632\u06af\u0627\u0631\u062a\u0631 \u0648 Transactional \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u062f\u0647. SharedPreferences API \u0647\u0645\u200c\u0632\u0645\u0627\u0646 \u062f\u0627\u0631\u0647\u060c \u0645\u0645\u06a9\u0646\u0647 Thread \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0648 \u0645\u062a\u0648\u0642\u0641 \u06a9\u0646\u0647 \u0648 \u062f\u0631 \u0645\u062f\u06cc\u0631\u06cc\u062a \u062e\u0637\u0627 \u0648 \u062f\u0648\u0627\u0645 \u062f\u0627\u062f\u0647 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc\u06cc \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u06cc\u06a9 \u0627\u0634\u062a\u0628\u0627\u0647 \u0645\u0647\u0645 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u062a\u0635\u0648\u0631 \u06a9\u0646\u06cc\u0645 DataStore \u062e\u0648\u062f\u0634 \u062f\u0627\u062f\u0647 \u0631\u0648 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647. DataStore \u0641\u0642\u0637 \u0645\u062d\u0644 \u0648 \u0631\u0648\u0634 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u062f\u0631\u0646\u200c\u062a\u0631\u06cc\u0647. \u0627\u06af\u0647 Access Token \u0631\u0648 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u062f\u0627\u062e\u0644 \u0627\u0648\u0646 \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645\u060c \u0645\u0642\u062f\u0627\u0631 \u062a\u0648\u06a9\u0646 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0647 \u0634\u06a9\u0644 \u0642\u0627\u0628\u0644\u200c\u062e\u0648\u0627\u0646\u062f\u0646 \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644 DataStore \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u06a9\u062f \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0639\u0627\u062f\u06cc \u0645\u0646\u0627\u0633\u0628\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val Context.settingsDataStore by preferencesDataStore(\n    name = \"settings\"\n)\n\nobject SettingsKeys {\n    val DARK_MODE = booleanPreferencesKey(\"dark_mode\")\n    val NOTIFICATIONS_ENABLED =\n        booleanPreferencesKey(\"notifications_enabled\")\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> Context.settingsDataStore <\/span><span style=\"color: #D73A49\">by<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">preferencesDataStore<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    name <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;settings&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">object<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SettingsKeys<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> DARK_MODE <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">booleanPreferencesKey<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;dark_mode&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> NOTIFICATIONS_ENABLED <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">booleanPreferencesKey<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;notifications_enabled&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0631\u0648 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class SettingsRepository(\n    private val context: Context\n) {\n\n    val darkMode: Flow&lt;Boolean> =\n        context.settingsDataStore.data.map { preferences ->\n            preferences&#91;SettingsKeys.DARK_MODE&#93; ?: false\n        }\n\n    suspend fun setDarkMode(enabled: Boolean) {\n        context.settingsDataStore.edit { preferences ->\n            preferences&#91;SettingsKeys.DARK_MODE&#93; = enabled\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SettingsRepository<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> context: <\/span><span style=\"color: #6F42C1\">Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> darkMode: <\/span><span style=\"color: #6F42C1\">Flow<\/span><span style=\"color: #24292E\">&lt;<\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">&gt; <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context.settingsDataStore.<\/span><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">map<\/span><span style=\"color: #24292E\"> { preferences <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences&#91;SettingsKeys.DARK_MODE&#93; ?: <\/span><span style=\"color: #005CC5\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">setDarkMode<\/span><span style=\"color: #24292E\">(enabled: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context.settingsDataStore.<\/span><span style=\"color: #6F42C1\">edit<\/span><span style=\"color: #24292E\"> { preferences <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences&#91;SettingsKeys.DARK_MODE&#93; <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> enabled<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0644\u06cc \u0646\u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u0628\u0647 \u062e\u0627\u0637\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataStore\u060c \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0628\u062f\u0648\u0646 \u0645\u062d\u0627\u0641\u0638\u062a \u062f\u0627\u062e\u0644 \u0627\u0648\u0646 \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>preferences&#91;ACCESS_TOKEN&#93; = accessToken\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">preferences&#91;ACCESS_TOKEN&#93; <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> accessToken<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0686\u0646\u06cc\u0646 \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u0627\u0628\u062a\u062f\u0627 \u0645\u0642\u062f\u0627\u0631 \u0631\u0648 \u0631\u0645\u0632 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u0628\u0639\u062f Ciphertext \u0631\u0648 \u062f\u0627\u062e\u0644 DataStore \u0645\u06cc\u200c\u0630\u0627\u0631\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Android Keystore \u062f\u0642\u06cc\u0642\u0627\u064b \u0627\u0632 \u0686\u06cc \u0645\u062d\u0627\u0641\u0638\u062a \u0645\u06cc\u200c\u06a9\u0646\u0647\u061f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Android Keystore \u0628\u0631\u0627\u06cc \u0646\u06af\u0647\u062f\u0627\u0631\u06cc <strong>\u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc<\/strong> \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647\u060c \u0646\u0647 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0645\u0633\u062a\u0642\u06cc\u0645 \u0627\u06cc\u0645\u06cc\u0644\u060c \u062a\u0648\u06a9\u0646 \u06cc\u0627 \u0641\u0627\u06cc\u0644. \u0648\u0642\u062a\u06cc \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u062f\u0627\u062e\u0644 Keystore \u0633\u0627\u062e\u062a\u0647 \u0645\u06cc\u0634\u0647\u060c Key Material \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u0639\u0645\u0648\u0644 \u0648\u0627\u0631\u062f \u062d\u0627\u0641\u0638\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0645\u06cc\u0634\u0647 \u0648 \u0642\u0627\u0628\u0644 Export \u06a9\u0631\u062f\u0646 \u0646\u06cc\u0633\u062a. \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u062a\u0648\u0633\u0637 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0633\u06cc\u0633\u062a\u0645 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u0634\u0647 \u0648 \u0631\u0648\u06cc \u0628\u0639\u0636\u06cc \u062f\u0633\u062a\u06af\u0627\u0647\u200c\u0647\u0627 \u06a9\u0644\u06cc\u062f \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0628\u0647 \u0633\u062e\u062a\u200c\u0627\u0641\u0632\u0627\u0631 \u0627\u0645\u0646 \u0645\u062b\u0644 TEE \u06cc\u0627 Secure Element \u0645\u062a\u0635\u0644 \u0628\u0634\u0647. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u0634\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0644\u06cc\u062f \u0631\u0648 \u0628\u0647 \u0634\u0631\u0627\u06cc\u0637 \u0645\u0634\u062e\u0635\u06cc \u0645\u062b\u0644 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631\u060c \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u062e\u0627\u0635 \u06cc\u0627 \u062d\u0627\u0644\u062a \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0645\u0634\u062e\u0635 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062f\u0644 \u06a9\u0644\u06cc \u0645\u0627 \u0627\u06cc\u0646 \u0634\u06a9\u0644\u06cc\u0647:<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Access Token<br>\u2193<br>\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u0627 \u06a9\u0644\u06cc\u062f \u062f\u0627\u062e\u0644 Android Keystore<br>\u2193<br>Ciphertext \u0648 IV<br>\u2193<br>\u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062e\u0644 DataStore<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06a9\u0644\u06cc\u062f \u0627\u0635\u0644\u06cc \u062f\u0627\u062e\u0644 \u0633\u0648\u0631\u0633\u060c <code>strings.xml<\/code>\u060c \u0641\u0627\u06cc\u0644 Asset \u06cc\u0627 DataStore \u0642\u0631\u0627\u0631 \u0646\u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u062b\u0627\u0628\u062a \u062f\u0627\u062e\u0644 APK \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0648\u0627\u0642\u0639\u06cc \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0686\u0648\u0646 \u0645\u0647\u0627\u062c\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0647\u0645 \u0641\u0627\u06cc\u0644 \u0631\u0645\u0632\u200c\u0634\u062f\u0647 \u0648 \u0647\u0645 \u06a9\u0644\u06cc\u062f \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u0627\u0648\u0646 \u0631\u0648 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u0647. \u0645\u0633\u062a\u0646\u062f\u0627\u062a Android \u0647\u0645 Hardcode \u06a9\u0631\u062f\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u062f\u0627\u062e\u0644 \u0633\u0648\u0631\u0633 \u06cc\u0627 Asset\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u06cc\u06a9 \u0622\u0633\u06cc\u0628\u200c\u067e\u0630\u06cc\u0631\u06cc \u0645\u06cc\u200c\u062f\u0648\u0646\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u0627 AES-GCM \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc Token\u0647\u0627\u06cc <strong>\u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646<\/strong> \u06cc\u06a9 \u06a9\u0644\u06cc\u062f AES \u062f\u0627\u062e\u0644 Android Keystore \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645. \u0627\u0632 \u062d\u0627\u0644\u062a <code>GCM<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0686\u0648\u0646 \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0645\u062d\u0631\u0645\u0627\u0646\u0647 \u06a9\u0631\u062f\u0646 \u062f\u0627\u062f\u0647\u060c \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc \u0634\u062f\u0646 Ciphertext \u0631\u0648 \u0647\u0645 \u062a\u0634\u062e\u06cc\u0635 \u0645\u06cc\u062f\u0647. \u0631\u0627\u0647\u0646\u0645\u0627\u06cc Cryptography \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0645\u062a\u0642\u0627\u0631\u0646\u060c \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 <code>AES\/GCM\/NoPadding<\/code> \u0631\u0648 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627 \u0645\u062f\u0644 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0631\u0648 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data class EncryptedValue(\n    val cipherText: ByteArray,\n    val initializationVector: ByteArray\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">EncryptedValue<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> cipherText: <\/span><span style=\"color: #6F42C1\">ByteArray<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> initializationVector: <\/span><span style=\"color: #6F42C1\">ByteArray<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u06a9\u0644\u0627\u0633 <code>CryptoManager<\/code> \u0631\u0648 \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban.security\n\nimport android.security.keystore.KeyGenParameterSpec\nimport android.security.keystore.KeyProperties\nimport java.security.KeyStore\nimport javax.crypto.Cipher\nimport javax.crypto.KeyGenerator\nimport javax.crypto.SecretKey\nimport javax.crypto.spec.GCMParameterSpec\n\nclass CryptoManager {\n\n    companion object {\n        private const val KEY_ALIAS =\n            \"gheimatban_auth_token_key\"\n\n        private const val ANDROID_KEYSTORE =\n            \"AndroidKeyStore\"\n\n        private const val TRANSFORMATION =\n            \"AES\/GCM\/NoPadding\"\n\n        private const val AUTH_TAG_LENGTH_BITS = 128\n    }\n\n    private val keyStore: KeyStore =\n        KeyStore.getInstance(\n            ANDROID_KEYSTORE\n        ).apply {\n            load(null)\n        }\n\n    fun encrypt(\n        plainText: ByteArray\n    ): EncryptedValue {\n        val cipher =\n            Cipher.getInstance(TRANSFORMATION)\n\n        cipher.init(\n            Cipher.ENCRYPT_MODE,\n            getOrCreateSecretKey()\n        )\n\n        val cipherText =\n            cipher.doFinal(plainText)\n\n        return EncryptedValue(\n            cipherText = cipherText,\n            initializationVector = cipher.iv\n        )\n    }\n\n    fun decrypt(\n        encryptedValue: EncryptedValue\n    ): ByteArray {\n        val cipher =\n            Cipher.getInstance(TRANSFORMATION)\n\n        val parameterSpec =\n            GCMParameterSpec(\n                AUTH_TAG_LENGTH_BITS,\n                encryptedValue.initializationVector\n            )\n\n        cipher.init(\n            Cipher.DECRYPT_MODE,\n            getOrCreateSecretKey(),\n            parameterSpec\n        )\n\n        return cipher.doFinal(\n            encryptedValue.cipherText\n        )\n    }\n\n    private fun getOrCreateSecretKey(): SecretKey {\n        val existingKey =\n            keyStore.getKey(\n                KEY_ALIAS,\n                null\n            ) as? SecretKey\n\n        if (existingKey != null) {\n            return existingKey\n        }\n\n        val keyGenerator =\n            KeyGenerator.getInstance(\n                KeyProperties.KEY_ALGORITHM_AES,\n                ANDROID_KEYSTORE\n            )\n\n        val keySpec =\n            KeyGenParameterSpec.Builder(\n                KEY_ALIAS,\n                KeyProperties.PURPOSE_ENCRYPT or\n                    KeyProperties.PURPOSE_DECRYPT\n            )\n                .setBlockModes(\n                    KeyProperties.BLOCK_MODE_GCM\n                )\n                .setEncryptionPaddings(\n                    KeyProperties.ENCRYPTION_PADDING_NONE\n                )\n                .setKeySize(256)\n                .build()\n\n        keyGenerator.init(keySpec)\n\n        return keyGenerator.generateKey()\n    }\n\n    fun deleteKey() {\n        if (keyStore.containsAlias(KEY_ALIAS)) {\n            keyStore.deleteEntry(KEY_ALIAS)\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.security<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.security.keystore.KeyGenParameterSpec<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.security.keystore.KeyProperties<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">java.security.KeyStore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">javax.crypto.Cipher<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">javax.crypto.KeyGenerator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">javax.crypto.SecretKey<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">javax.crypto.spec.GCMParameterSpec<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">CryptoManager<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">companion<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">object<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> KEY_ALIAS <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;gheimatban_auth_token_key&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> ANDROID_KEYSTORE <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;AndroidKeyStore&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> TRANSFORMATION <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;AES\/GCM\/NoPadding&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">const<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> AUTH_TAG_LENGTH_BITS <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">128<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> keyStore: <\/span><span style=\"color: #6F42C1\">KeyStore<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        KeyStore.<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ANDROID_KEYSTORE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ).<\/span><span style=\"color: #6F42C1\">apply<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">load<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">null<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">encrypt<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        plainText: <\/span><span style=\"color: #6F42C1\">ByteArray<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">EncryptedValue<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> cipher <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Cipher.<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(TRANSFORMATION)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        cipher.<\/span><span style=\"color: #6F42C1\">init<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Cipher.ENCRYPT_MODE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">getOrCreateSecretKey<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> cipherText <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            cipher.<\/span><span style=\"color: #6F42C1\">doFinal<\/span><span style=\"color: #24292E\">(plainText)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">EncryptedValue<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            cipherText <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> cipherText,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            initializationVector <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> cipher.iv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">decrypt<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        encryptedValue: <\/span><span style=\"color: #6F42C1\">EncryptedValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">ByteArray<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> cipher <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Cipher.<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(TRANSFORMATION)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> parameterSpec <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">GCMParameterSpec<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AUTH_TAG_LENGTH_BITS,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                encryptedValue.initializationVector<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        cipher.<\/span><span style=\"color: #6F42C1\">init<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Cipher.DECRYPT_MODE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">getOrCreateSecretKey<\/span><span style=\"color: #24292E\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            parameterSpec<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> cipher.<\/span><span style=\"color: #6F42C1\">doFinal<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            encryptedValue.cipherText<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getOrCreateSecretKey<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">SecretKey<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> existingKey <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            keyStore.<\/span><span style=\"color: #6F42C1\">getKey<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                KEY_ALIAS,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ) <\/span><span style=\"color: #D73A49\">as<\/span><span style=\"color: #24292E\">? SecretKey<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (existingKey <\/span><span style=\"color: #D73A49\">!=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> existingKey<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> keyGenerator <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            KeyGenerator.<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                KeyProperties.KEY_ALGORITHM_AES,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ANDROID_KEYSTORE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> keySpec <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            KeyGenParameterSpec.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                KEY_ALIAS,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                KeyProperties.PURPOSE_ENCRYPT or<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    KeyProperties.PURPOSE_DECRYPT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">setBlockModes<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    KeyProperties.BLOCK_MODE_GCM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">setEncryptionPaddings<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    KeyProperties.ENCRYPTION_PADDING_NONE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">setKeySize<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #005CC5\">256<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        keyGenerator.<\/span><span style=\"color: #6F42C1\">init<\/span><span style=\"color: #24292E\">(keySpec)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> keyGenerator.<\/span><span style=\"color: #6F42C1\">generateKey<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">deleteKey<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (keyStore.<\/span><span style=\"color: #6F42C1\">containsAlias<\/span><span style=\"color: #24292E\">(KEY_ALIAS)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            keyStore.<\/span><span style=\"color: #6F42C1\">deleteEntry<\/span><span style=\"color: #24292E\">(KEY_ALIAS)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u0648\u0644\u06cc\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c <code>getOrCreateSecretKey<\/code> \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u06f2\u06f5\u06f6 \u0628\u06cc\u062a\u06cc AES \u062f\u0627\u062e\u0644 Keystore \u0645\u06cc\u200c\u0633\u0627\u0632\u0647. \u062f\u0631 \u062f\u0641\u0639\u0627\u062a \u0628\u0639\u062f \u0647\u0645\u0627\u0646 \u06a9\u0644\u06cc\u062f \u0642\u0628\u0644\u06cc \u0631\u0648 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0648\u0646\u0647. \u0647\u0646\u06af\u0627\u0645 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc\u060c <code>Cipher<\/code> \u06cc\u06a9 IV \u062a\u0635\u0627\u062f\u0641\u06cc \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0645\u0627 \u0627\u0648\u0646 \u0631\u0648 \u06a9\u0646\u0627\u0631 Ciphertext \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. IV \u0645\u062d\u0631\u0645\u0627\u0646\u0647 \u0646\u06cc\u0633\u062a\u060c \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0644\u0627\u0632\u0645\u0647. \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0646\u0628\u0627\u06cc\u062f \u0630\u062e\u06cc\u0631\u0647 \u06cc\u0627 Export \u0628\u0634\u0647 \u062e\u0648\u062f Secret Key \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0631 \u0628\u0627\u0631 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u0627\u06cc\u062f IV \u062a\u0627\u0632\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. \u0646\u0628\u0627\u06cc\u062f \u06cc\u06a9 IV \u062b\u0627\u0628\u062a \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645 \u06cc\u0627 IV \u0639\u0645\u0644\u06cc\u0627\u062a \u0642\u0628\u0644\u06cc \u0631\u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. <code>cipher.init(Cipher.ENCRYPT_MODE, key)<\/code> \u062e\u0648\u062f\u0634 IV \u0645\u0646\u0627\u0633\u0628 \u0631\u0648 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0648 \u0645\u0627 \u0641\u0642\u0637 \u062e\u0631\u0648\u062c\u06cc \u0627\u0648\u0646 \u0631\u0648 \u0646\u06af\u0647 \u0645\u06cc\u200c\u062f\u0627\u0631\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ciphertext \u0631\u0648 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0628\u0647 String \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">DataStore Preferences \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b <code>ByteArray<\/code> \u0631\u0648 \u0630\u062e\u06cc\u0631\u0647 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u067e\u0633 Ciphertext \u0648 IV \u0631\u0648 \u0628\u0627 Base64 \u0628\u0647 String \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. Base64 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc \u0646\u06cc\u0633\u062a\u061b \u0641\u0642\u0637 \u0628\u0627\u06cc\u062a\u200c\u0647\u0627 \u0631\u0648 \u0628\u0647 \u0645\u062a\u0646 \u0642\u0627\u0628\u0644\u200c\u0630\u062e\u06cc\u0631\u0647 \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban.security\n\nimport android.util.Base64\n\nfun ByteArray.toBase64(): String {\n    return Base64.encodeToString(\n        this,\n        Base64.NO_WRAP\n    )\n}\n\nfun String.fromBase64(): ByteArray {\n    return Base64.decode(\n        this,\n        Base64.NO_WRAP\n    )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.security<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.util.Base64<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">ByteArray<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">toBase64<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> Base64.<\/span><span style=\"color: #6F42C1\">encodeToString<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #005CC5\">this<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Base64.NO_WRAP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">fromBase64<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">ByteArray<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> Base64.<\/span><span style=\"color: #6F42C1\">decode<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #005CC5\">this<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        Base64.NO_WRAP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u06cc\u06a9 \u0645\u062e\u0632\u0646 \u0645\u062e\u0635\u0648\u0635 \u062a\u0648\u06a9\u0646 \u0628\u0633\u0627\u0632\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SecureTokenStore \u0631\u0648 \u0628\u0627 Keystore \u0648 DataStore \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627 DataStore \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0648 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban.data.auth\n\nimport android.content.Context\nimport androidx.datastore.preferences.preferencesDataStore\n\nval Context.authDataStore by preferencesDataStore(\n    name = \"auth_secure\"\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.data.auth<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.content.Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.datastore.preferences.preferencesDataStore<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> Context.authDataStore <\/span><span style=\"color: #D73A49\">by<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">preferencesDataStore<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    name <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;auth_secure&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc DataStore \u0631\u0648 \u0647\u0645 \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban.data.auth\n\nimport androidx.datastore.preferences.core.stringPreferencesKey\n\nobject AuthPreferencesKeys {\n\n    val ACCESS_TOKEN_CIPHER =\n        stringPreferencesKey(\n            \"access_token_cipher\"\n        )\n\n    val ACCESS_TOKEN_IV =\n        stringPreferencesKey(\n            \"access_token_iv\"\n        )\n\n    val REFRESH_TOKEN_CIPHER =\n        stringPreferencesKey(\n            \"refresh_token_cipher\"\n        )\n\n    val REFRESH_TOKEN_IV =\n        stringPreferencesKey(\n            \"refresh_token_iv\"\n        )\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.data.auth<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.datastore.preferences.core.stringPreferencesKey<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">object<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">AuthPreferencesKeys<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> ACCESS_TOKEN_CIPHER <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">stringPreferencesKey<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;access_token_cipher&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> ACCESS_TOKEN_IV <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">stringPreferencesKey<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;access_token_iv&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> REFRESH_TOKEN_CIPHER <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">stringPreferencesKey<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;refresh_token_cipher&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> REFRESH_TOKEN_IV <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">stringPreferencesKey<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;refresh_token_iv&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u06a9\u0644\u0627\u0633 \u0627\u0635\u0644\u06cc \u0630\u062e\u06cc\u0631\u0647 \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0645\u06cc\u200c\u0646\u0648\u06cc\u0633\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.gheimatban.data.auth\n\nimport android.content.Context\nimport androidx.datastore.preferences.core.edit\nimport com.example.gheimatban.security.CryptoManager\nimport com.example.gheimatban.security.EncryptedValue\nimport com.example.gheimatban.security.fromBase64\nimport com.example.gheimatban.security.toBase64\nimport kotlinx.coroutines.flow.first\nimport java.security.GeneralSecurityException\n\nclass SecureTokenStore(\n    private val context: Context,\n    private val cryptoManager: CryptoManager\n) {\n\n    suspend fun saveTokens(\n        accessToken: String,\n        refreshToken: String\n    ) {\n        val encryptedAccessToken =\n            cryptoManager.encrypt(\n                accessToken.toByteArray(\n                    Charsets.UTF_8\n                )\n            )\n\n        val encryptedRefreshToken =\n            cryptoManager.encrypt(\n                refreshToken.toByteArray(\n                    Charsets.UTF_8\n                )\n            )\n\n        context.authDataStore.edit { preferences ->\n            preferences&#91;\n                AuthPreferencesKeys.ACCESS_TOKEN_CIPHER\n            &#93; = encryptedAccessToken.cipherText.toBase64()\n\n            preferences&#91;\n                AuthPreferencesKeys.ACCESS_TOKEN_IV\n            &#93; = encryptedAccessToken\n                .initializationVector\n                .toBase64()\n\n            preferences&#91;\n                AuthPreferencesKeys.REFRESH_TOKEN_CIPHER\n            &#93; = encryptedRefreshToken.cipherText.toBase64()\n\n            preferences&#91;\n                AuthPreferencesKeys.REFRESH_TOKEN_IV\n            &#93; = encryptedRefreshToken\n                .initializationVector\n                .toBase64()\n        }\n    }\n\n    suspend fun getAccessToken(): String? {\n        return readToken(\n            cipherKey =\n                AuthPreferencesKeys.ACCESS_TOKEN_CIPHER,\n            ivKey =\n                AuthPreferencesKeys.ACCESS_TOKEN_IV\n        )\n    }\n\n    suspend fun getRefreshToken(): String? {\n        return readToken(\n            cipherKey =\n                AuthPreferencesKeys.REFRESH_TOKEN_CIPHER,\n            ivKey =\n                AuthPreferencesKeys.REFRESH_TOKEN_IV\n        )\n    }\n\n    private suspend fun readToken(\n        cipherKey:\n            androidx.datastore.preferences.core.Preferences.Key&lt;String>,\n        ivKey:\n            androidx.datastore.preferences.core.Preferences.Key&lt;String>\n    ): String? {\n        val preferences =\n            context.authDataStore.data.first()\n\n        val cipherText =\n            preferences&#91;cipherKey&#93;\n                ?: return null\n\n        val initializationVector =\n            preferences&#91;ivKey&#93;\n                ?: return null\n\n        return try {\n            val decryptedBytes =\n                cryptoManager.decrypt(\n                    EncryptedValue(\n                        cipherText =\n                            cipherText.fromBase64(),\n                        initializationVector =\n                            initializationVector.fromBase64()\n                    )\n                )\n\n            decryptedBytes.toString(\n                Charsets.UTF_8\n            )\n        } catch (\n            exception: GeneralSecurityException\n        ) {\n            clearTokens()\n            null\n        } catch (\n            exception: IllegalArgumentException\n        ) {\n            clearTokens()\n            null\n        }\n    }\n\n    suspend fun clearTokens() {\n        context.authDataStore.edit { preferences ->\n            preferences.remove(\n                AuthPreferencesKeys.ACCESS_TOKEN_CIPHER\n            )\n\n            preferences.remove(\n                AuthPreferencesKeys.ACCESS_TOKEN_IV\n            )\n\n            preferences.remove(\n                AuthPreferencesKeys.REFRESH_TOKEN_CIPHER\n            )\n\n            preferences.remove(\n                AuthPreferencesKeys.REFRESH_TOKEN_IV\n            )\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">package<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.data.auth<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">android.content.Context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">androidx.datastore.preferences.core.edit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.security.CryptoManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.security.EncryptedValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.security.fromBase64<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">com.example.gheimatban.security.toBase64<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">kotlinx.coroutines.flow.first<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">java.security.GeneralSecurityException<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SecureTokenStore<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> context: <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> cryptoManager: <\/span><span style=\"color: #6F42C1\">CryptoManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">saveTokens<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        accessToken: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        refreshToken: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> encryptedAccessToken <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            cryptoManager.<\/span><span style=\"color: #6F42C1\">encrypt<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                accessToken.<\/span><span style=\"color: #6F42C1\">toByteArray<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    Charsets.UTF_8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> encryptedRefreshToken <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            cryptoManager.<\/span><span style=\"color: #6F42C1\">encrypt<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                refreshToken.<\/span><span style=\"color: #6F42C1\">toByteArray<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    Charsets.UTF_8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context.authDataStore.<\/span><span style=\"color: #6F42C1\">edit<\/span><span style=\"color: #24292E\"> { preferences <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.ACCESS_TOKEN_CIPHER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            &#93; <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> encryptedAccessToken.cipherText.<\/span><span style=\"color: #6F42C1\">toBase64<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.ACCESS_TOKEN_IV<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            &#93; <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> encryptedAccessToken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .initializationVector<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">toBase64<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.REFRESH_TOKEN_CIPHER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            &#93; <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> encryptedRefreshToken.cipherText.<\/span><span style=\"color: #6F42C1\">toBase64<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.REFRESH_TOKEN_IV<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            &#93; <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> encryptedRefreshToken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .initializationVector<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                .<\/span><span style=\"color: #6F42C1\">toBase64<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getAccessToken<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">readToken<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            cipherKey <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.ACCESS_TOKEN_CIPHER,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ivKey <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.ACCESS_TOKEN_IV<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getRefreshToken<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">readToken<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            cipherKey <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.REFRESH_TOKEN_CIPHER,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ivKey <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.REFRESH_TOKEN_IV<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">readToken<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        cipherKey:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            androidx.datastore.preferences.core.Preferences.Key<\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">String<\/span><span style=\"color: #D73A49\">&gt;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ivKey:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            androidx.datastore.preferences.core.Preferences.Key<\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">String<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> preferences <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            context.authDataStore.<\/span><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">first<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> cipherText <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences&#91;cipherKey&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ?: <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> initializationVector <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences&#91;ivKey&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                ?: <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">try<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> decryptedBytes <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                cryptoManager.<\/span><span style=\"color: #6F42C1\">decrypt<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #6F42C1\">EncryptedValue<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        cipherText <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                            cipherText.<\/span><span style=\"color: #6F42C1\">fromBase64<\/span><span style=\"color: #24292E\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        initializationVector <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                            initializationVector.<\/span><span style=\"color: #6F42C1\">fromBase64<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            decryptedBytes.<\/span><span style=\"color: #6F42C1\">toString<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                Charsets.UTF_8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        } <\/span><span style=\"color: #D73A49\">catch<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            exception: <\/span><span style=\"color: #6F42C1\">GeneralSecurityException<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">clearTokens<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        } <\/span><span style=\"color: #D73A49\">catch<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            exception: <\/span><span style=\"color: #6F42C1\">IllegalArgumentException<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #6F42C1\">clearTokens<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">clearTokens<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context.authDataStore.<\/span><span style=\"color: #6F42C1\">edit<\/span><span style=\"color: #24292E\"> { preferences <\/span><span style=\"color: #D73A49\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences.<\/span><span style=\"color: #6F42C1\">remove<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.ACCESS_TOKEN_CIPHER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences.<\/span><span style=\"color: #6F42C1\">remove<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.ACCESS_TOKEN_IV<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences.<\/span><span style=\"color: #6F42C1\">remove<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.REFRESH_TOKEN_CIPHER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            preferences.<\/span><span style=\"color: #6F42C1\">remove<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                AuthPreferencesKeys.REFRESH_TOKEN_IV<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0647 \u0641\u0627\u06cc\u0644 DataStore \u062e\u0631\u0627\u0628 \u06cc\u0627 \u062f\u0633\u062a\u200c\u06a9\u0627\u0631\u06cc \u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c <code>AES-GCM<\/code> \u0647\u0646\u06af\u0627\u0645 <code>doFinal<\/code> \u062e\u0637\u0627 \u0645\u06cc\u062f\u0647 \u0648 \u0645\u0627 \u062a\u0648\u06a9\u0646\u200c\u0647\u0627 \u0631\u0648 \u067e\u0627\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u062f\u0631 \u0627\u06cc\u0646 \u0634\u0631\u0627\u06cc\u0637 \u0628\u0647\u062a\u0631\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0648\u0628\u0627\u0631\u0647 \u0648\u0627\u0631\u062f \u062d\u0633\u0627\u0628 \u0628\u0634\u0647\u060c \u0646\u0647 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627 \u062f\u0627\u062f\u0647 \u0645\u0634\u06a9\u0648\u06a9 \u0627\u062f\u0627\u0645\u0647 \u0628\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062a\u0648\u062c\u0647 \u06a9\u0646 \u06a9\u0647 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u062d\u0644\u06cc \u062d\u0645\u0644\u0647 \u0631\u0648 \u063a\u06cc\u0631\u0645\u0645\u06a9\u0646 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647. \u0627\u06af\u0647 \u0645\u0647\u0627\u062c\u0645 \u06a9\u0646\u062a\u0631\u0644 \u0641\u0631\u0627\u06cc\u0646\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0645\u0645\u06a9\u0646\u0647 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 Token \u067e\u0633 \u0627\u0632 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u0634\u0647 \u0627\u0648\u0646 \u0631\u0648 \u0628\u062e\u0648\u0646\u0647. Keystore \u0648 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0627\u0632 <strong>\u062f\u0627\u062f\u0647 \u062f\u0631 \u062d\u0627\u0644\u062a \u0633\u06a9\u0648\u0646<\/strong> \u0645\u062d\u0627\u0641\u0638\u062a \u0645\u06cc\u200c\u06a9\u0646\u0646\u061b \u06cc\u0639\u0646\u06cc \u0648\u0642\u062a\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u06a9\u067e\u06cc \u06cc\u0627 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0634\u062f\u0646\u060c \u062a\u0648\u06a9\u0646 \u0641\u0648\u0631\u0627\u064b \u0642\u0627\u0628\u0644\u200c\u062e\u0648\u0627\u0646\u062f\u0646 \u0646\u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062a\u0648\u06a9\u0646 \u0631\u0648 \u0628\u06cc\u200c\u062f\u0644\u06cc\u0644 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0646\u06af\u0647 \u0646\u062f\u0627\u0631<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0627\u0632 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc\u060c Access Token \u0628\u0631\u0627\u06cc \u0645\u062f\u062a \u06a9\u0648\u062a\u0627\u0647\u06cc \u0648\u0627\u0631\u062f \u062d\u0627\u0641\u0638\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u06cc\u0634\u0647 \u062a\u0627 \u062f\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a API \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0634\u0647. \u0646\u0628\u0627\u06cc\u062f \u0627\u0648\u0646 \u0631\u0648 \u062f\u0631 \u06cc\u06a9 Singleton \u0639\u0645\u0648\u0645\u06cc\u060c \u0645\u062a\u063a\u06cc\u0631 \u0642\u0627\u0628\u0644\u200c\u062a\u063a\u06cc\u06cc\u0631 \u0633\u0631\u0627\u0633\u0631\u06cc \u06cc\u0627 <code>StateFlow<\/code> \u0642\u0627\u0628\u0644\u200c\u0645\u0634\u0627\u0647\u062f\u0647 \u062a\u0648\u0633\u0637 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0646\u06af\u0647 \u062f\u0627\u0631\u06cc\u0645. \u0647\u0645\u0686\u0646\u06cc\u0646 Token \u0646\u0628\u0627\u06cc\u062f \u0648\u0627\u0631\u062f <code>SavedStateHandle<\/code>\u060c Bundle \u06cc\u0627 Navigation Argument \u0628\u0634\u0647\u061b \u0686\u0648\u0646 \u0627\u06cc\u0646 \u0645\u062d\u0644\u200c\u0647\u0627 \u0628\u0631\u0627\u06cc \u0627\u0646\u062a\u0642\u0627\u0644 \u0648 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc State \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0646\u060c \u0646\u0647 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062f\u0644 \u0633\u0627\u062f\u0647 <code>TokenProvider<\/code> \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0641\u0642\u0637 \u0647\u0646\u06af\u0627\u0645 \u0646\u06cc\u0627\u0632 Token \u0631\u0648 \u0628\u062e\u0648\u0646\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>interface TokenProvider {\n\n    suspend fun getAccessToken(): String?\n\n    suspend fun getRefreshToken(): String?\n\n    suspend fun saveTokens(\n        accessToken: String,\n        refreshToken: String\n    )\n\n    suspend fun clear()\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">interface<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">TokenProvider<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getAccessToken<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">?<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getRefreshToken<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">?<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">saveTokens<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        accessToken: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        refreshToken: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">clear<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u0648\u0646 \u0628\u0647 <code>SecureTokenStore<\/code> \u0648\u0635\u0644 \u0645\u06cc\u0634\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class DefaultTokenProvider(\n    private val secureTokenStore: SecureTokenStore\n) : TokenProvider {\n\n    override suspend fun getAccessToken(): String? {\n        return secureTokenStore.getAccessToken()\n    }\n\n    override suspend fun getRefreshToken(): String? {\n        return secureTokenStore.getRefreshToken()\n    }\n\n    override suspend fun saveTokens(\n        accessToken: String,\n        refreshToken: String\n    ) {\n        secureTokenStore.saveTokens(\n            accessToken = accessToken,\n            refreshToken = refreshToken\n        )\n    }\n\n    override suspend fun clear() {\n        secureTokenStore.clearTokens()\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">DefaultTokenProvider<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> secureTokenStore: <\/span><span style=\"color: #6F42C1\">SecureTokenStore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) : <\/span><span style=\"color: #6F42C1\">TokenProvider<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getAccessToken<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> secureTokenStore.<\/span><span style=\"color: #6F42C1\">getAccessToken<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">getRefreshToken<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> secureTokenStore.<\/span><span style=\"color: #6F42C1\">getRefreshToken<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">saveTokens<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        accessToken: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        refreshToken: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        secureTokenStore.<\/span><span style=\"color: #6F42C1\">saveTokens<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            accessToken <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> accessToken,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            refreshToken <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> refreshToken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">clear<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        secureTokenStore.<\/span><span style=\"color: #6F42C1\">clearTokens<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0686\u0648\u0646 Interceptor \u0639\u0627\u062f\u06cc OkHttp \u062a\u0627\u0628\u0639 \u0647\u0645\u200c\u0632\u0645\u0627\u0646 \u062f\u0627\u0631\u0647\u060c \u0646\u0628\u0627\u06cc\u062f \u0628\u062f\u0648\u0646 \u0641\u06a9\u0631 \u062f\u0627\u062e\u0644 \u0627\u0648\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u0633\u0646\u06af\u06cc\u0646 Coroutine \u0627\u0646\u062c\u0627\u0645 \u0628\u062f\u06cc\u0645. \u062f\u0631 \u0645\u0639\u0645\u0627\u0631\u06cc \u0648\u0627\u0642\u0639\u06cc \u0645\u0639\u0645\u0648\u0644\u0627\u064b Access Token \u06a9\u0648\u062a\u0627\u0647\u200c\u0639\u0645\u0631 \u0631\u0648 \u062f\u0631 \u06cc\u06a9 Cache \u0645\u062d\u062f\u0648\u062f \u062d\u0627\u0641\u0638\u0647 \u0646\u06af\u0647 \u0645\u06cc\u200c\u062f\u0627\u0631\u06cc\u0645 \u0648 Refresh Token \u0641\u0642\u0637 \u0647\u0646\u06af\u0627\u0645 \u0646\u06cc\u0627\u0632 \u0627\u0632 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632 \u0627\u0645\u0646 \u062e\u0648\u0646\u062f\u0647 \u0645\u06cc\u0634\u0647. \u0646\u06a9\u062a\u0647 \u0645\u0647\u0645 \u0627\u06cc\u0646\u0647 \u06a9\u0647 Cache \u0646\u0628\u0627\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc\u060c \u0642\u0627\u0628\u0644 Log \u06cc\u0627 \u0648\u0627\u0628\u0633\u062a\u0647 \u0628\u0647 UI \u0628\u0627\u0634\u0647 \u0648 \u0647\u0646\u06af\u0627\u0645 \u062e\u0631\u0648\u062c \u06a9\u0627\u0631\u0628\u0631 \u067e\u0627\u06a9 \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0647\u0646\u06af\u0627\u0645 \u062e\u0631\u0648\u062c \u0641\u0642\u0637 \u0635\u0641\u062d\u0647 \u0631\u0648 \u0639\u0648\u0636 \u0646\u06a9\u0646<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Logout \u0648\u0627\u0642\u0639\u06cc \u06cc\u0639\u0646\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0646\u0634\u0633\u062a \u0627\u0632 \u0686\u0646\u062f \u062c\u0627 \u067e\u0627\u06a9 \u0628\u0634\u0647. \u0641\u0642\u0637 \u0631\u0641\u062a\u0646 \u0628\u0647 \u0635\u0641\u062d\u0647 Login \u06a9\u0627\u0641\u06cc \u0646\u06cc\u0633\u062a. \u0628\u0627\u06cc\u062f Access Token \u0648 Refresh Token \u0645\u062d\u0644\u06cc \u067e\u0627\u06a9 \u0628\u0634\u0646\u060c Cookie\u0647\u0627\u06cc \u0627\u062d\u062a\u0645\u0627\u0644\u06cc \u062d\u0630\u0641 \u0628\u0634\u0646\u060c \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0634\u062e\u0635\u06cc Cache\u0634\u062f\u0647 \u062f\u0631 \u0635\u0648\u0631\u062a \u0646\u06cc\u0627\u0632 \u062d\u0630\u0641 \u0628\u0634\u0646 \u0648 Refresh Token \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0647\u0645 Revoke \u0628\u0634\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class LogoutUseCase(\n    private val authApi: AuthApi,\n    private val tokenProvider: TokenProvider,\n    private val privateDatabase: PrivateDatabase,\n    private val imageCache: UserImageCache\n) {\n\n    suspend operator fun invoke() {\n        val refreshToken =\n            tokenProvider.getRefreshToken()\n\n        runCatching {\n            if (refreshToken != null) {\n                authApi.logout(\n                    LogoutRequest(\n                        refreshToken = refreshToken\n                    )\n                )\n            }\n        }\n\n        tokenProvider.clear()\n        privateDatabase.clearAllTables()\n        imageCache.clearUserImages()\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">LogoutUseCase<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> authApi: <\/span><span style=\"color: #6F42C1\">AuthApi<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> tokenProvider: <\/span><span style=\"color: #6F42C1\">TokenProvider<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> privateDatabase: <\/span><span style=\"color: #6F42C1\">PrivateDatabase<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> imageCache: <\/span><span style=\"color: #6F42C1\">UserImageCache<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">operator<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">invoke<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> refreshToken <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            tokenProvider.<\/span><span style=\"color: #6F42C1\">getRefreshToken<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">runCatching<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (refreshToken <\/span><span style=\"color: #D73A49\">!=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                authApi.<\/span><span style=\"color: #6F42C1\">logout<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #6F42C1\">LogoutRequest<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                        refreshToken <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> refreshToken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        tokenProvider.<\/span><span style=\"color: #6F42C1\">clear<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        privateDatabase.<\/span><span style=\"color: #6F42C1\">clearAllTables<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        imageCache.<\/span><span style=\"color: #6F42C1\">clearUserImages<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u062a\u06cc \u0627\u06af\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Logout \u0628\u0647 \u0633\u0631\u0648\u0631 \u0634\u06a9\u0633\u062a \u062e\u0648\u0631\u062f\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u062d\u0644\u06cc \u0628\u0627\u06cc\u062f \u067e\u0627\u06a9 \u0628\u0634\u0646. \u0627\u0644\u0628\u062a\u0647 Backend \u0647\u0645 \u0628\u0647\u062a\u0631\u0647 \u0627\u0645\u06a9\u0627\u0646 \u0644\u063a\u0648 Session \u0627\u0632 \u0631\u0627\u0647\u200c\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631\u060c \u0645\u062b\u0644 \u062e\u0631\u0648\u062c \u0627\u0632 \u0647\u0645\u0647 \u062f\u0633\u062a\u06af\u0627\u0647\u200c\u0647\u0627 \u06cc\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631\u060c \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647. Access Token\u0647\u0627\u06cc \u06a9\u0648\u062a\u0627\u0647\u200c\u0639\u0645\u0631 \u0647\u0645 \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0646 \u062f\u0631 \u0635\u0648\u0631\u062a \u0646\u0631\u0633\u06cc\u062f\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Revoke\u060c \u062f\u0633\u062a\u0631\u0633\u06cc \u0642\u0628\u0644\u06cc \u0628\u0631\u0627\u06cc \u0645\u062f\u062a \u0646\u0627\u0645\u062d\u062f\u0648\u062f \u0628\u0627\u0642\u06cc \u0646\u0645\u0648\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0646\u0628\u0627\u06cc\u062f \u062f\u0627\u062e\u0644 Log \u0638\u0627\u0647\u0631 \u0628\u0634\u0646<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9\u06cc \u0627\u0632 \u0631\u0627\u06cc\u062c\u200c\u062a\u0631\u06cc\u0646 \u0646\u0634\u062a\u200c\u0647\u0627 \u0627\u0632 \u0645\u0633\u06cc\u0631 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0646\u06cc\u0633\u062a\u061b \u0627\u0632 \u0645\u0633\u06cc\u0631 Log \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc\u0641\u062a\u0647. \u0645\u0645\u06a9\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633 \u0647\u0646\u06af\u0627\u0645 Debug \u06a9\u0644 \u067e\u0627\u0633\u062e \u0648\u0631\u0648\u062f\u060c Header\u0647\u0627 \u06cc\u0627 \u0645\u062f\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648 \u0686\u0627\u067e \u06a9\u0646\u0647 \u0648 \u0628\u0639\u062f \u0647\u0645\u06cc\u0646 Logging \u0646\u0627\u062e\u0648\u0627\u0633\u062a\u0647 \u0648\u0627\u0631\u062f \u0646\u0633\u062e\u0647 Release \u0628\u0634\u0647. \u062a\u0648\u06a9\u0646\u060c \u0627\u06cc\u0645\u06cc\u0644\u060c \u0634\u0645\u0627\u0631\u0647 \u062a\u0644\u0641\u0646\u060c \u06a9\u062f \u06cc\u06a9\u200c\u0628\u0627\u0631\u0645\u0635\u0631\u0641\u060c Cookie \u0648 \u067e\u0627\u0633\u062e \u06a9\u0627\u0645\u0644 \u0633\u0631\u0648\u0631 \u0646\u0628\u0627\u06cc\u062f \u062f\u0627\u062e\u0644 Log \u0646\u0648\u0634\u062a\u0647 \u0628\u0634\u0646. Android \u0647\u0645 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0647 \u0627\u0632 \u062b\u0628\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0634\u062e\u0635\u06cc \u062f\u0631 Log \u062e\u0648\u062f\u062f\u0627\u0631\u06cc \u06a9\u0646\u06cc\u0645 \u0648 Logging \u0646\u0633\u062e\u0647 Production \u0631\u0648 \u0645\u062d\u062f\u0648\u062f \u0646\u06af\u0647 \u062f\u0627\u0631\u06cc\u0645.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc OkHttp \u0628\u0627\u06cc\u062f Logging \u0641\u0642\u0637 \u062f\u0631 \u0646\u0633\u062e\u0647 Debug \u0641\u0639\u0627\u0644 \u0628\u0627\u0634\u0647 \u0648 Header\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0647\u0645 Redact \u0628\u0634\u0646:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun createLoggingInterceptor():\n    HttpLoggingInterceptor {\n\n    return HttpLoggingInterceptor().apply {\n        level =\n            if (BuildConfig.DEBUG) {\n                HttpLoggingInterceptor.Level.BASIC\n            } else {\n                HttpLoggingInterceptor.Level.NONE\n            }\n\n        redactHeader(\"Authorization\")\n        redactHeader(\"Cookie\")\n        redactHeader(\"Set-Cookie\")\n        redactHeader(\"X-Api-Key\")\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">createLoggingInterceptor<\/span><span style=\"color: #24292E\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">HttpLoggingInterceptor<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">HttpLoggingInterceptor<\/span><span style=\"color: #24292E\">().<\/span><span style=\"color: #6F42C1\">apply<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        level <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (BuildConfig.DEBUG) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                HttpLoggingInterceptor.Level.BASIC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            } <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                HttpLoggingInterceptor.Level.NONE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">redactHeader<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;Authorization&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">redactHeader<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;Cookie&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">redactHeader<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;Set-Cookie&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">redactHeader<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #032F62\">&quot;X-Api-Key&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u0637\u062d <code>BODY<\/code> \u0631\u0648 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0645\u062f\u062a \u0645\u062d\u062f\u0648\u062f \u0648 \u0631\u0648\u06cc API\u0647\u0627\u06cc \u063a\u06cc\u0631\u062d\u0633\u0627\u0633 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u062d\u062a\u06cc \u062f\u0631 \u0646\u0633\u062e\u0647 Debug \u0647\u0645 \u0686\u0627\u067e Body \u0648\u0631\u0648\u062f\u060c Refresh Token \u06cc\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062e\u0635\u0648\u0635\u06cc \u0627\u0646\u062a\u062e\u0627\u0628 \u062e\u0648\u0628\u06cc \u0646\u06cc\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u06cc\u06a9 Logger \u0645\u0631\u06a9\u0632\u06cc \u0628\u0633\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u062f\u0631 \u0646\u0633\u062e\u0647 Release \u0686\u06cc\u0632\u06cc \u0686\u0627\u067e \u0646\u06a9\u0646\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>object AppLogger {\n\n    fun debug(\n        tag: String,\n        message: String\n    ) {\n        if (BuildConfig.DEBUG) {\n            Log.d(tag, message)\n        }\n    }\n\n    fun error(\n        tag: String,\n        message: String,\n        throwable: Throwable? = null\n    ) {\n        if (BuildConfig.DEBUG) {\n            Log.e(\n                tag,\n                message,\n                throwable\n            )\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">object<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">AppLogger<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">debug<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        tag: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        message: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (BuildConfig.DEBUG) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Log.<\/span><span style=\"color: #6F42C1\">d<\/span><span style=\"color: #24292E\">(tag, message)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">error<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        tag: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        message: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        throwable: <\/span><span style=\"color: #6F42C1\">Throwable<\/span><span style=\"color: #24292E\">? <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (BuildConfig.DEBUG) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Log.<\/span><span style=\"color: #6F42C1\">e<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                tag,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                message,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                throwable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0628\u0627\u06cc\u062f \u0686\u0646\u06cc\u0646 \u0686\u06cc\u0632\u06cc \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>AppLogger.debug(\n    tag = \"Auth\",\n    message = \"Access token: $accessToken\"\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">AppLogger.<\/span><span style=\"color: #6F42C1\">debug<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    tag <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;Auth&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    message <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;Access token: <\/span><span style=\"color: #005CC5\">$accessToken<\/span><span style=\"color: #032F62\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u062a\u06cc \u0627\u06af\u0647 Logger \u062f\u0631 Release \u062e\u0627\u0645\u0648\u0634 \u0628\u0627\u0634\u0647\u060c \u0647\u0645\u06cc\u0646 Log \u0645\u0645\u06a9\u0646\u0647 \u0631\u0648\u06cc \u06af\u0648\u0634\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647\u060c Screen Share \u06cc\u0627 \u06af\u0632\u0627\u0631\u0634 \u062e\u0637\u0627 \u0628\u0627\u0642\u06cc \u0628\u0645\u0648\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Crash Report \u0647\u0645 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0648 \u0644\u0648 \u0628\u062f\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc Crash Reporting \u0645\u0639\u0645\u0648\u0644\u0627\u064b Stack Trace\u060c Breadcrumb\u060c \u0646\u0627\u0645 \u0635\u0641\u062d\u0647 \u0648 Metadata\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u0647 \u0631\u0648 \u062c\u0645\u0639 \u0645\u06cc\u200c\u06a9\u0646\u0646. \u0646\u0628\u0627\u06cc\u062f \u0645\u062f\u0644 \u06a9\u0627\u0645\u0644 \u06a9\u0627\u0631\u0628\u0631\u060c Body \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c Token \u06cc\u0627 \u0634\u0645\u0627\u0631\u0647 \u062a\u0644\u0641\u0646 \u0631\u0648 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 Custom Key \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u0645. \u0628\u0631\u0627\u06cc \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647\u062a\u0631\u0647 \u0627\u0632 \u06cc\u06a9 \u0634\u0646\u0627\u0633\u0647 \u062f\u0627\u062e\u0644\u06cc \u06cc\u0627 Hash \u06a9\u0646\u062a\u0631\u0644\u200c\u0634\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645\u060c \u0646\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0642\u0627\u0628\u0644\u200c\u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u0645\u0633\u062a\u0642\u06cc\u0645.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0645\u0648\u0646\u0647 \u0646\u0627\u0645\u0646\u0627\u0633\u0628:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>crashReporter.setCustomKey(\n    \"login_response\",\n    loginResponse.toString()\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">crashReporter.<\/span><span style=\"color: #6F42C1\">setCustomKey<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;login_response&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    loginResponse.<\/span><span style=\"color: #6F42C1\">toString<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0686\u0648\u0646 <code>toString<\/code> \u0645\u0645\u06a9\u0646\u0647 Access Token \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0634\u062e\u0635\u06cc \u0631\u0648 \u0647\u0645 \u0648\u0627\u0631\u062f \u06af\u0632\u0627\u0631\u0634 \u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062f\u0644 \u0627\u0645\u0646\u200c\u062a\u0631 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0641\u0642\u0637 \u0648\u0636\u0639\u06cc\u062a \u0644\u0627\u0632\u0645 \u062b\u0628\u062a \u0628\u0634\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>crashReporter.setCustomKey(\n    \"auth_state\",\n    \"authenticated\"\n)\n\ncrashReporter.setCustomKey(\n    \"api_operation\",\n    \"refresh_prices\"\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">crashReporter.<\/span><span style=\"color: #6F42C1\">setCustomKey<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;auth_state&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;authenticated&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">crashReporter.<\/span><span style=\"color: #6F42C1\">setCustomKey<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;api_operation&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #032F62\">&quot;refresh_prices&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u067e\u06cc\u0627\u0645 \u062e\u0637\u0627\u06cc Backend \u0647\u0645 \u0628\u0627\u06cc\u062f \u067e\u0627\u06a9\u200c\u0633\u0627\u0632\u06cc \u0628\u0634\u0647. Stack Trace PHP\u060c Query \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633\u060c \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u0633\u0631\u0648\u0631 \u0648 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062f\u0627\u062e\u0644\u06cc \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u0627\u067e \u0641\u0631\u0633\u062a\u0627\u062f\u0647 \u0628\u0634\u0646.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0635\u0641\u062d\u0647\u200c\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0631\u0648 \u0627\u0632 Screenshot \u0645\u062d\u0627\u0641\u0638\u062a \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0635\u0641\u062d\u0647\u200c\u0627\u06cc \u0634\u0627\u0645\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u060c \u0645\u0645\u06a9\u0646\u0647 \u062a\u0635\u0648\u06cc\u0631 \u0627\u0648\u0646 \u062f\u0631 Recent Apps\u060c Screenshot \u06cc\u0627 Screen Recording \u062f\u06cc\u062f\u0647 \u0628\u0634\u0647. \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u067e\u0631\u0686\u0645 <code>FLAG_SECURE<\/code> \u0631\u0648 \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062b\u0628\u062a \u0645\u062d\u062a\u0648\u0627\u06cc Window \u062f\u0631 Screenshot \u0648 \u0646\u0645\u0627\u06cc\u0634 \u0627\u0648\u0646 \u0631\u0648\u06cc \u0646\u0645\u0627\u06cc\u0634\u06af\u0631\u0647\u0627\u06cc \u063a\u06cc\u0631\u0627\u0645\u0646 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u062f\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u06cc\u06a9 Activity \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u067e\u0631\u0686\u0645 \u0631\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>override fun onCreate(\n    savedInstanceState: Bundle?\n) {\n    super.onCreate(savedInstanceState)\n\n    window.setFlags(\n        WindowManager.LayoutParams.FLAG_SECURE,\n        WindowManager.LayoutParams.FLAG_SECURE\n    )\n\n    setContent {\n        PaymentScreen()\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">override<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">onCreate<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    savedInstanceState: <\/span><span style=\"color: #6F42C1\">Bundle<\/span><span style=\"color: #24292E\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #005CC5\">super<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">onCreate<\/span><span style=\"color: #24292E\">(savedInstanceState)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    window.<\/span><span style=\"color: #6F42C1\">setFlags<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        WindowManager.LayoutParams.FLAG_SECURE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        WindowManager.LayoutParams.FLAG_SECURE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">setContent<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">PaymentScreen<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0645\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 <code>FLAG_SECURE<\/code> \u0631\u0648\u06cc \u06a9\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0648 \u0628\u06cc\u200c\u062f\u0644\u06cc\u0644 \u062e\u0631\u0627\u0628 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u06a9\u0627\u0631\u0628\u0631 \u0645\u0645\u06a9\u0646\u0647 \u0628\u062e\u0648\u0627\u062f \u062a\u0635\u0648\u06cc\u0631 \u0642\u06cc\u0645\u062a \u06a9\u0627\u0644\u0627 \u0631\u0648 \u0628\u0631\u0627\u06cc \u062f\u06cc\u06af\u0631\u06cc \u0628\u0641\u0631\u0633\u062a\u0647. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06cc\u0646 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0635\u0641\u062d\u0647\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u067e\u0631\u062f\u0627\u062e\u062a\u060c \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u062d\u0633\u0627\u0628\u060c \u06a9\u062f\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u06cc\u0627 \u067e\u0646\u0644 \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u0627\u0639\u0645\u0627\u0644 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 Compose \u0645\u06cc\u200c\u062a\u0648\u0646\u06cc\u0645 \u06cc\u06a9 Effect \u0642\u0627\u0628\u0644\u200c\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u062c\u062f\u062f \u0628\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>@Composable\nfun SecureScreenEffect(\n    enabled: Boolean\n) {\n    val view = LocalView.current\n\n    DisposableEffect(enabled) {\n        val activity =\n            view.context.findActivity()\n\n        if (enabled) {\n            activity?.window?.addFlags(\n                WindowManager.LayoutParams.FLAG_SECURE\n            )\n        }\n\n        onDispose {\n            activity?.window?.clearFlags(\n                WindowManager.LayoutParams.FLAG_SECURE\n            )\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">@Composable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SecureScreenEffect<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    enabled: <\/span><span style=\"color: #6F42C1\">Boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> view <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> LocalView.current<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">DisposableEffect<\/span><span style=\"color: #24292E\">(enabled) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> activity <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            view.context.<\/span><span style=\"color: #6F42C1\">findActivity<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (enabled) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            activity?.window?.<\/span><span style=\"color: #6F42C1\">addFlags<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                WindowManager.LayoutParams.FLAG_SECURE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">onDispose<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            activity?.window?.<\/span><span style=\"color: #6F42C1\">clearFlags<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                WindowManager.LayoutParams.FLAG_SECURE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062a\u0627\u0628\u0639 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 Activity:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun Context.findActivity(): Activity? {\n    var currentContext = this\n\n    while (\n        currentContext is ContextWrapper\n    ) {\n        if (currentContext is Activity) {\n            return currentContext\n        }\n\n        currentContext =\n            currentContext.baseContext\n    }\n\n    return null\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">.<\/span><span style=\"color: #6F42C1\">findActivity<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">Activity<\/span><span style=\"color: #24292E\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">var<\/span><span style=\"color: #24292E\"> currentContext <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">this<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">while<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        currentContext <\/span><span style=\"color: #D73A49\">is<\/span><span style=\"color: #24292E\"> ContextWrapper<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (currentContext <\/span><span style=\"color: #D73A49\">is<\/span><span style=\"color: #24292E\"> Activity) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> currentContext<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        currentContext <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            currentContext.baseContext<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">return<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u062f\u0627\u062e\u0644 \u0635\u0641\u062d\u0647 \u062d\u0633\u0627\u0633 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>@Composable\nfun ChangePasswordScreen() {\n    SecureScreenEffect(\n        enabled = true\n    )\n\n    \/\/ \u0645\u062d\u062a\u0648\u0627\u06cc \u0635\u0641\u062d\u0647\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">@Composable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">ChangePasswordScreen<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">SecureScreenEffect<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        enabled <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6A737D\">\/\/ \u0645\u062d\u062a\u0648\u0627\u06cc \u0635\u0641\u062d\u0647<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc \u0635\u0641\u062d\u0647 \u0627\u0632 Composition \u062e\u0627\u0631\u062c \u0628\u0634\u0647\u060c \u067e\u0631\u0686\u0645 \u067e\u0627\u06a9 \u0645\u06cc\u0634\u0647 \u0648 \u0628\u0627\u0642\u06cc \u0635\u0641\u062d\u0647\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0648\u0628\u0627\u0631\u0647 \u0642\u0627\u0628\u0644 Screenshot \u062e\u0648\u0627\u0647\u0646\u062f \u0628\u0648\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Clipboard \u0645\u062d\u0644 \u0627\u0645\u0646 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0646\u06cc\u0633\u062a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0642\u062a\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0686\u06cc\u0632\u06cc \u0631\u0648 Copy \u0645\u06cc\u200c\u06a9\u0646\u0647\u060c \u0627\u0648\u0646 \u062f\u0627\u062f\u0647 \u0648\u0627\u0631\u062f Clipboard \u0633\u06cc\u0633\u062a\u0645 \u0645\u06cc\u0634\u0647 \u0648 \u0645\u0645\u06a9\u0646\u0647 \u062a\u0648\u0633\u0637 Keyboard\u060c \u067e\u06cc\u0634\u200c\u0646\u0645\u0627\u06cc\u0634 Clipboard \u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u062f\u06cc\u062f\u0647 \u0628\u0634\u0647. \u0646\u0628\u0627\u06cc\u062f \u0631\u0645\u0632 \u0639\u0628\u0648\u0631\u060c Refresh Token \u06cc\u0627 \u06a9\u062f\u0647\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a\u06cc \u0631\u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 Copy \u06a9\u0646\u06cc\u0645. \u0627\u06af\u0647 \u0628\u0647 \u062f\u0644\u06cc\u0644 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0644\u0627\u0632\u0645 \u0634\u062f \u0645\u0642\u062f\u0627\u0631 \u062d\u0633\u0627\u0633\u06cc \u0645\u062b\u0644 \u06a9\u062f \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u0648\u0642\u062a \u06a9\u067e\u06cc \u0628\u0634\u0647\u060c \u0628\u0647\u062a\u0631\u0647 \u0627\u0648\u0646 \u0631\u0648 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 Sensitive \u0639\u0644\u0627\u0645\u062a\u200c\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u067e\u06cc\u0634\u200c\u0646\u0645\u0627\u06cc\u0634 \u0648\u0627\u0636\u062d\u0634 \u062f\u0631 \u0631\u0627\u0628\u0637 Clipboard \u06cc\u0627 Keyboard \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0646\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Android \u0627\u0632 API 33 \u0628\u0647 \u0628\u0639\u062f \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0632 <code>ClipDescription.EXTRA_IS_SENSITIVE<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0647 \u0648 \u0628\u0631\u0627\u06cc \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0642\u062f\u06cc\u0645\u06cc\u200c\u062a\u0631 \u0647\u0645 \u06a9\u0644\u06cc\u062f \u0633\u0627\u0632\u06af\u0627\u0631 \u0645\u062a\u0646\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u0647.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun copySensitiveText(\n    context: Context,\n    label: String,\n    value: String\n) {\n    val clipboardManager =\n        context.getSystemService(\n            Context.CLIPBOARD_SERVICE\n        ) as ClipboardManager\n\n    val clipData =\n        ClipData.newPlainText(\n            label,\n            value\n        )\n\n    val extras =\n        PersistableBundle().apply {\n            if (\n                Build.VERSION.SDK_INT >=\n                Build.VERSION_CODES.TIRAMISU\n            ) {\n                putBoolean(\n                    ClipDescription.EXTRA_IS_SENSITIVE,\n                    true\n                )\n            } else {\n                putBoolean(\n                    \"android.content.extra.IS_SENSITIVE\",\n                    true\n                )\n            }\n        }\n\n    clipData.description.extras = extras\n    clipboardManager.setPrimaryClip(clipData)\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">copySensitiveText<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    context: <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    label: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">value<\/span><span style=\"color: #24292E\">: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> clipboardManager <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context.<\/span><span style=\"color: #6F42C1\">getSystemService<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Context.CLIPBOARD_SERVICE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ) <\/span><span style=\"color: #D73A49\">as<\/span><span style=\"color: #24292E\"> ClipboardManager<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> clipData <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ClipData.<\/span><span style=\"color: #6F42C1\">newPlainText<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            label,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> extras <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">PersistableBundle<\/span><span style=\"color: #24292E\">().<\/span><span style=\"color: #6F42C1\">apply<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                Build.VERSION.SDK_INT <\/span><span style=\"color: #D73A49\">&gt;=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                Build.VERSION_CODES.TIRAMISU<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">putBoolean<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    ClipDescription.EXTRA_IS_SENSITIVE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            } <\/span><span style=\"color: #D73A49\">else<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #6F42C1\">putBoolean<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #032F62\">&quot;android.content.extra.IS_SENSITIVE&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                    <\/span><span style=\"color: #005CC5\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    clipData.description.extras <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> extras<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    clipboardManager.<\/span><span style=\"color: #6F42C1\">setPrimaryClip<\/span><span style=\"color: #24292E\">(clipData)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0639\u0644\u0627\u0645\u062a \u0645\u062d\u062a\u0648\u0627 \u0631\u0648 Encrypt \u0646\u0645\u06cc\u200c\u06a9\u0646\u0647\u061b \u0641\u0642\u0637 \u0646\u0645\u0627\u06cc\u0634 \u0622\u0634\u06a9\u0627\u0631 \u0627\u0648\u0646 \u0631\u0648 \u0645\u062d\u062f\u0648\u062f\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u067e\u0633 \u0647\u0646\u0648\u0632 \u0647\u0645 \u0646\u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u062e\u06cc\u0644\u06cc \u062d\u0633\u0627\u0633 \u0628\u0647 Clipboard \u062a\u06a9\u06cc\u0647 \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Backup \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0641\u0627\u06cc\u0644 \u062e\u0635\u0648\u0635\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0647\u0645 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0646\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9 \u0646\u06a9\u062a\u0647\u200c\u0627\u06cc \u06a9\u0647 \u062e\u06cc\u0644\u06cc \u0631\u0627\u062d\u062a \u0641\u0631\u0627\u0645\u0648\u0634 \u0645\u06cc\u0634\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 Auto Backup \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0628\u0647 \u0635\u0648\u0631\u062a \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0628\u062e\u0634 \u0628\u0632\u0631\u06af\u06cc \u0627\u0632 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u062e\u0635\u0648\u0635\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u200c\u06af\u06cc\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0647\u061b \u0627\u0632 \u062c\u0645\u0644\u0647 Shared Preferences\u060c \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc Internal Storage \u0648 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633\u200c\u0647\u0627. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u062e\u0635\u0648\u0635\u06cc \u0628\u0648\u062f\u0646 \u0641\u0627\u06cc\u0644 \u062f\u0627\u062e\u0644 Sandbox \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc \u0646\u06cc\u0633\u062a \u06a9\u0647 \u0627\u0648\u0646 \u0641\u0627\u06cc\u0644 \u0647\u0631\u06af\u0632 \u0627\u0632 \u062f\u0633\u062a\u06af\u0627\u0647 \u062e\u0627\u0631\u062c \u0646\u0645\u06cc\u0634\u0647. Android \u0627\u0645\u06a9\u0627\u0646 \u062a\u0639\u06cc\u06cc\u0646 \u0642\u0648\u0627\u0646\u06cc\u0646 Backup \u0648 \u062d\u0630\u0641 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0631\u0648 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 Android 12 \u0628\u0647 \u0628\u0639\u062f\u060c \u0641\u0627\u06cc\u0644 <code>data-extraction-rules<\/code> \u0631\u0648 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u062f\u0627\u062e\u0644 <code>res\/xml\/backup_rules.xml<\/code> \u0645\u06cc\u200c\u0646\u0648\u06cc\u0633\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\n&lt;data-extraction-rules>\n\n    &lt;cloud-backup\n        disableIfNoEncryptionCapabilities=\"true\">\n\n        &lt;exclude\n            domain=\"sharedpref\"\n            path=\"auth_secure.preferences_pb\" \/>\n\n        &lt;exclude\n            domain=\"database\"\n            path=\"private_user.db\" \/>\n\n        &lt;exclude\n            domain=\"file\"\n            path=\"sensitive\/\" \/>\n\n    &lt;\/cloud-backup>\n\n    &lt;device-transfer>\n\n        &lt;exclude\n            domain=\"sharedpref\"\n            path=\"auth_secure.preferences_pb\" \/>\n\n        &lt;exclude\n            domain=\"database\"\n            path=\"private_user.db\" \/>\n\n        &lt;exclude\n            domain=\"file\"\n            path=\"sensitive\/\" \/>\n\n    &lt;\/device-transfer>\n\n&lt;\/data-extraction-rules>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">?xml version<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;1.0&quot;<\/span><span style=\"color: #24292E\"> encoding<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;utf-8&quot;<\/span><span style=\"color: #24292E\">?<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;data-<\/span><span style=\"color: #24292E\">extraction<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">rules<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">cloud<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">backup<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        disableIfNoEncryptionCapabilities<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;true&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">exclude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            domain<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;sharedpref&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            path<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;auth_secure.preferences_pb&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">exclude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            domain<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;database&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            path<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;private_user.db&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">exclude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            domain<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;file&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            path<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;sensitive\/&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">cloud<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">backup<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">device<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">transfer<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">exclude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            domain<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;sharedpref&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            path<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;auth_secure.preferences_pb&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">exclude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            domain<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;database&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            path<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;private_user.db&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">exclude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            domain<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;file&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            path<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;sensitive\/&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">device<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">transfer<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/data-<\/span><span style=\"color: #24292E\">extraction<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">rules<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc Android 11 \u0648 \u067e\u0627\u06cc\u06cc\u0646\u200c\u062a\u0631 \u0647\u0645 \u0641\u0627\u06cc\u0644 \u062c\u062f\u0627\u06af\u0627\u0646\u0647\u200c\u0627\u06cc \u0645\u062b\u0644 <code>backup_rules_legacy.xml<\/code> \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\n&lt;full-backup-content>\n\n    &lt;exclude\n        domain=\"sharedpref\"\n        path=\"auth_secure.preferences_pb\" \/>\n\n    &lt;exclude\n        domain=\"database\"\n        path=\"private_user.db\" \/>\n\n    &lt;exclude\n        domain=\"file\"\n        path=\"sensitive\/\" \/>\n\n&lt;\/full-backup-content>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">?xml version<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;1.0&quot;<\/span><span style=\"color: #24292E\"> encoding<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;utf-8&quot;<\/span><span style=\"color: #24292E\">?<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">full<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">backup<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">content<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">exclude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        domain<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;sharedpref&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        path<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;auth_secure.preferences_pb&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">exclude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        domain<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;database&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        path<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;private_user.db&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">exclude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        domain<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;file&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        path<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;sensitive\/&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">full<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">backup<\/span><span style=\"color: #D73A49\">-<\/span><span style=\"color: #24292E\">content<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0647\u0631 \u062f\u0648 \u0631\u0648 \u062f\u0631 Manifest \u0645\u0639\u0631\u0641\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;application\n    android:name=\".GheimatBanApplication\"\n    android:dataExtractionRules=\"@xml\/backup_rules\"\n    android:fullBackupContent=\"@xml\/backup_rules_legacy\"\n    android:theme=\"@style\/Theme.GheimatBan\">\n\n    &lt;!-- Activities -->\n\n&lt;\/application>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">name<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;.GheimatBanApplication&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">dataExtractionRules<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;@xml\/backup_rules&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">fullBackupContent<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;@xml\/backup_rules_legacy&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">theme<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;@style\/Theme.GheimatBan&quot;<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">&lt;!--<\/span><span style=\"color: #24292E\"> Activities <\/span><span style=\"color: #D73A49\">--&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">&lt;\/<\/span><span style=\"color: #24292E\">application<\/span><span style=\"color: #D73A49\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0630\u0641 \u062a\u0648\u06a9\u0646\u200c\u0647\u0627 \u0627\u0632 Backup \u0645\u0647\u0645\u0647\u060c \u0686\u0648\u0646 \u062a\u0648\u06a9\u0646 Session \u0646\u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u06cc\u06a9 \u062f\u0633\u062a\u06af\u0627\u0647 \u062c\u062f\u06cc\u062f Restore \u0628\u0634\u0647 \u0648 \u0628\u062f\u0648\u0646 \u0648\u0631\u0648\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062f\u0627\u0645\u0647 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0647. \u0647\u0645\u0686\u0646\u06cc\u0646 \u06a9\u0644\u06cc\u062f Android Keystore \u0645\u0645\u06a9\u0646\u0647 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u062c\u062f\u06cc\u062f \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647\u061b \u062f\u0631 \u0646\u062a\u06cc\u062c\u0647 Ciphertext \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc\u200c\u0634\u062f\u0647 \u0642\u0627\u0628\u0644 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0646\u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0631\u0641\u062a\u0627\u0631 \u0627\u0645\u0646 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0639\u062f \u0627\u0632 \u0627\u0646\u062a\u0642\u0627\u0644 \u062f\u0633\u062a\u06af\u0627\u0647\u060c \u06a9\u0627\u0631\u0628\u0631 \u062f\u0648\u0628\u0627\u0631\u0647 \u0648\u0627\u0631\u062f \u062d\u0633\u0627\u0628 \u0628\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0627\u062e\u0644 <code>getNoBackupFilesDir<\/code> \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u0634\u0646 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u0632 Backup \u06a9\u0646\u0627\u0631 \u06af\u0630\u0627\u0634\u062a\u0647 \u0645\u06cc\u0634\u0646. \u0628\u0631\u0627\u06cc \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0647\u0631\u06af\u0632 \u0646\u0628\u0627\u06cc\u062f \u0645\u0646\u062a\u0642\u0644 \u0628\u0634\u0647\u060c \u0627\u06cc\u0646 \u0645\u0633\u06cc\u0631 \u0647\u0645 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u0646\u0627\u0633\u0628\u06cc\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val sensitiveDirectory =\n    File(\n        context.noBackupFilesDir,\n        \"sensitive\"\n    ).apply {\n        mkdirs()\n    }\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> sensitiveDirectory <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">File<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context.noBackupFilesDir,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #032F62\">&quot;sensitive&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    ).<\/span><span style=\"color: #6F42C1\">apply<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">mkdirs<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0637\u0644\u0627\u0639\u0627\u062a Room \u0631\u0648 \u0647\u0645 \u0628\u0631\u0627\u0633\u0627\u0633 \u062d\u0633\u0627\u0633\u06cc\u062a \u062c\u062f\u0627 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u06a9\u0644 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u0642\u06cc\u0645\u062a\u200c\u0647\u0627 \u0631\u0648 \u0641\u0642\u0637 \u0628\u0647 \u062e\u0627\u0637\u0631 \u0686\u0646\u062f \u0641\u06cc\u0644\u062f \u062d\u0633\u0627\u0633 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u0645. \u0637\u0631\u0627\u062d\u06cc \u0628\u0647\u062a\u0631 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u062f\u0627\u062f\u0647 \u0639\u0645\u0648\u0645\u06cc \u0648 \u062e\u0635\u0648\u0635\u06cc \u0631\u0648 \u0627\u0632 \u0647\u0645 \u062c\u062f\u0627 \u06a9\u0646\u06cc\u0645. \u0645\u062b\u0644\u0627\u064b \u062c\u062f\u0648\u0644 \u0642\u06cc\u0645\u062a \u06a9\u0627\u0644\u0627\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 Cache \u0639\u0645\u0648\u0645\u06cc \u0628\u0627\u0634\u0647 \u0648 \u062d\u062a\u06cc \u0628\u0639\u062f \u0627\u0632 \u062e\u0631\u0648\u062c \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u0642\u06cc \u0628\u0645\u0648\u0646\u0647. \u0627\u0645\u0627 \u062a\u0627\u0631\u06cc\u062e\u0686\u0647 \u0634\u062e\u0635\u06cc \u062c\u0633\u062a\u200c\u0648\u062c\u0648\u060c \u0647\u0634\u062f\u0627\u0631\u0647\u0627\u06cc \u062e\u0635\u0648\u0635\u06cc \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0628 \u0628\u0627\u06cc\u062f \u062f\u0631 \u062c\u062f\u0648\u0644\u200c\u0647\u0627 \u06cc\u0627 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062c\u062f\u0627 \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0646 \u062a\u0627 \u0647\u0646\u06af\u0627\u0645 Logout \u0628\u0647\u200c\u0631\u0627\u062d\u062a\u06cc \u067e\u0627\u06a9 \u0628\u0634\u0646.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>@Database(\n    entities = &#91;\n        ProductEntity::class,\n        PriceEntity::class\n    &#93;,\n    version = 1\n)\nabstract class PublicCacheDatabase :\n    RoomDatabase() {\n\n    abstract fun productDao(): ProductDao\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">@Database<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    entities <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> &#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        ProductEntity::<\/span><span style=\"color: #6F42C1\">class<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        PriceEntity::<\/span><span style=\"color: #6F42C1\">class<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    &#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    version <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">abstract<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">PublicCacheDatabase<\/span><span style=\"color: #24292E\"> :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">RoomDatabase<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">abstract<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">productDao<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">ProductDao<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062e\u0635\u0648\u0635\u06cc \u062c\u062f\u0627:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>@Database(\n    entities = &#91;\n        UserAlertEntity::class,\n        PrivateSearchEntity::class\n    &#93;,\n    version = 1\n)\nabstract class PrivateDatabase :\n    RoomDatabase() {\n\n    abstract fun alertDao(): AlertDao\n\n    abstract fun privateSearchDao():\n        PrivateSearchDao\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">@Database<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    entities <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> &#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        UserAlertEntity::<\/span><span style=\"color: #6F42C1\">class<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        PrivateSearchEntity::<\/span><span style=\"color: #6F42C1\">class<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    &#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    version <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">abstract<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">PrivateDatabase<\/span><span style=\"color: #24292E\"> :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">RoomDatabase<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">abstract<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">alertDao<\/span><span style=\"color: #24292E\">(): <\/span><span style=\"color: #6F42C1\">AlertDao<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">abstract<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">privateSearchDao<\/span><span style=\"color: #24292E\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        PrivateSearchDao<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u06cc\u0646 \u062c\u062f\u0627\u0633\u0627\u0632\u06cc\u060c \u0647\u0646\u06af\u0627\u0645 Logout \u0641\u0642\u0637 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062e\u0635\u0648\u0635\u06cc \u067e\u0627\u06a9 \u0645\u06cc\u0634\u0647:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>privateDatabase.clearAllTables()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292E\">privateDatabase.<\/span><span style=\"color: #6F42C1\">clearAllTables<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 Cache \u0639\u0645\u0648\u0645\u06cc \u0642\u06cc\u0645\u062a\u200c\u0647\u0627 \u0628\u0627\u0642\u06cc \u0645\u06cc\u200c\u0645\u0648\u0646\u0647 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0639\u062f \u0627\u0632 \u062e\u0631\u0648\u062c \u0647\u0645 \u0633\u0631\u06cc\u0639 \u0628\u0627\u0632 \u0645\u06cc\u0634\u0647.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0646\u0628\u0627\u06cc\u062f \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0645\u062b\u0644 Access Token \u0631\u0648 \u062f\u0627\u062e\u0644 Entity \u06a9\u0627\u0631\u0628\u0631 \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>@Entity\ndata class UserEntity(\n    @PrimaryKey\n    val id: Long,\n    val displayName: String,\n    val accessToken: String\n)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6F42C1\">@Entity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">data<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">UserEntity<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">@PrimaryKey<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> id: <\/span><span style=\"color: #6F42C1\">Long<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> displayName: <\/span><span style=\"color: #6F42C1\">String<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> accessToken: <\/span><span style=\"color: #6F42C1\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u062a\u0648\u06a9\u0646 \u0645\u062a\u0639\u0644\u0642 \u0628\u0647 \u0644\u0627\u06cc\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u0647 \u0648 \u0628\u0627\u06cc\u062f \u0686\u0631\u062e\u0647 \u0639\u0645\u0631 \u0648 \u0645\u062d\u0627\u0641\u0638\u062a \u062c\u062f\u0627\u06af\u0627\u0646\u0647\u200c\u0627\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0648\u0631\u0648\u062f\u06cc\u200c\u0647\u0627 \u0648 \u062e\u0631\u0648\u062c\u06cc\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u0647\u0645 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0641\u0642\u0637 \u062f\u0631\u0628\u0627\u0631\u0647 \u0641\u0627\u06cc\u0644 \u062f\u0627\u062e\u0644 \u06af\u0648\u0634\u06cc \u0646\u06cc\u0633\u062a. \u0645\u0645\u06a9\u0646\u0647 \u062f\u0627\u062f\u0647 \u0627\u0632 \u0637\u0631\u06cc\u0642 Intent\u060c Deep Link\u060c Exported Component \u06cc\u0627 <code>FileProvider<\/code> \u0646\u0634\u062a \u06a9\u0646\u0647. Activity \u06cc\u0627 Service \u0646\u0628\u0627\u06cc\u062f \u0628\u06cc\u200c\u062f\u0644\u06cc\u0644 <code>exported=true<\/code> \u0628\u0627\u0634\u0647. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u062e\u0635\u0648\u0635\u06cc \u0631\u0648 \u0646\u0628\u0627\u06cc\u062f \u0628\u0627 URI \u0646\u0648\u0639 <code>file:\/\/<\/code> \u06cc\u0627 Permission \u062f\u0627\u0626\u0645\u06cc \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0630\u0627\u0631\u06cc\u0645.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9 Activity \u062f\u0627\u062e\u0644\u06cc:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;activity\n    android:name=\".ui.private.PrivateProfileActivity\"\n    android:exported=\"false\" \/>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">&lt;<\/span><span style=\"color: #24292E\">activity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">name<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;.ui.private.PrivateProfileActivity&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    android:<\/span><span style=\"color: #6F42C1\">exported<\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #032F62\">&quot;false&quot;<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">\/&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u0646\u062a\u0631\u0644\u200c\u0634\u062f\u0647 \u06cc\u06a9 \u0641\u0627\u06cc\u0644\u060c \u0627\u0632 <code>FileProvider<\/code> \u0648 \u0645\u062c\u0648\u0632 \u0645\u0648\u0642\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val uri =\n    FileProvider.getUriForFile(\n        context,\n        \"${context.packageName}.fileprovider\",\n        file\n    )\n\nval shareIntent =\n    Intent(Intent.ACTION_SEND).apply {\n        type = \"application\/pdf\"\n        putExtra(\n            Intent.EXTRA_STREAM,\n            uri\n        )\n\n        addFlags(\n            Intent.FLAG_GRANT_READ_URI_PERMISSION\n        )\n    }\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> uri <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    FileProvider.<\/span><span style=\"color: #6F42C1\">getUriForFile<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #032F62\">&quot;${context.packageName}.fileprovider&quot;<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        file<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> shareIntent <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6F42C1\">Intent<\/span><span style=\"color: #24292E\">(Intent.ACTION_SEND).<\/span><span style=\"color: #6F42C1\">apply<\/span><span style=\"color: #24292E\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        type <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #032F62\">&quot;application\/pdf&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">putExtra<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Intent.EXTRA_STREAM,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            uri<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6F42C1\">addFlags<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            Intent.FLAG_GRANT_READ_URI_PERMISSION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0642\u0637 \u0641\u0627\u06cc\u0644\u06cc \u0628\u0627\u06cc\u062f Share \u0628\u0634\u0647 \u06a9\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0631\u0627\u06cc \u0627\u0634\u062a\u0631\u0627\u06a9 \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647. \u0646\u0628\u0627\u06cc\u062f \u0645\u0633\u06cc\u0631 \u0627\u0635\u0644\u06cc \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633\u060c \u0641\u0627\u06cc\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u06cc\u0627 \u067e\u0648\u0634\u0647 \u062e\u0635\u0648\u0635\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0648 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 FileProvider \u0642\u0631\u0627\u0631 \u0628\u062f\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0631\u0648 \u062f\u0627\u062e\u0644 Notification \u06a9\u0627\u0645\u0644 \u0646\u0645\u0627\u06cc\u0634 \u0646\u062f\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0639\u0644\u0627\u0646 \u0645\u0645\u06a9\u0646\u0647 \u0631\u0648\u06cc Lock Screen \u062f\u06cc\u062f\u0647 \u0628\u0634\u0647. \u0645\u062b\u0644\u0627\u064b \u0627\u06af\u0647 \u067e\u06cc\u0627\u0645 \u0627\u0639\u0644\u0627\u0646 \u0634\u0627\u0645\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u06a9\u0627\u0645\u0644\u060c \u0645\u0648\u062c\u0648\u062f\u06cc \u0645\u0627\u0644\u06cc \u06cc\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u062e\u0635\u0648\u0635\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u0634\u0647\u060c \u0647\u0631 \u06a9\u0633\u06cc \u06a9\u0647 \u0635\u0641\u062d\u0647 \u06af\u0648\u0634\u06cc \u0631\u0648 \u0645\u06cc\u200c\u0628\u06cc\u0646\u0647 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u0627\u0648\u0646 \u0631\u0648 \u0628\u062e\u0648\u0646\u0647. \u0628\u0631\u0627\u06cc Notification\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0645\u06cc\u0634\u0647 \u0646\u0633\u062e\u0647 \u0639\u0645\u0648\u0645\u06cc \u062c\u062f\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0631\u062f:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val publicNotification =\n    NotificationCompat.Builder(\n        context,\n        PRIVATE_CHANNEL_ID\n    )\n        .setSmallIcon(\n            R.drawable.ic_notification\n        )\n        .setContentTitle(\n            \"GheimatBan\"\n        )\n        .setContentText(\n            \"\u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u062c\u062f\u06cc\u062f \u062f\u0627\u0631\u06cc.\"\n        )\n        .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> publicNotification <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    NotificationCompat.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        PRIVATE_CHANNEL_ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">setSmallIcon<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            R.drawable.ic_notification<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">setContentTitle<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;GheimatBan&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">setContentText<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u062c\u062f\u06cc\u062f \u062f\u0627\u0631\u06cc.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0639\u062f \u0627\u0639\u0644\u0627\u0646 \u0627\u0635\u0644\u06cc:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val privateNotification =\n    NotificationCompat.Builder(\n        context,\n        PRIVATE_CHANNEL_ID\n    )\n        .setSmallIcon(\n            R.drawable.ic_notification\n        )\n        .setContentTitle(\n            \"\u0647\u0634\u062f\u0627\u0631 \u0642\u06cc\u0645\u062a\"\n        )\n        .setContentText(\n            \"\u0642\u06cc\u0645\u062a \u06a9\u0627\u0644\u0627\u06cc \u0645\u0648\u0631\u062f\u0639\u0644\u0627\u0642\u0647\u200c\u0627\u062a \u06a9\u0627\u0647\u0634 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f.\"\n        )\n        .setVisibility(\n            NotificationCompat.VISIBILITY_PRIVATE\n        )\n        .setPublicVersion(\n            publicNotification\n        )\n        .build()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> privateNotification <\/span><span style=\"color: #D73A49\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    NotificationCompat.<\/span><span style=\"color: #6F42C1\">Builder<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        context,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        PRIVATE_CHANNEL_ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">setSmallIcon<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            R.drawable.ic_notification<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">setContentTitle<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\u0647\u0634\u062f\u0627\u0631 \u0642\u06cc\u0645\u062a&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">setContentText<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #032F62\">&quot;\u0642\u06cc\u0645\u062a \u06a9\u0627\u0644\u0627\u06cc \u0645\u0648\u0631\u062f\u0639\u0644\u0627\u0642\u0647\u200c\u0627\u062a \u06a9\u0627\u0647\u0634 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">setVisibility<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            NotificationCompat.VISIBILITY_PRIVATE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">setPublicVersion<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            publicNotification<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        .<\/span><span style=\"color: #6F42C1\">build<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647\u062a\u0631\u0647 \u0645\u062a\u0646 \u0627\u0639\u0644\u0627\u0646 \u0647\u0645 \u062a\u0627 \u062c\u0627\u06cc \u0645\u0645\u06a9\u0646 \u06a9\u0645\u06cc\u0646\u0647 \u0628\u0627\u0634\u0647. \u06a9\u0627\u0631\u0628\u0631 \u0628\u0639\u062f \u0627\u0632 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0639\u0628\u0648\u0631 \u0627\u0632 \u0642\u0641\u0644 \u062f\u0633\u062a\u06af\u0627\u0647 \u0645\u06cc\u200c\u062a\u0648\u0646\u0647 \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0627\u0645\u0644 \u0631\u0648 \u0628\u0628\u06cc\u0646\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u067e\u0627\u06a9 \u06a9\u0631\u062f\u0646 \u062f\u0627\u062f\u0647 \u06cc\u0639\u0646\u06cc \u062a\u0645\u0627\u0645 Reference\u0647\u0627 \u0647\u0645 \u067e\u0627\u06a9 \u0628\u0634\u0646<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u06af\u0627\u0647\u06cc \u062a\u0648\u06a9\u0646 \u0631\u0648 \u0627\u0632 DataStore \u062d\u0630\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0627\u0645\u0627 \u0646\u0633\u062e\u0647 \u062f\u06cc\u06af\u0631\u06cc \u0627\u0632 \u0627\u0648\u0646 \u062f\u0627\u062e\u0644 \u0645\u062a\u063a\u06cc\u0631 \u062d\u0627\u0641\u0638\u0647\u060c CookieJar\u060c Queue \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0622\u0641\u0644\u0627\u06cc\u0646 \u06cc\u0627 WorkManager \u0628\u0627\u0642\u06cc \u0645\u0648\u0646\u062f\u0647. \u062e\u0631\u0648\u062c \u0627\u0645\u0646 \u0628\u0627\u06cc\u062f \u062a\u0645\u0627\u0645 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0631\u0648 \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u0647. Work\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062d\u0633\u0627\u0628 \u0642\u0628\u0644\u06cc \u0628\u0627\u06cc\u062f Cancel \u0628\u0634\u0646 \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a Pending \u0646\u0628\u0627\u06cc\u062f \u0628\u0639\u062f \u0627\u0632 \u0648\u0631\u0648\u062f \u06a9\u0627\u0631\u0628\u0631 \u062f\u06cc\u06af\u0631\u06cc \u0627\u062c\u0631\u0627 \u0628\u0634\u0646.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#fff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class SessionCleaner(\n    private val context: Context,\n    private val tokenProvider: TokenProvider,\n    private val privateDatabase: PrivateDatabase,\n    private val cookieJar: ClearableCookieJar\n) {\n\n    suspend fun clearSession() {\n        tokenProvider.clear()\n        privateDatabase.clearAllTables()\n        cookieJar.clear()\n\n        WorkManager\n            .getInstance(context)\n            .cancelAllWorkByTag(\n                \"USER_PRIVATE_SYNC\"\n            )\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D73A49\">class<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">SessionCleaner<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> context: <\/span><span style=\"color: #6F42C1\">Context<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> tokenProvider: <\/span><span style=\"color: #6F42C1\">TokenProvider<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> privateDatabase: <\/span><span style=\"color: #6F42C1\">PrivateDatabase<\/span><span style=\"color: #24292E\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">private<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">val<\/span><span style=\"color: #24292E\"> cookieJar: <\/span><span style=\"color: #6F42C1\">ClearableCookieJar<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">suspend<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">fun<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">clearSession<\/span><span style=\"color: #24292E\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        tokenProvider.<\/span><span style=\"color: #6F42C1\">clear<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        privateDatabase.<\/span><span style=\"color: #6F42C1\">clearAllTables<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        cookieJar.<\/span><span style=\"color: #6F42C1\">clear<\/span><span style=\"color: #24292E\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        WorkManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">getInstance<\/span><span style=\"color: #24292E\">(context)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            .<\/span><span style=\"color: #6F42C1\">cancelAllWorkByTag<\/span><span style=\"color: #24292E\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                <\/span><span style=\"color: #032F62\">&quot;USER_PRIVATE_SYNC&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0645\u0686\u0646\u06cc\u0646 \u0647\u0631 Work \u062e\u0635\u0648\u0635\u06cc \u0628\u0627\u06cc\u062f \u0628\u0647 \u0634\u0646\u0627\u0633\u0647 Session \u0648\u0627\u0628\u0633\u062a\u0647 \u0628\u0627\u0634\u0647. \u0648\u0642\u062a\u06cc Worker \u0627\u062c\u0631\u0627 \u0645\u06cc\u0634\u0647\u060c \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0647 \u0647\u0646\u0648\u0632 \u0647\u0645\u0627\u0646 Session \u0641\u0639\u0627\u0644 \u0627\u0633\u062a. \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0628\u062f\u0648\u0646 \u0627\u0631\u0633\u0627\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u062a\u0648\u0642\u0641 \u0628\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0622\u06cc\u0627 \u0628\u0627\u06cc\u062f \u0647\u0645\u0647\u200c\u0686\u06cc\u0632 \u0631\u0648 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u0645\u061f<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-02-1-768x1024.avif\" alt=\"\" class=\"wp-image-6155\" srcset=\"https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-02-1-768x1024.avif 768w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-02-1-225x300.avif 225w, https:\/\/notes.yummybrands.studio\/wp-content\/uploads\/2026\/07\/Android-Learning-02-1.avif 1086w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0647\u0632\u06cc\u0646\u0647 \u0648 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u062f\u0627\u0631\u0647. \u0627\u06af\u0647 \u062a\u0645\u0627\u0645 Cache \u0642\u06cc\u0645\u062a \u06a9\u0627\u0644\u0627\u0647\u0627 \u0631\u0648 Encrypt \u06a9\u0646\u06cc\u0645\u060c \u0645\u062f\u06cc\u0631\u06cc\u062a Migration\u060c Backup\u060c \u062e\u0631\u0627\u0628\u06cc \u06a9\u0644\u06cc\u062f \u0648 \u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u067e\u06cc\u0686\u06cc\u062f\u0647\u200c\u062a\u0631 \u0645\u06cc\u0634\u0647\u061b \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u062e\u0648\u062f \u0642\u06cc\u0645\u062a\u200c\u0647\u0627 \u0639\u0645\u0648\u0645\u06cc \u0647\u0633\u062a\u0646. \u0628\u0647\u062a\u0631\u0647 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0631\u0648 \u0628\u0631\u0627\u0633\u0627\u0633 \u0645\u062f\u0644 \u062a\u0647\u062f\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0639\u0645\u0648\u0645\u06cc \u0645\u062b\u0644 \u0646\u0627\u0645 \u0648 \u0642\u06cc\u0645\u062a \u06a9\u0627\u0644\u0627 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u0647 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0646\u06cc\u0627\u0632 \u0646\u062f\u0627\u0631\u0646. \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0634\u062e\u0635\u06cc \u06a9\u0645\u200c\u062e\u0637\u0631 \u0628\u0647\u062a\u0631\u0647 \u062f\u0627\u062e\u0644 Storage \u062e\u0635\u0648\u0635\u06cc \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0646 \u0648 \u0686\u0631\u062e\u0647 \u067e\u0627\u06a9\u200c\u0633\u0627\u0632\u06cc \u0631\u0648\u0634\u0646\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646. \u062a\u0648\u06a9\u0646\u200c\u0647\u0627\u060c \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0645\u062d\u0644\u06cc \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0628\u0627\u06cc\u062f \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u0634\u0646. \u0631\u0645\u0632 \u0639\u0628\u0648\u0631\u060c \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0633\u0631\u0648\u0631\u060c Secret Key \u0633\u0631\u0648\u06cc\u0633\u200c\u0647\u0627\u06cc \u062e\u0627\u0631\u062c\u06cc \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u06a9\u0647 \u0627\u067e \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0627\u0648\u0646\u200c\u0647\u0627 \u0646\u062f\u0627\u0631\u0647 \u0627\u0635\u0644\u0627\u064b \u0646\u0628\u0627\u06cc\u062f \u0630\u062e\u06cc\u0631\u0647 \u0628\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u06cc\u200c\u0647\u062f\u0641 \u0645\u0645\u06a9\u0646\u0647 \u062d\u0633 \u0627\u0645\u0646\u06cc\u062a \u06a9\u0627\u0630\u0628 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0647. \u0627\u06af\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0639\u062f \u0627\u0632 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc Token \u0631\u0648 \u062f\u0627\u062e\u0644 Log \u0686\u0627\u067e \u06a9\u0646\u0647\u060c \u0627\u0645\u0646 \u0628\u0648\u062f\u0646 \u0641\u0627\u06cc\u0644 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0641\u0627\u06cc\u062f\u0647\u200c\u0627\u06cc \u0646\u062f\u0627\u0631\u0647. \u0627\u06af\u0647 Backup \u0627\u0634\u062a\u0628\u0627\u0647 \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0628\u0627\u0634\u0647\u060c Ciphertext \u0648 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u062e\u0635\u0648\u0635\u06cc \u0645\u0645\u06a9\u0646\u0647 \u0628\u0647 \u062f\u0633\u062a\u06af\u0627\u0647 \u062f\u06cc\u06af\u0631 \u0645\u0646\u062a\u0642\u0644 \u0628\u0634\u0646. \u0627\u06af\u0647 Backend \u0627\u062c\u0627\u0632\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0628\u062f\u0647\u060c \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u06af\u0648\u0634\u06cc \u062c\u0644\u0648\u06cc \u0646\u0634\u062a \u0633\u0631\u0648\u0631 \u0631\u0648 \u0646\u0645\u06cc\u200c\u06af\u06cc\u0631\u0647. \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0627\u06cc\u062f \u0627\u0632 \u0644\u062d\u0638\u0647 \u062c\u0645\u0639\u200c\u0622\u0648\u0631\u06cc \u062a\u0627 \u0630\u062e\u06cc\u0631\u0647\u060c \u0646\u0645\u0627\u06cc\u0634\u060c \u0627\u0646\u062a\u0642\u0627\u0644\u060c Backup\u060c \u06af\u0632\u0627\u0631\u0634 \u062e\u0637\u0627 \u0648 \u062d\u0630\u0641 \u0646\u0647\u0627\u06cc\u06cc \u0627\u062f\u0627\u0645\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0647.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0631 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646 \u062a\u0635\u0645\u06cc\u0645 \u0634\u0631\u0648\u0639 \u0645\u06cc\u0634\u0647 \u06a9\u0647 \u0686\u0647 \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0627\u06cc\u062f \u062c\u0645\u0639\u200c\u0622\u0648\u0631\u06cc \u0648 \u0630\u062e\u06cc\u0631\u0647 \u0628\u0634\u0647. \u062f\u0627\u062f\u0647 \u0639\u0645\u0648\u0645\u06cc\u060c \u062f\u0627\u062f\u0647 \u0634\u062e\u0635\u06cc \u0648 \u062f\u0627\u062f\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0628\u0627\u06cc\u062f \u0628\u0627 \u06cc\u06a9 \u0633\u06cc\u0627\u0633\u062a \u06cc\u06a9\u0633\u0627\u0646 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0628\u0634\u0646. \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062e\u0635\u0648\u0635\u06cc \u0628\u0627\u06cc\u062f \u062f\u0627\u062e\u0644 Storage \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0642\u0631\u0627\u0631 \u0628\u06af\u06cc\u0631\u0646 \u0648 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631 \u062d\u0633\u0627\u0633 \u0645\u062b\u0644 Token\u0647\u0627 \u0628\u0627\u06cc\u062f \u0642\u0628\u0644 \u0627\u0632 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0646 \u0628\u0627 \u06a9\u0644\u06cc\u062f\u06cc \u062f\u0627\u062e\u0644 Android Keystore \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u062f\u0631\u0633 \u06cc\u06a9 <code>CryptoManager<\/code> \u0628\u0627 <code>AES\/GCM\/NoPadding<\/code> \u0633\u0627\u062e\u062a\u06cc\u0645\u060c Ciphertext \u0648 IV \u0631\u0648 \u062f\u0627\u062e\u0644 DataStore \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u06cc\u0645 \u0648 \u06cc\u06a9 <code>SecureTokenStore<\/code> \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc Token\u0647\u0627 \u067e\u06cc\u0627\u062f\u0647 \u06a9\u0631\u062f\u06cc\u0645. \u0628\u0639\u062f \u062f\u06cc\u062f\u06cc\u0645 \u06a9\u0647 \u0627\u0645\u0646\u06cc\u062a \u0641\u0642\u0637 \u0628\u0647 \u0641\u0627\u06cc\u0644 \u062e\u062a\u0645 \u0646\u0645\u06cc\u0634\u0647\u061b Log\u0647\u0627\u060c Crash Report\u0647\u0627\u060c Screenshot\u060c Clipboard\u060c Notification\u060c Backup\u060c Room\u060c WorkManager \u0648 Component\u0647\u0627\u06cc Export\u0634\u062f\u0647 \u0647\u0645 \u0645\u0645\u06a9\u0646\u0647 \u0628\u0627\u0639\u062b \u0627\u0641\u0634\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0634\u0646.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u0647\u0645\u200c\u062a\u0631\u06cc\u0646 \u0627\u0635\u0644 \u0627\u06cc\u0646 \u062f\u0631\u0633 \u0627\u06cc\u0646\u0647: <strong>\u0647\u0631 \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u0628\u0627\u06cc\u062f \u0641\u0642\u0637 \u0628\u0647 \u0627\u0646\u062f\u0627\u0632\u0647 \u0644\u0627\u0632\u0645\u060c \u062f\u0631 \u0627\u0645\u0646\u200c\u062a\u0631\u06cc\u0646 \u0645\u062d\u0644 \u0645\u062a\u0646\u0627\u0633\u0628 \u0628\u0627 \u062d\u0633\u0627\u0633\u06cc\u062a\u0634 \u0648 \u0641\u0642\u0637 \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647\u0634 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0634\u0647.<\/strong> \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u0647\u0645\u0647\u060c \u0627\u0645\u0627 \u0645\u062d\u0627\u0641\u0638\u062a \u0648\u0627\u0642\u0639\u06cc \u0632\u0645\u0627\u0646\u06cc \u0634\u06a9\u0644 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0647 \u06a9\u0647 \u06a9\u0644 \u0686\u0631\u062e\u0647 \u0632\u0646\u062f\u06af\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0648 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0628\u062e\u0634 \u0634\u0634\u0645 \u2014 \u0627\u0631\u062a\u0628\u0627\u0637 \u0644\u062d\u0638\u0647\u200c\u0627\u06cc \u062f\u0631\u0633 \u0686\u0647\u0644\u200c\u0648\u0686\u0647\u0627\u0631\u0645 WebSocket \u0627\u0635\u0644\u0627\u064b WebSocket \u0686\u0631\u0627 \u0628\u0647 \u0648\u062c\u0648\u062f \u0627\u0648\u0645\u062f\u061f \u0641\u0631\u0636 \u06a9\u0646 \u062f\u0627\u062e\u0644 \u0642\u06cc\u0645\u062a\u200c\u0628\u0627\u0646 \u0635\u0641\u062d\u0647 \u0642\u06cc\u0645\u062a \u06cc\u06a9 \u06af\u0648\u0634\u06cc \u0631\u0648 \u0628\u0627\u0632 \u06a9\u0631\u062f\u06cc. \u062d\u0627\u0644\u0627 \u0642\u06cc\u0645\u062a \u0627\u0648\u0646 \u06af\u0648\u0634\u06cc \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0647. \u0633\u0624\u0627\u0644 \u0627\u06cc\u0646\u062c\u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0632 \u06a9\u062c\u0627 \u0628\u0627\u06cc\u062f \u0628\u0641\u0647\u0645\u0647 \u0627\u06cc\u0646 \u0627\u062a\u0641\u0627\u0642 \u0627\u0641\u062a\u0627\u062f\u0647\u061f \u0627\u0648\u0644\u06cc\u0646 \u0631\u0627\u0647\u200c\u062d\u0644\u06cc \u06a9\u0647 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u0647 \u0630\u0647\u0646 \u0645\u06cc\u200c\u0631\u0633\u0647 \u0627\u06cc\u0646\u0647 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0631 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[15],"tags":[],"class_list":["post-6099","post","type-post","status-publish","format-standard","hentry","category-15"],"_links":{"self":[{"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=\/wp\/v2\/posts\/6099","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6099"}],"version-history":[{"count":11,"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=\/wp\/v2\/posts\/6099\/revisions"}],"predecessor-version":[{"id":6240,"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=\/wp\/v2\/posts\/6099\/revisions\/6240"}],"wp:attachment":[{"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6099"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6099"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/notes.yummybrands.studio\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6099"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}