{"id":408988,"date":"2024-06-29T20:30:55","date_gmt":"2024-06-29T20:30:55","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=408988"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T20:30:55","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=408988","title":{"rendered":"<span>\u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Live Activity \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u0427\u0430\u0441\u0442\u044c I<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Live Activity \u0431\u044b\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u043d Apple \u043d\u0430 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 iOS 16 \u0438 \u043d\u043e\u0432\u043e\u0433\u043e iPhone \u0441 Dynamic Island. \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u043b iOS \u0434\u043e 16.1.\u00a0<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0437\u0438\u0437, \u044f iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 inDrive. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438 Live Activity \u0432 \u043d\u0430\u0448\u0435 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/409\/65e\/05f\/40965e05f680c846fdc57d583ada969c.png\" width=\"3121\" height=\"1761\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/409\/65e\/05f\/40965e05f680c846fdc57d583ada969c.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c Live Activity?\u00a0<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\u00a0<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b Live Activity. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u0437\u0430\u043a\u0430\u0437\u0430\u043b\u0438 \u043d\u0435\u043a\u0443\u044e \u0443\u0441\u043b\u0443\u0433\u0443. \u041f\u043e\u043c\u0438\u043c\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u00ab\u041a \u0432\u0430\u043c \u0435\u0434\u0435\u0442 \u0437\u0430\u043a\u0430\u0437\u00bb, \u0432\u0430\u043c \u043d\u0430 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0436\u0435\u0442 \u0441\u043e \u0432\u0441\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439: \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430, \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u0443\u0440\u044c\u0435\u0440\u0435\/\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb4\/36b\/a35\/bb436ba35650edf27876de3063d6d823.png\" alt=\"\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 iPhone 14 Pro \u0438\u043b\u0438 14 Pro Max, \u0432\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f Dynamic Island\" title=\"\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 iPhone 14 Pro \u0438\u043b\u0438 14 Pro Max, \u0432\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f Dynamic Island\" width=\"2400\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb4\/36b\/a35\/bb436ba35650edf27876de3063d6d823.png\"\/><figcaption>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 iPhone 14 Pro \u0438\u043b\u0438 14 Pro Max, \u0432\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f Dynamic Island<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/45a\/94a\/df4\/45a94adf4c691e31351b01064d376453.png\" alt=\"\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0444\u0438\u0447\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0443\u0441 \u043f\u043e\u0435\u0437\u0434\u043a\u0438, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e \u0432\u0430\u0441 \u0435\u0445\u0430\u0442\u044c \u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044e, \u043d\u043e\u043c\u0435\u0440 \u0438 \u0446\u0432\u0435\u0442 \u043c\u0430\u0448\u0438\u043d\u044b\" title=\"\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0444\u0438\u0447\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0443\u0441 \u043f\u043e\u0435\u0437\u0434\u043a\u0438, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e \u0432\u0430\u0441 \u0435\u0445\u0430\u0442\u044c \u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044e, \u043d\u043e\u043c\u0435\u0440 \u0438 \u0446\u0432\u0435\u0442 \u043c\u0430\u0448\u0438\u043d\u044b\" width=\"2400\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/45a\/94a\/df4\/45a94adf4c691e31351b01064d376453.png\"\/><figcaption>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0444\u0438\u0447\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0443\u0441 \u043f\u043e\u0435\u0437\u0434\u043a\u0438, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e \u0432\u0430\u0441 \u0435\u0445\u0430\u0442\u044c \u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044e, \u043d\u043e\u043c\u0435\u0440 \u0438 \u0446\u0432\u0435\u0442 \u043c\u0430\u0448\u0438\u043d\u044b<\/figcaption><\/figure>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d<\/h3>\n<p>\u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f Live Activity \u0432 \u043f\u0440\u043e\u0435\u043a\u0442. \u0417\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u2014 \u043d\u0438 \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u0447\u0438 \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.\u00a0<\/p>\n<p>\u041d\u0430\u0448 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u0441 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 Live Activity \u0431\u0438\u0437\u043d\u0435\u0441\u0443. \u041d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u00ab\u043f\u0440\u043e\u0434\u0430\u0442\u044c\u00bb \u044d\u0442\u0443 \u0438\u0434\u0435\u044e. \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0441\u0442\u0430\u0442\u0435\u0439 \u0438 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u0434\u0435\u044e.\u00a0<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ad5\/f3a\/b80\/ad5f3ab80488f349e1580806fbd9716d.gif\" alt=\"\u0422\u043e \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043c\u043e \" title=\"\u0422\u043e \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043c\u043e \" width=\"295\" height=\"640\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ad5\/f3a\/b80\/ad5f3ab80488f349e1580806fbd9716d.gif\"\/><figcaption>\u0422\u043e \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043c\u043e <\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u043e\u043b\u0433\u0438\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0439 \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c Live Activity \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 inDrive. \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u0435\u043d\u044f, \u0431\u044b\u043b\u043e \u0435\u0449\u0435 \u0434\u0432\u0430 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. <\/p>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 \u0431\u043e\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043e\u0437\u043d\u0438\u043a \u0440\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c:\u00a0<\/p>\n<ol>\n<li>\n<p>XcodeGen \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u2014 \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 project.yml \u043d\u043e\u0432\u044b\u0439 target, \u0434\u0430 \u0435\u0449\u0435 \u0438 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 Live Activity.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 Push Notification \u0441 Live Activity.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043d\u0430\u0441 \u0441\u0432\u043e\u044f \u0434\u0438\u0437\u0430\u0439\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0432 Live Activity.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u0441\u0432\u044f\u0437\u0430\u0442\u044c UDF \u0441 Live Activity. <\/p>\n<\/li>\n<\/ol>\n<h3>XcodeGen \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a<\/h3>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435\u00a0\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c XcodeGen \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 <em>*.xcodeproj<\/em> \u0444\u0430\u0439\u043b\u0430. \u0412 \u044d\u0442\u043e\u043c \u0431\u044b\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0447\u0435\u043b\u0435\u043d\u0434\u0436 \u2014 \u0440\u0430\u043d\u0435\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438. \u041d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442\u044b \u0432 <em>project.yml<\/em> \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0442\u0430\u0440\u0433\u0435\u0442\u0435 \u0432 <code>info<\/code> \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u043b\u0430\u0433:\u00a0<\/p>\n<pre><code class=\"yaml\">NSSupportsLiveActivities: true<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442 \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0433\u043e Live Activity \u0432\u0438\u0434\u0436\u0435\u0442-\u0442\u0430\u0433\u0440\u0435\u0442\u0430:<\/p>\n<pre><code class=\"yaml\">LiveActivity:   type: app-extension   platform: iOS   info:     path: \"${target_name}\/SupportingFiles\/Info.plist\"     properties:       CFBundleDisplayName: ${target_name}       CFBundleShortVersionString: *cfBundleShortVersionString       NSExtension:         NSExtensionPointIdentifier: \"com.apple.widgetkit-extension\"   settings:     base:       TARGETED_DEVICE_FAMILY: \"$(inherited)\"       PRODUCT_BUNDLE_IDENTIFIER: ${bundleId}     configs:       debug:         PROVISIONING_PROFILE_SPECIFIER: \"match Development ${bundleId}\"         CODE_SIGN_IDENTITY: \"\"         DEBUG_INFORMATION_FORMAT: \"\"       release:         PROVISIONING_PROFILE_SPECIFIER: \"match AppStore ${bundleId}\"         CODE_SIGN_IDENTITY: \"\"   dependencies:     - framework: SwiftUI.framework       implicit: true     - framework: WidgetKit.framework       implicit: true<\/code><\/pre>\n<p>\u0418 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0442\u0430\u0440\u0433\u0435\u0442\u0435: <\/p>\n<pre><code class=\"yaml\">dependencies:  \u00a0- target: LiveActivity<\/code><\/pre>\n<p>\u0421 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e <a href=\"https:\/\/developer.apple.com\/documentation\/appstoreconnectapi\/bundle_ids\">bundleId<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a Provision Profile (\u0442\u043e\u0436\u0435  \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0430\u043d\u0434\u043b\u0430).<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0438 \u0437\u0430\u0432\u0435\u0442\u043d\u043e\u0433\u043e:\u00a0<em>make finished successfully ?, <\/em>\u043d\u0430\u0434\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c Live Activity\u00a0\u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437. \u041c\u044b \u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043c\u043e\u043c\u0435\u043d\u0442 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 Content State \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438 \u0442\u0435\u0445, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f. \u0412\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c main \u2014  <strong>\u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f. <\/strong><\/p>\n<pre><code class=\"swift\">@available(iOSApplicationExtension 16.1, *) @main struct Widgets: WidgetBundle {     var body: some Widget {         LiveActivityWidgetView()     } } <\/code><\/pre>\n<p><em>\u00a0\u041f\u043e\u043a\u0430\u0436\u0435\u043c \u0441\u0440\u0430\u0437\u0443, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Live Activity (iOS 16.1):\u00a0<\/em><\/p>\n<pre><code class=\"swift\">public func startWith(_ attributes: Attributes?, state: Attributes.ContentState, pushType: PushType?) { \/\/ 1     guard ActivityAuthorizationInfo().areActivitiesEnabled,     let attributes = attributes,     activity.isNil     else { return }      do {         \/\/ 2         activity = try Activity&lt;Attributes>.request(             attributes: attributes,             contentState: state,             pushType: pushType          )         if let token = activity?.pushToken {             let unwrappedToken = token.map { String(format: \"%02x\", $0) }.joined()             logger.debug(\"? Live Activity token: \\(unwrappedToken)\")             \/\/ 3              props.action.execute(with: .didStartActivityWith(token: unwrappedToken))         } else {             logger.error(\"\u26d4\ufe0f Failed Live Activity\")         }         \/\/ 4         Task {             guard let activity = activity else { return }             for await data in activity.pushTokenUpdates {                 let token = data.map { String(format: \"%02x\", $0) }.joined()                 logger.debug(\"?? Live Activity token updates: \\(token)\")                 props.action.execute(with: .didPushTokenUpdates(token: token))             }         }     } catch {         logger.error(\"\u26d4\ufe0f Failed Live Activity: \\(error.localizedDescription)\")         props.action.execute(with: .didFailStartLiveActivity(error: error))     } } <\/code><\/pre>\n<ol>\n<li>\n<p>\u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c Live Activty\u00a0\u0438 \u043d\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 Activity \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c pushType:<\/p>\n<ul>\n<li>\n<p>.<em>token<\/em> \u2014 \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c Live Activity \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c Push Notifications.<\/p>\n<\/li>\n<li>\n<p><em>nil<\/em> \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u043a\u0435\u043d, \u0442\u043e\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u00a0pushToken,\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0431\u044d\u043a. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0431\u044d\u043a \u043f\u043e\u0439\u043c\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f Live Activity.<\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u043a\u0435\u043d \u0434\u043b\u044f Live Activity \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c \u0438\u043b\u0438 \u0431\u044b\u043b\u043e \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d\u043e. \u041d\u0430\u0434\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434.<\/p>\n<\/li>\n<\/ol>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c Activity \u0438\u0437 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Push Notification (iOS 16.1):\u00a0<\/p>\n<pre><code class=\"swift\">Task { \u00a0\u00a0\u00a0\u00a0await activity.update(using: state) }<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c:\u00a0<\/p>\n<pre><code class=\"swift\">Task {     await activity.end(using: state, dismissalPolicy: .immediate) }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <em>startWith() <\/em>\u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c Live Activity.\u00a0\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u0442\u0435 \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c, \u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u043a\u0435\u0439\u0441\u0430\u043c\u0438 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.\u00a0<\/p>\n<h3>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 Push Notification \u0441 Live Activity\u00a0<\/h3>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0431\u0435\u0437 \u043f\u0443\u0448\u0435\u0439. Live Activity \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a, \u0447\u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Push Notifications \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u0434\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438: <\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0430\u043a Live Activity \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e push \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0435?<\/strong> \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u043a\u0430\u043f\u043e\u0442\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f Apple. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0430\u043c\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u043c\u0443 Payload \u043f\u0443\u0448\u0430 \u0438 id, \u043a \u043a\u0430\u043a\u043e\u043c\u0443 Live Activity \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u0430\u043a-\u0442\u043e \u043b\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0443\u0448\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438?<\/strong> \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 Apple \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u0442\u043b\u043e\u0432\u0438\u0442\u044c \u043f\u0443\u0448 \u0432 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u041c\u044b \u0441 \u0440\u0435\u0431\u044f\u0442\u0430\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u0438 \u043c\u0435\u0442\u043e\u0434:\u00a0<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"swift\">application(_:didReceiveRemoteNotification:fetchCompletionHandler:)<\/code><\/pre>\n<p><strong>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 Live Activity Push Notification \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f.<\/strong><\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0448\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0431\u044d\u043a\u0435\u043d\u0434\u0430?<\/strong> \u041c\u044b \u0441\u0430\u043c\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 Payload \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0444\u043b\u043e\u0443 \u043f\u0443\u0448-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.\u00a0\u0414\u0430\u043b\u044c\u0448\u0435 <a href=\"https:\/\/apps.apple.com\/kz\/app\/push-hero-test-notifications\/id1499227284\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e<\/a>.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u044f\u0441\u043d\u044e, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u043b\u0430 \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0435. \u041c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 APNS c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 Payload \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. <\/p>\n<details class=\"spoiler\">\n<summary>CURL  \u0432 APNs <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">curl -v \\ --header \"apns-topic:{Your App Bundle ID}.push-type.liveactivity\" \\ --header \"apns-push-type:liveactivity\" \\ --header \"authorization: bearer $AUTHENTICATION_TOKEN\" \\ --data \\ '{\"aps\": {    \"timestamp\":1663300480,    \"event\": \"update\",    \"content-state\": {       \"playerOnFirst\": \"Tony Stark\",       \"currentLap\": 2    },    \"alert\": {       \"title\": \"Race Update\",       \"body\": \"Tony Stark is now leading the race!\"    } }}' \\ --http2 \\ https:\/\/${APNS_HOST_NAME}\/3\/device\/$DEVICE_TOKEN2<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>Payload<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"json\">{   \"aps\": {     \"timestamp\": 1669698850,     \"event\": \"update\",     \"content-state\": {       \"rideStatus\": \"on_ride\",       \"time\": 5     }   } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0437\u0430\u0439\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438 Live Activity<\/h3>\n<p>\u0420\u0430\u043d\u0435\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 SwiftUI, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0441\u0442\u0430\u043b\u043e \u0435\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043d\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u0440\u0430\u0441\u043e\u0442\u0443 \u0438 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438\u0437 \u0434\u0438\u0437\u0430\u0439\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<ol>\n<li>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b: \u0446\u0432\u0435\u0442\u0430, \u0448\u0440\u0438\u0444\u0442\u044b, \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 iOS 15, Apple \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b UIKit \u0432 SwiftUI.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/027\/c97\/043\/027c970430106cdcf8d65de2892353f2.png\" width=\"1522\" height=\"712\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/027\/c97\/043\/027c970430106cdcf8d65de2892353f2.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041c\u044b \u043f\u043e\u0448\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u043e. \u041a\u0441\u0442\u0430\u0442\u0438, \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c \u0432 open source \u2014 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c. <\/p>\n<ol start=\"2\">\n<li>\n<p>Apple \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u043b\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0438 UIView \u0432 SwiftUI.View \u2014 UIViewRepresentable, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u043d\u0430\u043c \u0436\u0438\u0437\u043d\u044c, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a: <\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5b8\/802\/782\/5b88027829887303469f7b216f604769.png\" width=\"1179\" height=\"792\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5b8\/802\/782\/5b88027829887303469f7b216f604769.png\"\/><figcaption><\/figcaption><\/figure>\n<p> \u0418\u043b\u0438 \u0442\u0430\u043a: <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a65\/774\/b59\/a65774b59cf6edde4de889aa8116cec4.png\" width=\"1179\" height=\"887\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a65\/774\/b59\/a65774b59cf6edde4de889aa8116cec4.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0425\u043e\u0442\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0442\u0430\u043a:)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d7d\/d32\/dd2\/d7dd32dd297a2612f66587496d76de8b.png\" width=\"1032\" height=\"720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d7d\/d32\/dd2\/d7dd32dd297a2612f66587496d76de8b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/595\/782\/0b8\/5957820b8cf697151fb8ff1638209396.png\" width=\"1426\" height=\"966\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/595\/782\/0b8\/5957820b8cf697151fb8ff1638209396.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u044b \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 \u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0447\u0430\u0441\u0442\u0438 \u0444\u0438\u0447, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0430 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 SwiftUI. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0434\u044b \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c.<\/p>\n<h2>\u0426\u0432\u0435\u0442\u0430 \u043c\u0430\u0448\u0438\u043d<\/h2>\n<p>\u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043c\u044b \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0434\u0435\u0442 \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u042d\u0442\u043e \u0438\u043a\u043e\u043d\u043a\u0430 \u0437\u0430\u0448\u0438\u0442\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u2014 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0435 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c. \u0414\u043b\u044f LiveActivity \u044f \u0432\u0437\u044f\u043b \u0438\u043a\u043e\u043d\u043a\u0443 \u0438\u0437 Figma, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0438 \u0437\u0430\u0431\u044b\u043b. <\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u0448\u0435\u043b \u043c\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0438 \u0441\u043a\u0430\u0437\u0430\u043b: \u00ab\u0410 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043c \u043d\u0435 \u043a\u0440\u0430\u0441\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u043a\u0438 \u0432 \u0442\u043e\u0442 \u0446\u0432\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441 \u0431\u044d\u043a\u0435\u043d\u0434\u0430?\u00bb. \u041c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u0447\u0442\u043e \u0446\u0432\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0432\u0438\u0434\u0435 \u0442\u0435\u043a\u0441\u0442\u0430: Gold, Blue \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0431\u044d\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0449\u0435 hex, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u0438 \u043a\u0440\u0430\u0441\u0438\u0442\u044c. <\/p>\n<p>\u0422\u0443\u0442 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0445\u0438\u0442\u0440\u0438\u0442\u044c. \u041c\u044b \u0440\u0430\u0437\u0431\u0438\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0435\u0432: \u043a\u0443\u0437\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u043c \u043a\u0440\u0430\u0441\u0438\u0442\u044c, \u0438 \u0431\u0430\u0437\u0443 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/19c\/e21\/285\/19ce21285a39b31abb16d9b215be90b4.png\" width=\"1090\" height=\"260\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/19c\/e21\/285\/19ce21285a39b31abb16d9b215be90b4.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u00a0\u0422\u0430\u043a\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u0430.<\/p>\n<h3>\u041a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b?<\/h3>\n<p>\u041c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432 <strong>47<\/strong> \u0441\u0442\u0440\u0430\u043d\u0430\u0445 \u043c\u0438\u0440\u0430 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u044f\u0437\u044b\u043a\u043e\u0432. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u0444\u0438\u0447\u0443, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044f\u0437\u044b\u043a\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u0440\u0430\u0431\u0441\u043a\u0438\u0439 (\u0433\u0434\u0435 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e). <\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430\u043c\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Crowdin<u>,<\/u> \u0430 \u0434\u043b\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0438 \u043e\u0441\u0442\u0440\u043e\u0432\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0434\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c SwiftUI \u0432 \u0432\u0438\u0434\u0435 Environment.<\/p>\n<pre><code class=\"swift\">@Environment(\\.layoutDirection) var direction<\/code><\/pre>\n<h3>UDF + Live Activity <\/h3>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f UDF \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c service component, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u00ab\u0441\u043b\u0443\u0448\u0430\u0442\u044c\u00bb \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e State, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 Live Activity \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. <\/p>\n<p>\u041a\u0430\u043a \u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0432\u044b\u0448\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u0430\u0440\u0442, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 Live Activity \u0447\u0435\u0440\u0435\u0437 service component. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u0431\u0435\u0437 remote push notification). <\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c Live Activity \u0447\u0435\u0440\u0435\u0437 \u043f\u0443\u0448\u0438, \u0432\u0430\u043c \u044f\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u044e \u043c\u0430\u0433\u0438\u044e Apple \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f.<\/p>\n<\/div>\n<\/details>\n<pre><code class=\"swift\">import UDF import ActivityKit  @available(iOS 16.1, *) public typealias LiveActivityAttributes = ActivityAttributes &amp; Equatable   @available(iOS 16.1, *) open class LiveActivityServiceComponent&lt;Attributes: LiveActivityAttributes>      public var activity: Activity&lt;Attributes>?     public let disposer = Disposer()     public var props: Props = .init() {         didSet {             render(props)         }     }      public init() { }      open func render(_: Props) {         \/\/ \u0442\u0443\u0442 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u043f\u0441 \u043f\u0440\u0438\u0448\u0435\u043b         \/\/ \u043b\u0438\u0431\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044f\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u0432 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430\u0445         \/\/ \u0432\u044b\u0437\u044b\u0432\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b startWith(),updateWith(), endWith() \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e     } }  \/\/ MARK: - LiveActivityServiceComponent  @available(iOS 16.1, *) extension LiveActivityServiceComponent: ViewComponent {     public func startWith(_ attributes: Attributes?, state: Attributes.ContentState, pushType: PushType?) {         ...     }      public func updateWith(_ state: Attributes.ContentState) {         ...     }      public func endWith(_ state: Attributes.ContentState) {        ...     } }  \/\/ MARK: - Props  @available(iOS 16.1, *) public protocol LiveActivityProps: Equatable {     associatedtype Attributes: ActivityAttributes &amp; Equatable     var attributes: Attributes? { get }     var contentState: Attributes.ContentState? { get }     var pushType: PushType? { get }     var action: CommandOf&lt;LiveActivityAction> { get }      init(         attributes: Attributes?,         contentState: Attributes.ContentState?,         pushType: PushType?,         action: CommandOf&lt;LiveActivityAction>     ) }  @available(iOS 16.1, *) extension LiveActivityProps {     init() {         self.init(attributes: nil, contentState: nil, pushType: nil, action: .nop)     } }  @available(iOS 16.1, *) public extension LiveActivityServiceComponent {     struct Props: LiveActivityProps {         public let attributes: Attributes?         public let contentState: Attributes.ContentState?         public let pushType: PushType?         public let action: CommandOf&lt;LiveActivityAction>          public init(             attributes: Attributes? = nil,             contentState: Attributes.ContentState? = nil,             pushType: PushType? = nil,             action: CommandOf&lt;LiveActivityAction> = .nop         ) {             self.attributes = attributes             self.contentState = contentState             self.pushType = pushType             self.action = action         }     } }  \/\/ MARK: - Action  public enum LiveActivityAction: Action {     case didStartActivityWith(token: String)     case didPushTokenUpdates(token: String)     case didFailStartLiveActivity(error: Error) } <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043b\u043e\u0432\u0438\u0442\u044c LiveActivityAction \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0440\u0435\u0434\u044c\u044e\u0441\u0435\u0440\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439. \u0427\u0435\u0440\u0435\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c, \u0442\u0430\u043a \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c Live Activity. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/developer.apple.com\/documentation\/activitykit\/updating-and-ending-your-live-activity-with-activitykit-push-notifications\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> Apple.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0433\u043e\u0434\u0443 \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e Live Activity. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0445\u043e\u0447\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u041b\u0435\u0448\u0435 \u041a\u0430\u043a\u043e\u0443\u043b\u0438\u043d\u0443 \u0438 \u041f\u0435\u0442\u0435 \u041a\u0430\u0437\u0430\u043a\u043e\u0432\u0443 \u2014 \u0431\u0435\u0437 \u044d\u0442\u0438\u0445 \u0440\u0435\u0431\u044f\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. <\/p>\n<p><em>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/em><\/p>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/activitykit\/displaying-live-data-with-live-activities\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Apple<\/a> <\/p>\n<p><a href=\"https:\/\/sparrowcode.io\/ru\/tutorials\/live-activities\">\u0422\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043f\u043e Live Activity<\/a> <\/p>\n<p><a href=\"https:\/\/github.com\/inDriver\/UDF\/tree\/master\/UDF\">UDF <\/a><\/p>\n<p><a href=\"https:\/\/medium.com\/geekculture\/the-indriver-design-system-dont-try-to-leave-oymyakon-c9172f32c99a\">\u0421\u0442\u0430\u0442\u044c\u044f \u043e \u043d\u0430\u0448\u0435\u0439 \u0434\u0438\u0437\u0430\u0439\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u0435<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/companies\/inDrive\/articles\/708366\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0411\u0443\u0434\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c Live Activity \u0432 \u043f\u0440\u043e\u0435\u043a\u0442?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">46.15% <\/span><span class=\"tm-article-poll__answer-label\">\u0414\u0430<\/span><span class=\"tm-article-poll__answer-votes\">18<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 46.15%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">20.51% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0435\u0442<\/span><span class=\"tm-article-poll__answer-votes\">8<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 20.51%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">33.33% <\/span><span class=\"tm-article-poll__answer-label\">\u041a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0436\u0438\u0437\u043d\u0438<\/span><span class=\"tm-article-poll__answer-votes\">13<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 33.33%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 39 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 7 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/708366\/\"> https:\/\/habr.com\/ru\/articles\/708366\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Live Activity \u0431\u044b\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u043d Apple \u043d\u0430 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 iOS 16 \u0438 \u043d\u043e\u0432\u043e\u0433\u043e iPhone \u0441 Dynamic Island. \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u043b iOS \u0434\u043e 16.1.\u00a0<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0437\u0438\u0437, \u044f iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 inDrive. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438 Live Activity \u0432 \u043d\u0430\u0448\u0435 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c Live Activity?\u00a0<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\u00a0<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b Live Activity. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u0437\u0430\u043a\u0430\u0437\u0430\u043b\u0438 \u043d\u0435\u043a\u0443\u044e \u0443\u0441\u043b\u0443\u0433\u0443. \u041f\u043e\u043c\u0438\u043c\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u00ab\u041a \u0432\u0430\u043c \u0435\u0434\u0435\u0442 \u0437\u0430\u043a\u0430\u0437\u00bb, \u0432\u0430\u043c \u043d\u0430 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0436\u0435\u0442 \u0441\u043e \u0432\u0441\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439: \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430, \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u0443\u0440\u044c\u0435\u0440\u0435\/\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<figure class=\"full-width\"><figcaption>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 iPhone 14 Pro \u0438\u043b\u0438 14 Pro Max, \u0432\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f Dynamic Island<\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0444\u0438\u0447\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0443\u0441 \u043f\u043e\u0435\u0437\u0434\u043a\u0438, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e \u0432\u0430\u0441 \u0435\u0445\u0430\u0442\u044c \u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044e, \u043d\u043e\u043c\u0435\u0440 \u0438 \u0446\u0432\u0435\u0442 \u043c\u0430\u0448\u0438\u043d\u044b<\/figcaption><\/figure>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d<\/h3>\n<p>\u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f Live Activity \u0432 \u043f\u0440\u043e\u0435\u043a\u0442. \u0417\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u2014 \u043d\u0438 \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u0447\u0438 \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.\u00a0<\/p>\n<p>\u041d\u0430\u0448 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u0441 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 Live Activity \u0431\u0438\u0437\u043d\u0435\u0441\u0443. \u041d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u00ab\u043f\u0440\u043e\u0434\u0430\u0442\u044c\u00bb \u044d\u0442\u0443 \u0438\u0434\u0435\u044e. \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0441\u0442\u0430\u0442\u0435\u0439 \u0438 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u0434\u0435\u044e.\u00a0<\/p>\n<figure class=\"\"><figcaption>\u0422\u043e \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043c\u043e <\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u043e\u043b\u0433\u0438\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0439 \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c Live Activity \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 inDrive. \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u0435\u043d\u044f, \u0431\u044b\u043b\u043e \u0435\u0449\u0435 \u0434\u0432\u0430 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. <\/p>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 \u0431\u043e\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043e\u0437\u043d\u0438\u043a \u0440\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c:\u00a0<\/p>\n<ol>\n<li>\n<p>XcodeGen \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u2014 \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 project.yml \u043d\u043e\u0432\u044b\u0439 target, \u0434\u0430 \u0435\u0449\u0435 \u0438 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 Live Activity.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 Push Notification \u0441 Live Activity.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043d\u0430\u0441 \u0441\u0432\u043e\u044f \u0434\u0438\u0437\u0430\u0439\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0432 Live Activity.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u0441\u0432\u044f\u0437\u0430\u0442\u044c UDF \u0441 Live Activity. <\/p>\n<\/li>\n<\/ol>\n<h3>XcodeGen \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a<\/h3>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435\u00a0\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c XcodeGen \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 <em>*.xcodeproj<\/em> \u0444\u0430\u0439\u043b\u0430. \u0412 \u044d\u0442\u043e\u043c \u0431\u044b\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0447\u0435\u043b\u0435\u043d\u0434\u0436 \u2014 \u0440\u0430\u043d\u0435\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438. \u041d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442\u044b \u0432 <em>project.yml<\/em> \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0442\u0430\u0440\u0433\u0435\u0442\u0435 \u0432 <code>info<\/code> \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u043b\u0430\u0433:\u00a0<\/p>\n<pre><code class=\"yaml\">NSSupportsLiveActivities: true<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442 \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0433\u043e Live Activity \u0432\u0438\u0434\u0436\u0435\u0442-\u0442\u0430\u0433\u0440\u0435\u0442\u0430:<\/p>\n<pre><code class=\"yaml\">LiveActivity:   type: app-extension   platform: iOS   info:     path: \"${target_name}\/SupportingFiles\/Info.plist\"     properties:       CFBundleDisplayName: ${target_name}       CFBundleShortVersionString: *cfBundleShortVersionString       NSExtension:         NSExtensionPointIdentifier: \"com.apple.widgetkit-extension\"   settings:     base:       TARGETED_DEVICE_FAMILY: \"$(inherited)\"       PRODUCT_BUNDLE_IDENTIFIER: ${bundleId}     configs:       debug:         PROVISIONING_PROFILE_SPECIFIER: \"match Development ${bundleId}\"         CODE_SIGN_IDENTITY: \"\"         DEBUG_INFORMATION_FORMAT: \"\"       release:         PROVISIONING_PROFILE_SPECIFIER: \"match AppStore ${bundleId}\"         CODE_SIGN_IDENTITY: \"\"   dependencies:     - framework: SwiftUI.framework       implicit: true     - framework: WidgetKit.framework       implicit: true<\/code><\/pre>\n<p>\u0418 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0442\u0430\u0440\u0433\u0435\u0442\u0435: <\/p>\n<pre><code class=\"yaml\">dependencies:  \u00a0- target: LiveActivity<\/code><\/pre>\n<p>\u0421 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e <a href=\"https:\/\/developer.apple.com\/documentation\/appstoreconnectapi\/bundle_ids\">bundleId<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a Provision Profile (\u0442\u043e\u0436\u0435  \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0430\u043d\u0434\u043b\u0430).<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0438 \u0437\u0430\u0432\u0435\u0442\u043d\u043e\u0433\u043e:\u00a0<em>make finished successfully ?, <\/em>\u043d\u0430\u0434\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c Live Activity\u00a0\u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437. \u041c\u044b \u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043c\u043e\u043c\u0435\u043d\u0442 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 Content State \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438 \u0442\u0435\u0445, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f. \u0412\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c main \u2014  <strong>\u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f. <\/strong><\/p>\n<pre><code class=\"swift\">@available(iOSApplicationExtension 16.1, *) @main struct Widgets: WidgetBundle {     var body: some Widget {         LiveActivityWidgetView()     } } <\/code><\/pre>\n<p><em>\u00a0\u041f\u043e\u043a\u0430\u0436\u0435\u043c \u0441\u0440\u0430\u0437\u0443, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Live Activity (iOS 16.1):\u00a0<\/em><\/p>\n<pre><code class=\"swift\">public func startWith(_ attributes: Attributes?, state: Attributes.ContentState, pushType: PushType?) { \/\/ 1     guard ActivityAuthorizationInfo().areActivitiesEnabled,     let attributes = attributes,     activity.isNil     else { return }      do {         \/\/ 2         activity = try Activity&lt;Attributes>.request(             attributes: attributes,             contentState: state,             pushType: pushType          )         if let token = activity?.pushToken {             let unwrappedToken = token.map { String(format: \"%02x\", $0) }.joined()             logger.debug(\"? Live Activity token: \\(unwrappedToken)\")             \/\/ 3              props.action.execute(with: .didStartActivityWith(token: unwrappedToken))         } else {             logger.error(\"\u26d4\ufe0f Failed Live Activity\")         }         \/\/ 4         Task {             guard let activity = activity else { return }             for await data in activity.pushTokenUpdates {                 let token = data.map { String(format: \"%02x\", $0) }.joined()                 logger.debug(\"?? Live Activity token updates: \\(token)\")                 props.action.execute(with: .didPushTokenUpdates(token: token))             }         }     } catch {         logger.error(\"\u26d4\ufe0f Failed Live Activity: \\(error.localizedDescription)\")         props.action.execute(with: .didFailStartLiveActivity(error: error))     } } <\/code><\/pre>\n<ol>\n<li>\n<p>\u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c Live Activty\u00a0\u0438 \u043d\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 Activity \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c pushType:<\/p>\n<ul>\n<li>\n<p>.<em>token<\/em> \u2014 \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c Live Activity \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c Push Notifications.<\/p>\n<\/li>\n<li>\n<p><em>nil<\/em> \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u043a\u0435\u043d, \u0442\u043e\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u00a0pushToken,\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0431\u044d\u043a. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0431\u044d\u043a \u043f\u043e\u0439\u043c\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f Live Activity.<\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u043a\u0435\u043d \u0434\u043b\u044f Live Activity \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c \u0438\u043b\u0438 \u0431\u044b\u043b\u043e \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d\u043e. \u041d\u0430\u0434\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434.<\/p>\n<\/li>\n<\/ol>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c Activity \u0438\u0437 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Push Notification (iOS 16.1):\u00a0<\/p>\n<pre><code class=\"swift\">Task { \u00a0\u00a0\u00a0\u00a0await activity.update(using: state) }<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c:\u00a0<\/p>\n<pre><code class=\"swift\">Task {     await activity.end(using: state, dismissalPolicy: .immediate) }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <em>startWith() <\/em>\u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c Live Activity.\u00a0\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u0442\u0435 \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c, \u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u043a\u0435\u0439\u0441\u0430\u043c\u0438 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.\u00a0<\/p>\n<h3>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 Push Notification \u0441 Live Activity\u00a0<\/h3>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0431\u0435\u0437 \u043f\u0443\u0448\u0435\u0439. Live Activity \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a, \u0447\u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Push Notifications \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u0434\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438: <\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0430\u043a Live Activity \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e push \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0435?<\/strong> \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u043a\u0430\u043f\u043e\u0442\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f Apple. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0430\u043c\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u043c\u0443 Payload \u043f\u0443\u0448\u0430 \u0438 id, \u043a \u043a\u0430\u043a\u043e\u043c\u0443 Live Activity \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u0430\u043a-\u0442\u043e \u043b\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0443\u0448\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438?<\/strong> \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 Apple \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u0442\u043b\u043e\u0432\u0438\u0442\u044c \u043f\u0443\u0448 \u0432 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u041c\u044b \u0441 \u0440\u0435\u0431\u044f\u0442\u0430\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u0438 \u043c\u0435\u0442\u043e\u0434:\u00a0<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"swift\">application(_:didReceiveRemoteNotification:fetchCompletionHandler:)<\/code><\/pre>\n<p><strong>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 Live Activity Push Notification \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f.<\/strong><\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0448\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0431\u044d\u043a\u0435\u043d\u0434\u0430?<\/strong> \u041c\u044b \u0441\u0430\u043c\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 Payload \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0444\u043b\u043e\u0443 \u043f\u0443\u0448-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.\u00a0\u0414\u0430\u043b\u044c\u0448\u0435 <a href=\"https:\/\/apps.apple.com\/kz\/app\/push-hero-test-notifications\/id1499227284\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e<\/a>.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u044f\u0441\u043d\u044e, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u043b\u0430 \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0435. \u041c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 APNS c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 Payload \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. <\/p>\n<details class=\"spoiler\">\n<summary>CURL  \u0432 APNs <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">curl -v \\ --header \"apns-topic:{Your App Bundle ID}.push-type.liveactivity\" \\ --header \"apns-push-type:liveactivity\" \\ --header \"authorization: bearer $AUTHENTICATION_TOKEN\" \\ --data \\ '{\"aps\": {    \"timestamp\":1663300480,    \"event\": \"update\",    \"content-state\": {       \"playerOnFirst\": \"Tony Stark\",       \"currentLap\": 2    },    \"alert\": {       \"title\": \"Race Update\",       \"body\": \"Tony Stark is now leading the race!\"    } }}' \\ --http2 \\ https:\/\/${APNS_HOST_NAME}\/3\/device\/$DEVICE_TOKEN2<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>Payload<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"json\">{   \"aps\": {     \"timestamp\": 1669698850,     \"event\": \"update\",     \"content-state\": {       \"rideStatus\": \"on_ride\",       \"time\": 5     }   } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0437\u0430\u0439\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438 Live Activity<\/h3>\n<p>\u0420\u0430\u043d\u0435\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 SwiftUI, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0441\u0442\u0430\u043b\u043e \u0435\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043d\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u0440\u0430\u0441\u043e\u0442\u0443 \u0438 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438\u0437 \u0434\u0438\u0437\u0430\u0439\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<ol>\n<li>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b: \u0446\u0432\u0435\u0442\u0430, \u0448\u0440\u0438\u0444\u0442\u044b, \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 iOS 15, Apple \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b UIKit \u0432 SwiftUI.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041c\u044b \u043f\u043e\u0448\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u043e. \u041a\u0441\u0442\u0430\u0442\u0438, \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c \u0432 open source \u2014 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c. <\/p>\n<ol start=\"2\">\n<li>\n<p>Apple \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u043b\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0438 UIView \u0432 SwiftUI.View \u2014 UIViewRepresentable, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u043d\u0430\u043c \u0436\u0438\u0437\u043d\u044c, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a: <\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p> \u0418\u043b\u0438 \u0442\u0430\u043a: <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0425\u043e\u0442\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0442\u0430\u043a:)<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u044b \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 \u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0447\u0430\u0441\u0442\u0438 \u0444\u0438\u0447, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0430 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 SwiftUI. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0434\u044b \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c.<\/p>\n<h2>\u0426\u0432\u0435\u0442\u0430 \u043c\u0430\u0448\u0438\u043d<\/h2>\n<p>\u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043c\u044b \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0434\u0435\u0442 \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u042d\u0442\u043e \u0438\u043a\u043e\u043d\u043a\u0430 \u0437\u0430\u0448\u0438\u0442\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u2014 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0435 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c. \u0414\u043b\u044f LiveActivity \u044f \u0432\u0437\u044f\u043b \u0438\u043a\u043e\u043d\u043a\u0443 \u0438\u0437 Figma, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0438 \u0437\u0430\u0431\u044b\u043b. <\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u0448\u0435\u043b \u043c\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0438 \u0441\u043a\u0430\u0437\u0430\u043b: \u00ab\u0410 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043c \u043d\u0435 \u043a\u0440\u0430\u0441\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u043a\u0438 \u0432 \u0442\u043e\u0442 \u0446\u0432\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441 \u0431\u044d\u043a\u0435\u043d\u0434\u0430?\u00bb. \u041c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u0447\u0442\u043e \u0446\u0432\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0432\u0438\u0434\u0435 \u0442\u0435\u043a\u0441\u0442\u0430: Gold, Blue \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0431\u044d\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0449\u0435 hex, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u0438 \u043a\u0440\u0430\u0441\u0438\u0442\u044c. <\/p>\n<p>\u0422\u0443\u0442 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0445\u0438\u0442\u0440\u0438\u0442\u044c. \u041c\u044b \u0440\u0430\u0437\u0431\u0438\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0435\u0432: \u043a\u0443\u0437\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u043c \u043a\u0440\u0430\u0441\u0438\u0442\u044c, \u0438 \u0431\u0430\u0437\u0443 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u00a0\u0422\u0430\u043a\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-408988","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/408988","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=408988"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/408988\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=408988"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=408988"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=408988"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}