{"id":194404,"date":"2013-09-19T17:51:09","date_gmt":"2013-09-19T13:51:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=194404"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=194404","title":{"rendered":"<span class=\"post_title\">\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 IM \u043d\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u041f\u0430\u0432\u043b\u0430 \u0414\u0443\u0440\u043e\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Xamarin<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/d93\/884\/903\/d93884903fc7e7df883069ba46dfe283.png\" alt=\"image\" align=\"right\"\/><br \/>  \u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c.<\/p>\n<p>  \u041a\u0430\u043a \u043c\u043d\u043e\u0433\u0438\u0435 \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u044e\u0442, \u041f\u0430\u0432\u0435\u043b \u0414\u0443\u0440\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u043e\u043d What&#8217;s App \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 MTProto. <\/p>\n<p>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u0448\u043a\u0430 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 iOS \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c Telegram. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u2014 <a href=\"http:\/\/vk.com\/androidchallenge\">\u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 Android \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/a>. <br \/>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f, \u043d\u0430\u0440\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0435\u043b\u043a\u0438 \u0438 \u044f \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435. \u0421\u043a\u0430\u0436\u0443 \u0441\u0440\u0430\u0437\u0443, \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u044f \u043d\u0435 \u043f\u0440\u043e\u0448\u0435\u043b.<\/p>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432, \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u044f\u0437\u044b\u043a\u043e\u043c C# \u0438 Xamarin \u043e \u0447\u0435\u043c \u0438 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0438\u0436\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e Xamarin \u0432 \u0440\u0443\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u044f\u043c\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u0417\u0430\u043c\u0435\u0441\u0442\u043e \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f<\/h4>\n<p>  \u042f \u0434\u043e\u0442\u043d\u0435\u0442\u0447\u0438\u043a. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 \u0434\u043e\u0442\u043d\u0435\u0442\u043e\u043c \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0435\u0449\u0435 \u0431\u044b\u043b \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u043c, \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043c\u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0437\u0430\u043f\u0440\u043e\u0441 \u00abAndroid C#\u00bb \u0438 \u0432\u044b\u0432\u0435\u043b \u043c\u0435\u043d\u044f \u043d\u0430 Xamarin \u2014 MonoDroid. \u041d\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u044f \u043f\u0438\u0441\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0433\u0440\u0430\u043b\u0441\u044f \u0441 \u043d\u0438\u043c, \u044d\u0442\u043e \u0431\u044b\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 Android, \u043e \u043d\u0435\u043c \u044f \u0438 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c. \u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u0435 C#, .NET \u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 Android.<\/p>\n<h5>\u0427\u0442\u043e \u044d\u0442\u043e \u2014 \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445<\/h5>\n<p>  Xamarin \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f (\u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430) \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u041d\u044d\u0442\u043e\u043c \u0424\u0440\u0438\u0434\u043c\u0435\u043d\u043e\u043c \u0438 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%BA%D0%B0%D1%81%D0%B0,_%D0%9C%D0%B8%D0%B3%D0%B5%D0%BB%D1%8C_%D0%B4%D0%B5\">\u041c\u0438\u0433\u0435\u043b\u0435\u043c \u0434\u0435 \u0418\u043a\u0430\u0441\u0430<\/a> \u2014 \u0430\u0432\u0442\u043e\u0440\u043e\u043c GNOME \u0438 Mono. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c Xamarin \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c Mono. <br \/>  <b>Xamarin \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f Anroid \u0438 iOS \u043d\u0430 C#<\/b> \u0438 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e. \u042f \u043b\u0438\u0447\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0437\u0430 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u0439 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u0431\u0443\u0434\u0443\u0449\u0435\u0435. \u0410 \u0435\u0449\u0435 Mac. \u0410 \u0435\u0449\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e <a href=\"http:\/\/xamarin.uservoice.com\/forums\/144858-xamarin-suggestions\/suggestions\/2617326-monoblackberry\">\u0433\u043e\u043b\u043e\u0441\u0443\u044e\u0442 \u0437\u0430 MonoBerry<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0432\u043e\u0439\u0434\u0435\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 Xamarin.<\/p>\n<h4>\u0417\u0430\u0434\u0430\u0447\u0430<\/h4>\n<p>  \u0412 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430 \u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 MTProto (\u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f) \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f). \u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430.<\/p>\n<p>  \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e RPC \u0441\u043e \u0432\u0441\u044f\u043a\u0438\u043c\u0438 \u043f\u043b\u044e\u0448\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u0441\u044f\u043a\u043e\u0435 \u0440\u0430\u0437\u043d\u043e\u0435.<\/p>\n<h4>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u044f \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u044f \u0440\u0435\u0448\u0430\u043b \u044d\u0442\u0438 \u0437\u0430\u0434\u0430\u0447\u0438. \u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c.<\/p>\n<h5>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 Xamarin<\/h5>\n<p>  Xamarin \u0441\u0442\u043e\u0438\u0442 2000$. \u0414\u0430, \u044d\u0442\u043e \u0442\u0430\u043a. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 \u0441\u0442\u0443\u0434\u0438\u0438 \u0435\u0433\u043e \u0446\u0435\u043d\u0430 \u2014 999$ \u0437\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u0441\u0440\u0435\u0434\u044b MonoDevelop \u2014 \u0435\u0435 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 299$ \u0437\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443. \u0412 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0435 \u0441 \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438 \u044f \u0441\u043c\u043e\u0433 \u0432\u044b\u043a\u043b\u044f\u043d\u0447\u0438\u0442\u044c \u0441\u043a\u0438\u0434\u043a\u0443 \u0434\u043e 799$ \u0437\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443.<br \/>  \u041a\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c xamarin? \u041d\u0443 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e <s>\u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441 \u0442\u043e\u0440\u0440\u0435\u043d\u0442\u043e\u0432<\/s>. Xamarin \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e \u0437\u0430 99$ \u0437\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Business \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043e \u043f\u043e\u0447\u0442\u0435. \u0418 \u0434\u0430, \u0435\u0441\u043b\u0438 \u0442\u0432\u043e\u044f \u0436\u0435\u043d\u0430 \u0430\u0441\u043f\u0438\u0440\u0430\u043d\u0442 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<h5>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h5>\n<p>  \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b Xamarin \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u041e\u0421. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u041e\u0421 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u043e\u044f \u0441\u0431\u043e\u0440\u043a\u0430, \u043d\u043e \u043a\u043e\u0434 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d. \u0421\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 Xamarin \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0446\u0435\u043b\u044b\u0445 <a href=\"http:\/\/docs.xamarin.com\/guides\/cross-platform\/application_fundamentals\/building_cross_platform_applications\/sharing_code_options\">\u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430<\/a> \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u043e \u0434\u043b\u044f Visual Studio \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u2014 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 Project Linker, \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0432 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0441\u0440\u0435\u0434\u0443.<br \/>  \u041f\u0430\u0440\u0430 \u043a\u043b\u0438\u043a\u043e\u0432 \u043c\u044b\u0448\u043a\u0438 \u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage3\/257\/a2a\/6c6\/257a2a6c698d7c9ebb6dd6bcb69da47d.png\"\/><\/p>\n<p>  \u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a\u0430\u043a \u0441\u0441\u044b\u043b\u043a\u0438, \u043b\u044e\u0431\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044b \u0432\u043e \u0432\u0441\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b. <\/p>\n<table>\n<tr>\n<td><img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage3\/1b3\/9eb\/b84\/1b39ebb84af4de67dd0d6ab628b425ce.png\"\/><\/td>\n<td><img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage3\/507\/11d\/9e7\/50711d9e743c94f617f868161c9054f5.png\"\/><\/td>\n<\/tr>\n<\/table>\n<p>  \u0423\u0442\u0438\u043b\u0438\u0442\u043a\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0438\u0437 \u00ab\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439\u00bb \u0441\u0442\u0443\u0434\u0438\u0438.<\/p>\n<h6>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h6>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u044d\u0442\u043e <i>MTProto.Core<\/i> \u0438 <i>Talks.Backend<\/i>. \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u0434 .net 4.5 \u0438 \u043f\u043e\u043a\u0440\u044b\u0442\u044b\u0435 Unit-\u0442\u0435\u0441\u0442\u0430\u043c\u0438.<br \/>  <i>Mono.Stub<\/i> \u2014 \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u0437 Mono, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043e\u0442\u0442\u0443\u0434\u0430 BigInteger.<br \/>  \u041f\u0430\u043f\u043a\u0430 <b>Droid<\/b> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0430\u043d\u0434\u0440\u043e\u0439\u0434\u043e\u0432\u0441\u043a\u0438\u0435 \u043a\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, Dataflow \u2014 \u044d\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 TPL.Dataflow \u0441 \u0433\u0438\u0442\u0445\u0430\u0431\u0430. \u042f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 C# 5.0.<br \/>  \u0412 \u043f\u0430\u043f\u043a\u0435 Platfrom \u2014 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443. \u041f\u043e\u043a\u0430 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e Android.<\/p>\n<h5>MTProto.Core<\/h5>\n<p>  \u042d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f RPC \u0441 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0442\u0438\u043f\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u0443\u0441\u043e\u0447\u043a\u0430\u043c\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 IM \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c RPC \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/p>\n<p>  \u0418\u0437 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439: async all the way \u0438 Dataflow.<\/p>\n<h6><b>async all the way<\/b><\/h6>\n<p>  C# 5.0 \u0432\u0432\u0435\u043b \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 Task Asynchronous Pattern (TAP). \u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043d\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/vstudio\/hh191443.aspx\">MSDN<\/a>.<br \/>  \u0412\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 IO \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438, \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u0437\u0430\u043f\u043e\u0432\u0435\u0434\u044c.<\/p>\n<pre><code class=\"cs\">public async Task RunAsync() { \tawait _cl.LoadSettings().ConfigureAwait(false); \tif (await _cl.CheckAndGenerateAuth().ConfigureAwait(false)) \t{ \t\tawait _cl.RunAsync().ConfigureAwait(false); \t}  \tif ((_cl.Settings.DataCenters == null) || (_cl.Settings.DataCenters.Count == 0)) \t{ \t\tawait _cl.GetConfig().ConfigureAwait(false); \t} \t\t\t \t_db = await TalksDatabase.GetDatabase().ConfigureAwait(false);  \t_ldm = new LocalDataManager(_db); \t_cl.ProcessUpdateAsync = ProcessUpdateAsync; } <\/code><\/pre>\n<p>  \u0421\u0442\u0438\u0432\u0435\u043d \u041a\u043b\u0438\u0440\u0438 \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0435\u0434\u0443\u0449\u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u043f\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043d\u0430 C# \u2014 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <a href=\"http:\/\/msdn.microsoft.com\/ru-ru\/magazine\/jj991977.aspx\">\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f async-await<\/a> \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0441\u0442\u0430\u043b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0435 \u043d\u0435 \u0447\u0438\u0442\u0430\u043b\u0438, \u0441\u043e\u0432\u0435\u0442\u0443\u044e.<\/p>\n<p>  \u0421\u0443\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u00abasync all the way\u00bb \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 event \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 IO (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435).<\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435:<\/p>\n<pre><code class=\"cs\">async void button_Click(object sender, EventArgs e) {      _button.Enabled = false;      await _presenter.SendMessage(); } <\/code><\/pre>\n<p>  \u0422\u043e \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432 Presenter:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public Task&lt;bool&gt; SendMessage() {                 return SendMessageToUser(); } <\/code><\/pre>\n<pre><code class=\"cs\">public async Task&lt;bool&gt; SendMessageToUser() {    ...     try     {         _imv.AddMineMessage(msg);         string msgText = _imv.PendingMessage;         _imv.PendingMessage = &quot;&quot;;          \/\/ messages.sendMessage#4cde0aab peer:InputPeer message:string random_id:long = messages.SentMessage;         var result = await _model.PerformRpcCall(&quot;messages.sendMessage&quot;,             InputPeerFactory.CreatePeer(_model, PeerType.inputPeerContact, _imv.ChatId),             msgText,             LongRandom(r));          if (result.Success)         {             \/\/ messages.sentMessage#d1f4d35c id:int date:int pts:int seq:int = messages.SentMessage;             msg.Id = result.Answer.ExtractValue&lt;int&gt;(&quot;id&quot;);             ...             msg.State = BL.Messages.MessageState.Sent;              _imv.IvalidateList();                                     await _model.ProcessSentMessage(result.Answer, _imv.ChatId, msg);             return true;         }         else         {             msg.State = BL.Messages.MessageState.Failed;             _imv.SendSmallMessage(&quot;Problem sending message: &quot; + result.Error.ToString());             return false;         }     }     catch (Exception ex)     {          ...     } } <\/code><\/pre>\n<p>  \u0418 \u0432 Core:<\/p>\n<pre><code class=\"cs\">public Task&lt;RpcAnswer&gt; PerformRpcCall(string combinatorName, params object[] pars) { \treturn _cl.PerformRpcCall(combinatorName, pars); } <\/code><\/pre>\n<pre><code class=\"cs\">public async Task&lt;RpcAnswer&gt; PerformRpcCall(string combinatorName, params object[] pars) { \ttry \t{                 \/*...*\/ \t\tvar confirm = CreateConfirm();  \t\t\/\/ \u0411\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \t\tWriteOnceBlock&lt;RpcAnswer&gt; answer = new WriteOnceBlock&lt;RpcAnswer&gt;(e =&gt; e);  \t\tIOutputCombinator oc; \t\tif (confirm != null) \t\t{ \t\t\tvar cntrn = new MsgContainer(); \t\t\tcntrn.Add(rpccall);  \t\t\t\/\/ \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u043c \u043a RPC Call \u0432\u0441\u0435 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \t\t\tcntrn.Add(confirm); \t\t\tcntrn.Combinator = _tlc.Decompose(0x73f1f8dc);  \t\t\t\/\/ \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043e\u0431\u0449\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c  \t\t\toc = new OutputMsgContainer(uniqueId, cntrn); \t\t} \t\telse \/\/ \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \t\t{ \t\t\toc = new OutputTLCombinatorInstance(uniqueId, rpccall); \t\t}  \t\tvar uhoo = await SendRpcCallAsync(oc).ConfigureAwait(false);  \t\t_inputAnswersBuffer.LinkTo(answer, new DataflowLinkOptions { MaxMessages = 1 }, \t\t\ti =&gt; i.SessionId == _em.SessionId);  \t\treturn await answer.ReceiveAsync(TimeSpan.FromSeconds(60)).ConfigureAwait(false); \/\/ \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u0442\u0443 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e\t\t\t\t \t} \tcatch (Exception ex) \t{                 ... \t} } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 async-await. \u041e\u0431\u0449\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0442\u0430\u043a\u043e\u0432\u0430: \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c <b>\u043f\u043e\u0441\u043b\u0435<\/b> \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 <b>\u043e\u0434\u0438\u043d<\/b> \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a Task \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430. <br \/>  \u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 (\u0442\u0430\u043a \u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u041a\u043b\u0438\u0440\u0438) \u2014 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0422.\u0435. \u0432\u0441\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c <code>.ConfigureAwait(false)<\/code> \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u044d\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c deadlock&#8217;\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b\u0448\u0435.<\/p>\n<h6><b>Dataflow<\/b><\/h6>\n<p>  TPL.Dataflow \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Data Flow \u0438\u043b\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/playscript\/playscript-mono\/blob\/master\/mcs\/class\/System.Threading.Tasks.Dataflow\/System.Threading.Tasks.Dataflow\/ObserverDataflowBlock.cs\">\u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a> \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0438 \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445. \u0416\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e \u0432 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/hh228603.aspx\">MSDN<\/a>.<\/p>\n<p>  \u0412 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0431\u043b\u043e\u043a\u043e\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0432\u044f\u0437\u0430\u0432 \u0438\u0445 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u043b\u0438\u0431\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 \u043c\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u0432\u0435 \u0448\u0442\u0443\u043a\u0438: \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u041f\u043e\u0441\u043b\u0435 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>  \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/aed\/b79\/e30\/aedb79e30cbb1c336adf095678a91889.png\" alt=\"image\"\/><br \/>  \u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cs\">BufferBlock&lt;byte[]&gt; _inputBufferBytes = new BufferBlock&lt;byte[]&gt;(); BufferBlock&lt;InputTLCombinatorInstance&gt; _inputBuffer = new BufferBlock&lt;InputTLCombinatorInstance&gt;(); ActionBlock&lt;byte[]&gt; _inputBufferParcer;  ActionBlock&lt;TLCombinatorInstance&gt; _inputUpdates; ActionBlock&lt;TLCombinatorInstance&gt; _inputSystemMessages;  TransformBlock&lt;InputTLCombinatorInstance, RpcAnswer&gt; _inputAnswers;  BufferBlock&lt;RpcAnswer&gt; _inputAnswersBuffer = new BufferBlock&lt;RpcAnswer&gt;(); BufferBlock&lt;RpcAnswer&gt; _inputRejectedBuffer = new BufferBlock&lt;RpcAnswer&gt;(); BufferBlock&lt;InputTLCombinatorInstance&gt; _inputUnsorted = new BufferBlock&lt;InputTLCombinatorInstance&gt;();  \/\/ -- \/\/ \u0432\u044b\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0435\u0442\u043a\u0430 _inputBufferParcer = new ActionBlock&lt;byte[]&gt;(bytes =&gt; ProcessInputBuffer(bytes));  _inputSystemMessages = new ActionBlock&lt;TLCombinatorInstance&gt;(tlci =&gt; ProcessSystemMessage(tlci)); _inputUpdates = new ActionBlock&lt;TLCombinatorInstance&gt;(tlci =&gt; ProcessUpdateAsync(tlci)); _inputAnswers = new TransformBlock&lt;InputTLCombinatorInstance, RpcAnswer&gt;(tlci =&gt; ProcessRpcAnswer(tlci));  \/\/ from [_inputBufferBytes] to [_inputBufferTransformer] _inputBufferBytes.LinkTo(_inputBufferParcer); \/\/ from [_inputBufferTransformer] to [_inputBuffer] \/\/_inputBufferTransformer.LinkTo(_inputBuffer);  \/\/ if System then from [_inputBuffer] to [_inputSystemMessages] _inputBuffer.LinkTo(_inputSystemMessages, tlciw =&gt; _systemCalls.Contains(tlciw.Combinator.Name)); \/\/ if Updates then from [_inputBuffer] to [_inputUpdates] _inputBuffer.LinkTo(_inputUpdates, tlciw =&gt; tlciw.Combinator.ValueType.Equals(&quot;Updates&quot;)); \/\/ if rpc_result then from [_inputBuffer] to [_inputRpcAnswers] _inputBuffer.LinkTo(_inputAnswers, tlciw =&gt; tlciw.Combinator.Name.Equals(&quot;rpc_result&quot;)); \/\/ if rpc_result then from [_inputBuffer] to [_inputRpcAnswers] \/\/_inputBuffer.LinkTo(_inputUnsorted);  \/\/ and store it  [_inputAnswers] to [_inputAnswersBuffer] to process it _inputAnswers.LinkTo(_inputAnswersBuffer); _inputRejectedBuffer.LinkTo(_inputAnswersBuffer); <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0431\u0443\u0444\u0435\u0440\u0430\u043c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 updates \u0438 systemMessages \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0443 \u0432 <code>ActionBlock<\/code>, \u0430 rpcAnswers \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>TransformBlock<\/code> \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>BufferBlock<\/code>. \u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 <code>BufferBlock<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432.<\/p>\n<p>  \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c WriteOnceBlock \u2014 \u0431\u043b\u043e\u043a \u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cs\">WriteOnceBlock&lt;RpcAnswer&gt; answer = new WriteOnceBlock&lt;RpcAnswer&gt;(e =&gt; e); <\/code><\/pre>\n<p>  \u0418 \u043b\u0438\u043d\u043a\u0443\u0435\u043c \u0435\u0433\u043e \u043a \u0431\u0443\u0444\u0435\u0440\u0443 RPC \u043e\u0442\u0432\u0435\u0442\u043e\u0432:<\/p>\n<pre><code class=\"cs\">_inputAnswersBuffer.LinkTo(answer, new DataflowLinkOptions { MaxMessages = 1 }, \t\t\ti =&gt; i.SessionId == _em.SessionId); <\/code><\/pre>\n<p>  \u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0436\u0434\u0435\u043c \u043f\u043e\u043a\u0430 \u043f\u0440\u0438\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0442:<\/p>\n<pre><code class=\"cs\">return await answer.ReceiveAsync(TimeSpan.FromSeconds(60)).ConfigureAwait(false); \/\/ \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u0442\u0443 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e <\/code><\/pre>\n<p>  \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u044f \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430 \u043f\u043e\u0434 Android. \u0412\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u0434 .net 4.5<\/p>\n<h5>Talks.Backend<\/h5>\n<p>  \u0411\u044d\u043a\u044d\u043d\u0434 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u042f \u0440\u0435\u0448\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f MVP \u0441 IoC, \u043f\u0440\u0438\u0447\u0435\u043c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u043d\u0430\u0446\u0435\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u043d\u0430 Passive View \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0447\u0442\u043e Supervising Controller \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0431\u044b \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p>  \u041a\u0430\u043a\u0438\u0435 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0431\u044d\u043a\u044d\u043d\u0434\u0430? \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0437\u0430\u043f\u0438\u0441\u043d\u043e\u0439 \u043a\u043d\u0438\u0436\u043a\u0435, \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0442\u043e\u0447\u0435\u043a). \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0431\u044d\u043a\u044d\u043d\u0434\u0430 \u044d\u0442\u043e \u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f MVP: \u043d\u0430\u0431\u043e\u0440 Presenter&#8217;\u043e\u0432 \u0438 IView&#8217;\u0448\u0435\u043a<\/p>\n<h6><b>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0437\u0430\u043f\u0438\u0441\u043d\u043e\u0439 \u043a\u043d\u0438\u0436\u043a\u0435<\/b><\/h6>\n<p>  \u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0437\u0430\u043f\u0438\u0441\u043d\u043e\u0439 \u043a\u043d\u0438\u0436\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Xamarin \u0432\u0441\u0435 \u0443\u0436\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0430 \u0437\u0430 \u043d\u0430\u0441. \u041e\u043d\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Xamarin.Mobile \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u2014 \u0437\u0430\u043f\u0438\u0441\u043d\u0430\u044f \u043a\u043d\u0438\u0436\u043a\u0430, GPS, \u043a\u0430\u043c\u0435\u0440\u0430, \u0432 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u043d\u0435\u0440\u0435. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 async-await.<\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0437\u0430\u043f\u0438\u0441\u043d\u043e\u0439 \u043a\u043d\u0438\u0436\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cs\">#if __ANDROID__ public async Task GetAddressbook(Android.Content.Context context) { \tcontacts = new AddressBook(context); #else public async Task GetAddressbook() { \tcontacts = new AddressBook(); #endif \tif (!await contacts.RequestPermission()) \t{ \t\tTrace.WriteLineIf(clientSwitch.TraceInfo, &quot;Permission for contacts denied&quot;, &quot;[ContactsPresenter.PopulateAddressbook]&quot;); \t\t_view.SendSmallMessage(&quot;CONTACTS PERMISSON DENIED&quot;); \t\treturn; \t} \telse \t{ \t\t_icv.PlainContacts = new ListItemCollection&lt;ListItemValue&gt;( (from c in contacts \t\t\t\t\t\t\t\twhere (c.Phones.Count() &gt; 0) \t\t\t\t\t\t\t\tselect new ListItemValue(c)).ToList()); \t} } <\/code><\/pre>\n<p>  \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 <code>__ANDROID__<\/code> \u0432\u0432\u0435\u0434\u0435\u043d\u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u043d\u0430 Android \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u041e\u0421 \u2014 \u043d\u0435\u0442.<\/p>\n<p>  \u0422\u0443\u0442 \u0432\u0438\u0434\u0435\u043d \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 Passive View \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044e \u043d\u0430\u043c \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0431\u0443\u043a\u0432\u0435 \u0444\u0430\u043c\u0438\u043b\u0438\u0438. \u0414\u043b\u044f Android \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 ListItemCollection, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443, \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435. \u041d\u0430 iOS \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0442\u0430\u043a\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438, \u0447\u0442\u043e \u043d\u0430 WinPhone \u2014 \u044f \u043d\u0435 \u0437\u043d\u0430\u044e. \u0422\u0430\u043a \u0447\u0442\u043e \u0442\u0443\u0442 \u0443\u043c\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e View. <\/p>\n<p>  \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u0439 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434. \u041d\u0430\u0434\u043e \u0447\u0435\u0442\u043a\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0433\u0434\u0435 \u0442\u0435\u0431\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0430 \u0433\u0434\u0435 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u0414\u0443\u043c\u0430\u044e, \u044d\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c.<\/p>\n<h6><b>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/h6>\n<p>  \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 Xamarin \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u0443\u044e ORM SQLite.Net. \u041a\u043e\u0433\u0434\u0430-\u0442\u043e \u044f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0447\u0435\u0440\u0435\u0437 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043d\u044f\u043b \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u044b \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<p>  \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 SQLite.Net \u044f \u043d\u0435 \u0432\u0438\u0436\u0443 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430, \u0441\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c SQlite.Net \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 sqlite, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435 <a href=\"http:\/\/www.sqlite.org\/download.html\">www.sqlite.org\/download.html<\/a><\/p>\n<p>  \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043c\u0435\u0447\u0443 \u0447\u0442\u043e SQLite.Net \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 TAP \u0438 async-await.<br \/>  \u041a\u043b\u0430\u0441\u0441 SQLite.SQLiteAsyncConnection \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440\u043e\u043c Generic \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0411\u0414:<\/p>\n<pre><code class=\"cs\">#region Public Methods public Task&lt;List&lt;T&gt;&gt; GetItemsAsync&lt;T&gt;() where T : IBusinessEntity, new() {     return Table&lt;T&gt;().ToListAsync(); }  public Task&lt;T&gt; GetItemAsync&lt;T&gt;(int id) where T : IBusinessEntity, new() {     return GetAsync&lt;T&gt;(id); }  public async Task&lt;bool&gt; CheckRowExistAsync&lt;T&gt;(int id) where T : IBusinessEntity, new() {     string tblName = typeof(T).Name;     return await ExecuteScalarAsync&lt;int&gt;(&quot;select 1 from &quot; + tblName + &quot; where Id = ?&quot;, id).ConfigureAwait(false) == 1; }  public async Task&lt;int&gt; SaveItemAsync&lt;T&gt;(T item) where T : IBusinessEntity, new() {     if (await CheckRowExistAsync&lt;T&gt;(item.Id))     {         return await base.UpdateAsync(item).ConfigureAwait(false);     }     else     {         return await base.InsertAsync(item).ConfigureAwait(false);     } }  public Task&lt;int&gt; DeleteItemAsync&lt;T&gt;(int id) where T : IBusinessEntity, new() {     return DeleteAsync(new T() { Id = id }); } #endregion <\/code><\/pre>\n<p>  \u0422\u0430\u043a \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u041e\u0421 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u044c \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cs\">public static string DatabaseFilePath {     get     {         var sqliteFilename = &quot;TalksDb.db3&quot;; #if SILVERLIGHT \/\/ Windows Phone expects a local path, not absolute var path = sqliteFilename; #else #if __ANDROID__ \/\/ Just use whatever directory SpecialFolder.Personal returns string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);  #else         \/\/ we need to put in \/Library\/ on iOS5.1 to meet Apple's iCloud terms         \/\/ (they don't want non-user-generated data in Documents)                string documentsPath= Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); \/\/ Documents folder          string libraryPath = Path.Combine(documentsPath, &quot;..&quot;, &quot;Library&quot;); \/\/ Library folder #endif         var path = Path.Combine(libraryPath, sqliteFilename); #endif         return path;     } } <\/code><\/pre>\n<h6><b>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435<\/b><\/h6>\n<p>  \u041e\u0434\u043d\u0430 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043d\u043e\u044e \u0431\u044b\u043b \u0432\u0437\u044f\u0442 \u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043a\u044d\u0448\u0430 <a href=\"http:\/\/blog.neteril.org\/blog\/2012\/12\/17\/memory-efficient-bitmap-caching-with-mono-for-android\/\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>. \u0412\u043e\u043e\u0431\u0449\u0435, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0430\u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043d\u0430 \u0432\u0441\u0435\u0445 \u041e\u0421 \u0440\u0430\u0437\u043d\u044b\u0435. \u0427\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u043e\u043a\u0430\u0445 Xamarin<\/p>\n<h5>Talks.Droid<\/h5>\n<p>  \u0410\u043d\u0434\u0440\u043e\u0439\u0434 \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0443 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u044d\u043a\u044d\u043d\u0434. \u0412 \u043c\u043e\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0442\u0430\u043a \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043d\u043e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u044f \u0431\u0443\u0434\u0443 \u043a \u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f.<br \/>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c. <\/p>\n<p>  \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043b\u0435\u0436\u0438\u0442 Bound Service \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 App \u2014 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u00ab\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u00bb. \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u044d\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043b\u044e\u0431\u043e\u0435 Activity \u043c\u043e\u0433\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>App.Current.MainService<\/code>.<\/p>\n<p>  \u0412\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f Model, \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e Activity \u0437\u0430\u0431\u0438\u0440\u0430\u044e\u0442 \u0441\u0432\u043e\u0438 Presenter&#8217;\u044b, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">_presenter = App.Current.MainService.CreatePresenter&lt;ChatListPresenter&gt;(typeof(ChatListPresenter), this); <\/code><\/pre>\n<p>  C\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0447\u0442\u043e Xamarin \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 AndroidManifest \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043d\u0435 \u0434\u0430\u0435\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e. \u0412\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Activity \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432:<\/p>\n<pre><code class=\"cs\">    [Activity(Label = &quot;Settings&quot;, Theme = &quot;@style\/Theme.TalksTheme&quot;)]     [MetaData(&quot;android.support.PARENT_ACTIVITY&quot;, Value = &quot;talks.ChatListActivity&quot;)]     public class SettingsActivity : SherlockActivity, IView <\/code><\/pre>\n<p>  \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043e\u0434 Activity \u043c\u0430\u043b\u043e \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 java \u0432\u0430\u0440\u0438\u043d\u0442\u0430, CamelCase, \u0434\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u0435\u0442\u0442\u0435\u0440\u044b\/\u0441\u0435\u0442\u0442\u0435\u0440\u044b \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044b \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<pre><code class=\"cs\">        protected override void OnCreate(Bundle bundle)         {             base.OnCreate(bundle);              \/\/ Set our view from the &quot;main&quot; layout resource             SetContentView(Resource.Layout.MessagesScreen);              AndroidUtils.SetRobotoFont(this, (ViewGroup)Window.DecorView);              _presenter = App.Current.MainService.CreatePresenter&lt;MessagePresenter&gt;(typeof(MessagePresenter), this);             _presenter.PlatformSpecificImageResize = AndroidResizeImage;               this.ChatId = Intent.GetIntExtra(&quot;userid&quot;, 0);             userName = Intent.GetStringExtra(&quot;username&quot;);              _button = FindViewById&lt;ImageButton&gt;(Resource.Id.bSendMessage);             _button.Click += button_Click;             _button.Enabled = false;              _message = FindViewById&lt;EditText&gt;(Resource.Id.etMessageToSend);             _message.TextChanged += message_TextChanged;                          _lv = FindViewById&lt;ListView&gt;(Resource.Id.lvMessages);             _lv.Adapter = new Adapters.MessagesScreenAdapter(this, this.Messages);         } <\/code><\/pre>\n<h6><b>Login Activity<\/b><\/h6>\n<p>  Login Activity \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c 3 \u043f\u0443\u043d\u043a\u0442\u0430 \u2014 \u0432\u0432\u043e\u0434 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0438 \u0435\u0433\u043e \u0432\u0432\u043e\u0434, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/175\/4e2\/286\/1754e2286d6f83b62f840b0d82642294.png\" alt=\"image\"\/><\/p>\n<p>  \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e, <b>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 MVP \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e<\/b>! <\/p>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0434\u0438\u043d presenter, \u0430 LoginActivity \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 IView \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"cs\">PhoneFragment _pf = null; CodeFragment _cf = null; SignUpFragment _suf = null;  public string PhoneNumber         {             get              {                 if (_pf != null)                 {                     return _pf.Phone;                 }                 else                 {                     return &quot;&quot;;                 }             }         }          public string AuthCode         {             get { return _cf.Code; }         }          public string Name         {             get { return _suf.FirstName; }         }          public string Surname         {             get { return _suf.Surname; }         } <\/code><\/pre>\n<h6><b>\u0421\u044a\u0435\u043c\u043a\u0430 \u0444\u043e\u0442\u043e\/\u0432\u0438\u0434\u0435\u043e<\/b><\/h6>\n<p>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0438 \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0444\u043e\u0442\u043e\/\u0432\u0438\u0434\u0435\u043e \u0441 \u043a\u0430\u043c\u0435\u0440\u044b \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0435\u0433\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0443 \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0432\u0430\u0442\u0430\u0440\u043a\u0438.<\/p>\n<p>  \u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Xamarin.Mobile.<\/p>\n<pre><code class=\"cs\">  public override bool OnMenuItemSelected(int featureId, Xamarin.ActionbarSherlockBinding.Views.IMenuItem item)         {             switch (item.ItemId)             {                 \/\/ Respond to the action bar's Up\/Home button                 case Android.Resource.Id.Home:                     NavUtils.NavigateUpFromSameTask(this);                     return true;                  case Resource.Id.messages_action_takephoto:                     _presenter.TakePhoto(this);                     return true;                  case Resource.Id.messages_action_gallery:                     _presenter.PickPhoto(this);                     return true;                  case Resource.Id.messages_action_video:                     _presenter.TakeVideo(this);                     return true;             }             return base.OnMenuItemSelected(featureId, item);         } <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e event \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u0443\u043d\u043a\u0442\u0430 \u043c\u0435\u043d\u044e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 bool, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e async-await. \u0420\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0447\u0442\u043e async-await \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 Continuation. \u0418 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435:<\/p>\n<pre><code class=\"cs\">#if __ANDROID__         \/\/\/ &lt;summary&gt;         \/\/\/ \u0412\u0437\u044f\u0442\u0438\u0435 \u0444\u043e\u0442\u043e \u0441 \u043a\u0430\u043c\u0435\u0440\u044b         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;context&quot;&gt;&lt;\/param&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public bool TakePhoto(Android.Content.Context context)         {             var picker = new MediaPicker(context);          #else         public bool TakePhoto()         {             var picker = new MediaPicker(); #endif             if (picker.IsCameraAvailable)             {                 picker.TakePhotoAsync(new StoreCameraMediaOptions                 {                     Name = String.Format(&quot;{0:dd_MM_yyyy_HH_mm}.jpg&quot;, DateTime.Now),                     Directory = &quot;TalksPictures&quot;                 })                 .ContinueWith((prevTask) =&gt;                 {                     if (prevTask.IsCanceled)                     {                         _imv.SendSmallMessage(&quot;User canceled&quot;);                         return;                     }                     if (PlatformSpecificImageResize != null)                     {                         string path = PlatformSpecificImageResize(prevTask.Result);                                              \/\/ \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435                         DomainModel.Message msg = new DomainModel.Message(r.Next(Int32.MaxValue), 0, _imv.ChatId, _imv.PendingMessage, &quot;&quot;, 0);                                                     _imv.AddMineMessage(msg);                     }                 })                 .ContinueWith((prevTask) =&gt;                 {                     if (!prevTask.IsCanceled)                     {                         Console.WriteLine(&quot;User ok&quot;);                     }                 }, TaskScheduler.FromCurrentSynchronizationContext());                                                           return true;                            }             return false;         }  <\/code><\/pre>\n<p>  Xamarin \u043f\u043e\u043c\u0438\u043c\u043e \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 Component Store, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u043e\u0440\u0442\u044b \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 Android \u0438\/\u0438\u043b\u0438 iOS \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u043a \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0442\u0430\u043a \u0438 \u043f\u043b\u0430\u0442\u043d\u044b\u0435. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043c \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 ActionBar.Scherlok \u0438 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Android.Support.v7, \u043f\u0440\u0438\u0447\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0441\u0440\u0435\u0434\u044b, \u043a\u0430\u043a \u0432 NuGet, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e <\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/38b\/43a\/d55\/38b43ad554ae7032ddf989a5e7ee103c.png\" alt=\"image\"\/><\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u0434\u0432\u0430 \u043a\u043b\u0438\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 ActionBar \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0441 Android 2.3 \u0438 \u0432\u044b\u0448\u0435.<\/p>\n<h6><b>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f<\/b><\/h6>\n<p>  \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u043e\u0439 Google \u0441\u0445\u0435\u043c\u0435<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/5d9\/847\/68a\/5d984768a3e50e7d6cfc1bdf4c1f08b1.png\" alt=\"image\"\/><br \/>  \u042d\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u041d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437 Xamarin \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432 VS \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432.<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/09d\/872\/902\/09d8729024ea4137374fea995ac775e4.png\" alt=\"image\"\/><br \/>  \u0438 \u0433\u043e\u0442\u043e\u0432\u043e<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/d47\/7c1\/4af\/d477c14af24d2b4e0cf28dfd61c66d24.png\" alt=\"image\"\/><br \/>  \u041f\u0440\u0430\u0432\u0434\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c KeyStore \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430. \u0427\u0442\u043e \u0442\u043e \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 \u043a\u043b\u044e\u0447\u0430 \u0431\u044b\u043b\u043e. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0443\u0447\u043a\u0430\u043c\u0438.<\/p>\n<h4>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h4>\n<p>  \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u2014 \u044d\u0442\u043e \u0443\u0436\u0430\u0441\u043d\u043e \u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041e\u0442 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0421\u0430\u043c\u044b\u0439 \u0434\u0435\u0448\u0435\u0432\u044b\u0439 \u0430\u043d\u0434\u0440\u043e\u0439\u0434 \u0441\u0442\u043e\u0438\u0442 \u0441\u0435\u0439\u0447\u0430\u0441 3000 \u0440\u0443\u0431, \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 \u043f\u043b\u0430\u043d\u0448\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0439 \u0446\u0435\u043d\u0435. \u042f \u0441 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430 \u0441\u0440\u0430\u0437\u0443 \u043a\u0443\u043f\u0438\u043b \u0436\u0435\u043d\u0435 Fly \u0441 Android 4.0.1, \u0442.\u043a. \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0440\u044b\u0439 HTC \u0441 2.3.<\/p>\n<p>  \u041f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434 iOS \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0432\u0437\u044f\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0434\u0435\u0448\u0435\u0432\u044b\u0439 \u043c\u0430\u043a\u0431\u0443\u043a, \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<br \/>  \u041d\u043e \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u044c \u043f\u0430\u0440\u0443 iPhone \u0438 iPAD \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u2026 \u043d\u0435 \u0437\u043d\u0430\u044e, \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c <a href=\"http:\/\/www.macincloud.com\/\">MacInCloud<\/a> \u0438 \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0448\u0443 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441.<\/p>\n<h4>\u0418\u0442\u043e\u0433<\/h4>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0442\u043e\u0433. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0443\u0447\u0438\u043b \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 Android \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b,<br \/>  \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043f\u043e\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u0431\u044d\u043a\u044d\u043d\u0434. <br \/>  \u0413\u043e\u0432\u043e\u0440\u044f\u0442, \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u043f\u043e\u0434 WinPhone \u0438 iPad. \u0427\u0442\u043e \u0436\u0435, \u043c\u043d\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b.<\/p>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438<\/h4>\n<p>  \u00abNote to self\u00bb \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f. \u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u043b \u043d\u0435 \u0442\u0430\u043a.<br \/>  1. \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u042f \u0434\u0432\u0430\u0436\u0434\u044b \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043b MTProto.Core \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u044d\u0442\u043e\u0433\u043e \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u044f \u043d\u0435 \u0441\u0435\u043b \u0441 \u0431\u0443\u043c\u0430\u0436\u043a\u043e\u0439 \u0438 \u043d\u0435 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e \u044d\u0442\u043e \u044f\u0434\u0440\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c. \u041c\u043d\u043e\u0433\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u0438 \u0431\u0435\u0437 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435.<br \/>  2. \u041f\u043b\u043e\u0445\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 Android \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u042f \u0434\u043e\u043b\u0433\u043e \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c Android. \u041f\u0440\u0438\u0437\u043d\u0430\u0442\u044c\u0441\u044f, \u044f \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u0437\u043d\u0430\u044e <i>\u043b\u0443\u0447\u0448\u0435\u0433\u043e<\/i> \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u044d\u0442\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041d\u0430\u0434\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0447\u0442\u043e \u0433\u0430\u0439\u0434\u044b d.android.com \u0442\u0443\u0442 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b, \u0441\u0435\u0440\u0432\u0438\u0441 \u0448\u0442\u0443\u043a\u0430 \u0434\u043b\u044f \u0430\u043d\u0434\u0440\u043e\u0439\u0434\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0430\u044f, \u0430 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u0442\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0435.<br \/>  3. \u0423\u043f\u0440\u044f\u043c\u043e\u0441\u0442\u044c \u0438 \u0436\u0430\u0434\u043d\u043e\u0441\u0442\u044c. \u0423 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u0434\u0432\u043e\u0435\u043c \u043c\u044b \u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041d\u043e \u0432\u0435\u0434\u044c \u044f \u0441\u0430\u043c, \u0432\u0441\u0435 \u0441\u0430\u043c. \t\t\t<\/p>\n<div class=\"clear\"><\/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=\"http:\/\/habrahabr.ru\/post\/194404\/\"> http:\/\/habrahabr.ru\/post\/194404\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/d93\/884\/903\/d93884903fc7e7df883069ba46dfe283.png\" alt=\"image\" align=\"right\"\/><br \/>  \u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c.<\/p>\n<p>  \u041a\u0430\u043a \u043c\u043d\u043e\u0433\u0438\u0435 \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u044e\u0442, \u041f\u0430\u0432\u0435\u043b \u0414\u0443\u0440\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u043e\u043d What&#8217;s App \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 MTProto. <\/p>\n<p>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u0448\u043a\u0430 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 iOS \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c Telegram. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u2014 <a href=\"http:\/\/vk.com\/androidchallenge\">\u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 Android \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/a>. <br \/>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f, \u043d\u0430\u0440\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0435\u043b\u043a\u0438 \u0438 \u044f \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435. \u0421\u043a\u0430\u0436\u0443 \u0441\u0440\u0430\u0437\u0443, \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u044f \u043d\u0435 \u043f\u0440\u043e\u0448\u0435\u043b.<\/p>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432, \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u044f\u0437\u044b\u043a\u043e\u043c C# \u0438 Xamarin \u043e \u0447\u0435\u043c \u0438 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0438\u0436\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e Xamarin \u0432 \u0440\u0443\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u044f\u043c\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e.<\/p>\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-194404","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/194404","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=194404"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/194404\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=194404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=194404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=194404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}