
рд╢реБрдн рджреЛрдкрд╣рд░
рдЬреИрд╕рд╛ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐, рдкрд╛рд╡реЗрд▓ рдбреНрдпреВрд░реЛрд╡ рд╡реНрд╣рд╛рдЯреНрд╕ рдРрдк рдФрд░ рдЕрдкрдиреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдПрдордЯреАрдЯреАрдкреАрдЖрд░рдУ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреНрдп рд▓реЛрдХрдкреНрд░рд┐рдп рдЗрдВрд╕реНрдЯреИрдВрдЯ рдореИрд╕реЗрдВрдЬрд░ рдХрд╛ рдПрдХ рдирдпрд╛ рдХреНрд▓реЛрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдЕрдореЗрд░рд┐рдХреА рдХрдВрдкрдиреА рдиреЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдирд╛рдордХ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдИрдУрдПрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдЬрд╛рд░реА рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░, рдПрдХ
рдПрдВрдбреНрд░реЙрдЗрдб рдХреНрд▓рд╛рдЗрдВрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рджреВрд╕рд░рд╛ рдЪрд░рдг рдкреВрд░рд╛ рд╣реБрдЖ, рд▓реЛрдЧреЛрдВ рдиреЗ рдЕрдкрдиреЗ рд╢рд┐рд▓реНрдк рднреЗрдЬреЗ, рдЬрд┐рдирдореЗрдВ рд╕реНрд╡рдпрдВ рднреА рд╢рд╛рдорд┐рд▓ рдереЗред рдореИрдВ рддреБрд░рдВрдд рдХрд╣реВрдВрдЧрд╛, рдореИрдВ рджреВрд╕рд░реЗ рдЪрд░рдг рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░рд╛ред
рдХрдИ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореИрдВрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП C # рднрд╛рд╖рд╛ рдФрд░ Xamarin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдиреАрдЪреЗ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ Xamarin рдкрд░ рд╣рдо RuNet рдореЗрдВ рдереЛрдбрд╝реА рд╕реА рдЬрд╛рдирдХрд╛рд░реА рдХрд╣рддреЗ рд╣реИрдВред
рдкреНрд░рд╡реЗрд╢ рдХреЗ рдмрджрд▓реЗ
рдореИрдВ рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╣реВрдВред рдореИрдВ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рд╕реЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрдм рдореИрдВ рдЕрднреА рднреА рдПрдХ рдЫрд╛рддреНрд░ рдерд╛, рдореБрдЭреЗ рдЗрд╕ рдордВрдЪ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрддрд╛ рд╣реИред рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ "Android C #" рдЕрдиреБрд░реЛрдз рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ Xamarin - MonoDroid рдкрд░ рд▓рд╛рдпрд╛ред рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реБрдП рд▓рд┐рдЦрд╛ рдерд╛, рдпрд╣ рдкрд╣рд▓реА рдмрдбрд╝реА рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░рд┐рдпреЛрдЬрдирд╛ рдереА, рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП C #, .NET рдФрд░ рдХрдо рд╕реЗ рдХрдо Android рдХреА рдПрдХ рдЖрджрд┐рдо рд╕рдордЭ рдХрд╛ рдЬреНрдЮрд╛рди рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдпрд╣ рдХреНрдпрд╛ рд╣реИ - рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ
Xamarin рдПрдХ рдХрдВрдкрдиреА рд╣реИ (рд╕рд╛рде рд╣реА рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо) рдЬреЛ Nat Friedman рдФрд░
Miguel de Icaza рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЬреЛ GNOME рдФрд░ рдореЛрдиреЛ рдХреЗ рд▓реЗрдЦрдХ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрд╝рдорд╛рд░рд┐рди рдореЛрдиреЛ рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рд╡рд┐рдХрд╛рд╕ рд╣реИред
Xamarin рдЖрдкрдХреЛ C # рдореЗрдВ Anroid рдФрд░ iOS рдХреЗ рд▓рд┐рдП рджреЗрд╢реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрдврд╝рд┐рдпрд╛ рд╣реИред рдореЗрд░рд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рд╣рд╛рдЗрдмреНрд░рд┐рдб рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рд╣реИред рдФрд░ рдПрдХ рдореИрдХ рднреАред рдФрд░ рд╡реЗ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ
рдореЛрдиреЛрдмреЗрд░реА рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ
рдХрд┐рд╕реА рджрд┐рди рдЬрд╝рд╛рдорд░реАрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рд░реНрдп
рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП MTProto рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рдкрд╣рд▓реЗ рдЪрд░рдг) рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ (рджреВрд╕рд░рд╛ рдЪрд░рдг) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдереЗред рддреАрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ, рд╕рдВрд╢реЛрдзрдиред
рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ RPC рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдЪреНрдЫрд╛рдЗрдпреЛрдВ рдЬреИрд╕реЗ рдЙрдиреНрдирдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рднреА рдЪреАрдЬреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдирд┐рд░реНрдгрдп
рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
Xamarin рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
Xamarin рдХреА рд▓рд╛рдЧрдд $ 2000 рд╣реИред рд╣рд╛рдБ рдпрд╣ рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рдХреАрдордд $ 999 рдкреНрд░рддрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИ рдореЛрдиреЛрдбреЗрд╡рд▓рдк - рдЗрд╕рдХреА рд▓рд╛рдЧрдд $ 299 рдкреНрд░рддрд┐ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИред рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкрддреНрд░рд╛рдЪрд╛рд░ рдореЗрдВ, рдореИрдВ рдкреНрд░рддрд┐ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо $ 799 рддрдХ рдХреА рдЫреВрдЯ рдХреЗ рд▓рд┐рдП рднреАрдЦ рдорд╛рдБрдЧрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред
рдореИрдВ xamarin рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдЦреИрд░, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЖрдк
рдЗрд╕реЗ рдЯреЙрд░реЗрдВрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Xamarin рдПрдХ рдордВрдЪ рдХреЗ рд▓рд┐рдП $ 99 рд╢реИрдХреНрд╖рдгрд┐рдХ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореЗрд▓ рд╕рдорд░реНрдерди рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╣рд╛рдВ, рдЕрдЧрд░ рдЖрдкрдХреА рдкрддреНрдиреА рдЧреНрд░реЗрдЬреБрдПрдЯ рд╕реНрдЯреВрдбреЗрдВрдЯ рд╣реИ, рддреЛ рдпрд╣ рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИред
рд╕рдорд╛рдзрд╛рди рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд╝рд╛рдорд░реАрди рдкреНрд░рддреНрдпреЗрдХ рдореЛрдмрд╛рдЗрд▓ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдУрдПрд╕ рдХреА рдЕрдкрдиреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдб рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬрд╝рд╛рдорд░реАрди рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рддреАрди рд╕рдВрднрд╛рд╡рд┐рдд
рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓рд┐рдВрдХрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ, рдЬреЛ рд╕реАрдзреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИред
рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдФрд░ рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕рдорд╛рдзрд╛рди рддреИрдпрд╛рд░ рд╣реИрдВ:

рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ, рдореБрдЦреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕рднреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрдкрдпреЛрдЧрд┐рддрд╛ "рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореИрдиреЗрдЬрд░" рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЧрдИ рд╣реИред
рд╕рдорд╛рдзрд╛рди рд╕рдВрд░рдЪрдирд╛
рдореБрдЦреНрдп рдЕрд╕реЗрдВрдмрд▓реА
MTProto.Core рдФрд░
Talks.Backend рд╣реИрдВ ред рдпреЗ .net 4.5 рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЕрд╕реЗрдВрдмрд▓реА рд╣реИрдВ рдФрд░ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЖрдЪреНрдЫрд╛рджрд┐рдд рд╣реИрдВред
Mono.Stub , рдореЛрдиреЛ рд╕реЗ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореИрдВ рд╡рд╣рд╛рдВ рд╕реЗ BigInteger рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
Droid рдлрд╝реЛрд▓реНрдбрд░ - рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ Android рдХреНрд▓реЛрди рд╣реЛрддреЗ рд╣реИрдВ, Dataflow - рдпреЗ Github рд╕реЗ TPL.Dataflow рдХреЗ рд╕реНрд░реЛрдд рд╣реИрдВред рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ C # 5.0 рдХреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ - рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдЕрднреА рддрдХ рдпрд╣ рдХреЗрд╡рд▓ рдПрдВрдбреНрд░реЙрдЗрдб рд╣реИред
MTProto.Core
рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рд╕рдореНрдкреВрд░реНрдг рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ RPC рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрдирдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдирд╛ рдпрд╛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдлрд╛рдЗрд▓ рднреЗрдЬрдирд╛ / рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, IM рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ RPC рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджреЗрд╢реЛрдВ рдФрд░ рд╕реНрдерд┐рддрд┐ рдЕрджреНрдпрддрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ: рд╕рднреА рддрд░рд╣ рд╕реЗ рдФрд░ рдбреЗрдЯрд╛рдлрд╝реНрд▓реЛ asyncред
рд╕рднреА рддрд░рд╣ рд╕реЗ async
C # 5.0 рдиреЗ рдХреБрдЫ рдРрд╕реЗ рдХреАрд╡рд░реНрдб рдкреЗрд╢ рдХрд┐рдП, рдЬреЛ рдЯрд╛рд╕реНрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреИрдЯрд░реНрди (TAP) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рд╡реЗ
MSDN рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред
рд╕рднреА IO рдСрдкрд░реЗрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдПрдХ рдХрдорд╛рдВрдб рдХреА рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
public async Task RunAsync() { await _cl.LoadSettings().ConfigureAwait(false); if (await _cl.CheckAndGenerateAuth().ConfigureAwait(false)) { await _cl.RunAsync().ConfigureAwait(false); } if ((_cl.Settings.DataCenters == null) || (_cl.Settings.DataCenters.Count == 0)) { await _cl.GetConfig().ConfigureAwait(false); } _db = await TalksDatabase.GetDatabase().ConfigureAwait(false); _ldm = new LocalDataManager(_db); _cl.ProcessUpdateAsync = ProcessUpdateAsync; }
рд╕реНрдЯреАрдлрди рдХреНрд▓реА, рд╕реА # рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЕрдЧреНрд░рдгреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдиреЗ
рдПрд╕рд┐рдВрдХреНрд╕реНрдЯ-рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ
рд╕рд┐рджреНрдзрд╛рдВрдд рд▓рд┐рдЦреЗ рдЬреЛ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рдмрди рдЧрдП рд╣реИрдВред рдЕрдЧрд░ рдЖрдкрдиреЗ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
"Async рд╕рднреА рддрд░рд╣ рд╕реЗ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрд▓ рдЯреНрд░реА рдкрд░ рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИрдВ, рдШрдЯрдирд╛ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рд╕реАрдзреЗ IO рдСрдкрд░реЗрд╢рди (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
async void button_Click(object sender, EventArgs e) { _button.Enabled = false; await _presenter.SendMessage(); }
рддрдм рдЖрдк рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЗрдВ рдХреЙрд▓ рдЯреНрд░реА рдкрд░ рд╕рднреА рддрд░реАрдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВ:
рдХреЛрдб public Task<bool> SendMessage() { return SendMessageToUser(); }
public async Task<bool> SendMessageToUser() { ... try { _imv.AddMineMessage(msg); string msgText = _imv.PendingMessage; _imv.PendingMessage = "";
рдФрд░ рдХреЛрд░ рдореЗрдВ:
public Task<RpcAnswer> PerformRpcCall(string combinatorName, params object[] pars) { return _cl.PerformRpcCall(combinatorName, pars); }
public async Task<RpcAnswer> PerformRpcCall(string combinatorName, params object[] pars) { try { var confirm = CreateConfirm();
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рддрд░реАрдХреЗ async-wait рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рдпрд╣ рд╣реИ: рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ
рдмрд╛рдж рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕
рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рд╣реИ, рддреЛ рдпрд╣ рдмрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдПрдХ рдФрд░ рдкреНрд░рдерд╛ (рдХреНрд▓реАрдпрд░ рдХреЗ рд▓реЗрдЦ рдореЗрдВ рднреА рд╡рд░реНрдгрд┐рдд рд╣реИ) рдпрд╣ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрджрд░реНрдн рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдореЗрдВ
.ConfigureAwait(false)
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
.ConfigureAwait(false)
рдЧрддрд┐рд░реЛрдз рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛
.ConfigureAwait(false)
рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдКрдкрд░ рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
dataflow
TPL.Dataflow рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕реЗ рдбреЗрдЯрд╛ рдлреНрд▓реЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ
, рдЬреЛ рдЖрдкрдХреЛ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ
MSDN рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдпрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЗрдХрд╛рдЗрдпреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рд╢рд░реНрдд рдХреЗ рддрд╣рдд рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рджреЛ рдРрд╕реА рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЗрдВ рдереАрдВ: рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреИрдХреЗрдЯ рдХреЗ рд▓рд┐рдПред рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдФрд░ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
BufferBlock<byte[]> _inputBufferBytes = new BufferBlock<byte[]>(); BufferBlock<InputTLCombinatorInstance> _inputBuffer = new BufferBlock<InputTLCombinatorInstance>(); ActionBlock<byte[]> _inputBufferParcer; ActionBlock<TLCombinatorInstance> _inputUpdates; ActionBlock<TLCombinatorInstance> _inputSystemMessages; TransformBlock<InputTLCombinatorInstance, RpcAnswer> _inputAnswers; BufferBlock<RpcAnswer> _inputAnswersBuffer = new BufferBlock<RpcAnswer>(); BufferBlock<RpcAnswer> _inputRejectedBuffer = new BufferBlock<RpcAnswer>(); BufferBlock<InputTLCombinatorInstance> _inputUnsorted = new BufferBlock<InputTLCombinatorInstance>();
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрдирдкреБрдЯ рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд, рд╡рд░реНрдЧреАрдХреГрдд рдФрд░ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЕрдкрдбреЗрдЯ рдФрд░ рд╕рд┐рд╕реНрдЯрдордореИрд╕реЗрдЬ рддреБрд░рдВрдд
ActionBlock
рдореЗрдВ рдЖрдиреЗ рдкрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ rpcAnswers рдХреЛ рдкрд╣рд▓реЗ
TransformBlock
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░
BufferBlock
рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреИрдХреЗрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдЧреАрдХрд░рдг рдмреНрд▓реЙрдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░
BufferBlock
рдЕрдВрджрд░
BufferBlock
ред
рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд╣рдо WriteOnceBlock рдмрдирд╛рддреЗ рд╣реИрдВ - рдПрдХ рдмреНрд▓реЙрдХ рдЬрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ 1 рдорд╛рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
WriteOnceBlock<RpcAnswer> answer = new WriteOnceBlock<RpcAnswer>(e => e);
рдФрд░ рдЗрд╕реЗ RPC рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдлрд╝рд░ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ:
_inputAnswersBuffer.LinkTo(answer, new DataflowLinkOptions { MaxMessages = 1 }, i => i.SessionId == _em.SessionId);
рдФрд░ рдлрд┐рд░ рд╣рдо рдЙрддреНрддрд░ рдЖрдиреЗ рддрдХ рдЕрддреБрд▓рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ:
return await answer.ReceiveAsync(TimeSpan.FromSeconds(60)).ConfigureAwait(false);
рдореИрдВ рдпрд╣ рднреА рдЕрд▓рдЧ рд╕реЗ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдХреНрд╖рдг рддрдХ рдореИрдВрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдПрдХ рднреА рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рд▓рд┐рдЦреА рд╣реИред рд╕рднреА рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг .net 4.5 рдХреЗ рддрд╣рдд рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдереЗ
Talks.Backend
рдЧреНрд░рд╛рд╣рдХ рдмреИрдХрдПрдВрдбред рдореИрдВрдиреЗ IoC рдХреЗ рд╕рд╛рде MVP рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдФрд░ рд╢реБрд░реВ рдореЗрдВ рдореИрдВрдиреЗ рдкреИрд╕рд┐рд╡ рд╡реНрдпреВ рд╡реЗрд░рд┐рдПрд╢рди рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрд╛ рдЬрдм рджреГрд╢реНрдп рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рд╕реБрдкрд░рд╡рд╛рдЗрдЬрд┐рдВрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдмреИрдХрдПрдВрдб рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реБрдИрдВ? рдиреЛрдЯрдмреБрдХ рддрдХ рдкрд╣реБрдВрдЪ, рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдВрдЪ (рдлреЛрдЯреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдмреИрдХрдПрдВрдб рдХрд╛ рдмрд╛рдХреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрдорд╡реАрдкреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ: рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдФрд░ рдЖрдИрд╡реАрд╡рд╛рдИрдИ рдХрд╛ рдПрдХ рд╕реЗрдЯ
рдиреЛрдЯрдмреБрдХ рддрдХ рдкрд╣реБрдВрдЪ
рдиреЛрдЯрдмреБрдХ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╝рд╛рдорд░реАрди рдЯреАрдо рдкрд╣рд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд▓реЗрдХрд░ рдЖ рдЪреБрдХреА рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ Xamarin.Mobile рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рдХреА рд╣реИ, рдЬреЛ рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ encapsulate рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдиреЛрдЯрдмреБрдХ, рдЬреАрдкреАрдПрд╕, рдХреИрдорд░рд╛, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рддрд░реАрдХреЗ рд╕реЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ async-wait рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рдеред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдиреЛрдЯрдмреБрдХ рддрдХ рдкрд╣реБрдВрдЪ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ:
#if __ANDROID__ public async Task GetAddressbook(Android.Content.Context context) { contacts = new AddressBook(context); #else public async Task GetAddressbook() { contacts = new AddressBook(); #endif if (!await contacts.RequestPermission()) { Trace.WriteLineIf(clientSwitch.TraceInfo, "Permission for contacts denied", "[ContactsPresenter.PopulateAddressbook]"); _view.SendSmallMessage("CONTACTS PERMISSON DENIED"); return; } else { _icv.PlainContacts = new ListItemCollection<ListItemValue>( (from c in contacts where (c.Phones.Count() > 0) select new ListItemValue(c)).ToList()); } }
__ANDROID__
рд╕рдВрдХрд▓рди
__ANDROID__
рдкреЗрд╢ рдХрд┐рдпрд╛
__ANDROID__
рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджрд░реНрдн рдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдУрдПрд╕ рдкрд░ рдирд╣реАрдВред
рдпрд╣рд╛рдВ рдЖрдк рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкреИрд╕рд┐рд╡ рд╡реНрдпреВ рдХреЗ рдиреБрдХрд╕рд╛рди рдореЗрдВ рд╕реЗ рдПрдХ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░, рд╣рдореЗрдВ рдЙрдкрдирд╛рдо рдХреЗ рдкрд╣рд▓реЗ рдЕрдХреНрд╖рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред Android рдХреЗ рд▓рд┐рдП, рдпрд╣ ListItemCollection рд╡рд░реНрдЧ рдмрдирд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдореВрд╣реАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред IOS рдкрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдореВрд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╣ рд╣реИ рдХрд┐ WinPhone рдкрд░ - рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реАрдзреЗ рд╡реНрдпреВ рдореЗрдВ рдЧреНрд░реБрдк рдХреЙрдиреНрдЯреИрдХреНрдЯреНрд╕ рдХреЛ рд░рд┐рд╕реАрд╡ рдФрд░ рдЧреНрд░реБрдк рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдпрд╣ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╣рд╛рдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред
рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ
рдЬрд╝рд╛рдорд░реАрди рдПрдХ рд╕рд╛рдзрд╛рд░рдг ORM SQLite.Net рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдореИрдВрдиреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрди рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рд╕рд▓рд╛рд╣ рдХреЛ рд╕реБрдирдирд╛ рдмреЗрд╣рддрд░ рдерд╛ред
рдореБрдЭреЗ SQLite.Net рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ SQlite.Net рдХреЗ рд╕рд╛рде рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ sqlite рдмрд╛рдпрдиреЗрд░реА рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ
www.sqlite.org/download.html рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ SQLite.Net рдкреВрд░реА рддрд░рд╣ рд╕реЗ TAP рдФрд░ async-wait рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдореИрдВ SQLite.SQLiteAsyncConnection рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
#region Public Methods public Task<List<T>> GetItemsAsync<T>() where T : IBusinessEntity, new() { return Table<T>().ToListAsync(); } public Task<T> GetItemAsync<T>(int id) where T : IBusinessEntity, new() { return GetAsync<T>(id); } public async Task<bool> CheckRowExistAsync<T>(int id) where T : IBusinessEntity, new() { string tblName = typeof(T).Name; return await ExecuteScalarAsync<int>("select 1 from " + tblName + " where Id = ?", id).ConfigureAwait(false) == 1; } public async Task<int> SaveItemAsync<T>(T item) where T : IBusinessEntity, new() { if (await CheckRowExistAsync<T>(item.Id)) { return await base.UpdateAsync(item).ConfigureAwait(false); } else { return await base.InsertAsync(item).ConfigureAwait(false); } } public Task<int> DeleteItemAsync<T>(int id) where T : IBusinessEntity, new() { return DeleteAsync(new T() { Id = id }); } #endregion
рдпрд╣ рднреА рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдУрдПрд╕ рдкрд░ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдирд┐рдпрдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
public static string DatabaseFilePath { get { var sqliteFilename = "TalksDb.db3"; #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, "..", "Library"); // Library folder #endif var path = Path.Combine(libraryPath, sqliteFilename); #endif return path; } }
рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдПрдХреНрд╕реЗрд╕
рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдерд╛ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ
рдпрд╣рд╛рдВ рд╕реЗ рдбрд┐рд╕реНрдХ рдХреИрд╢ рдХреЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╡рд░реНрдЧ рдХреЛ рд▓рд┐рдпрд╛ рдФрд░ рдЕрдВрддрд┐рдо рд░реВрдк
рджрд┐рдпрд╛ ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХрдо рд╕реЗ рдХрдо рдкреЛрд░реНрдЯреЗрдмрд▓ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдУрдПрд╕ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВред рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЬрд╝рд╛рдорд░реАрди рдбреЙрдХ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
Talks.Droid
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ Android рд╕рдВрд╕реНрдХрд░рдгред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдЬрдм рддрдХ рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдордВрдЪ рдкрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдмреИрдХрдПрдВрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рдореБрдЦреНрдп рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдпрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд╛рдЙрдВрдб рд╕реЗрд╡рд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдРрдк рдХреНрд▓рд╛рд╕ рдмрд╛рдзреНрдп рд╣реИ - рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдЬреЛ "рдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдЧрддрд┐рд╡рд┐рдзрд┐
App.Current.MainService
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХреЗред
рд╕реЗрд╡рд╛ рдХреЗ рдЕрдВрджрд░, рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рднреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдкрдиреЗ рдкреНрд░реЗрдЬреЗрдВрдЯрд░реНрд╕ рдХреЛ рдЙрдард╛рддреА рд╣реИрдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
_presenter = App.Current.MainService.CreatePresenter<ChatListPresenter>(typeof(ChatListPresenter), this);
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрд╝рд╛рдорд░реАрди рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ AndroidManifest рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╕рднреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
[Activity(Label = "Settings", Theme = "@style/Theme.TalksTheme")] [MetaData("android.support.PARENT_ACTIVITY", Value = "talks.ChatListActivity")] public class SettingsActivity : SherlockActivity, IView
рдЕрд╕рд▓ рдореЗрдВ, рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛрдб рдЬрд╛рд╡рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЬреНрдпрд╛рджрд╛ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реИ, CamelCase, рдФрд░ рдХреБрдЫ рдЧреЗрдЯрд░реНрд╕ / рд╕реЗрдЯрд░ рдЧреБрдгреЛрдВ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИрдВ
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle);
рдЧрддрд┐рд╡рд┐рдзрд┐ рд▓реЙрдЧрд┐рди рдХрд░реЗрдВ
рд▓реЙрдЧрд┐рди рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ 3 рдмрд┐рдВрджреБ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП - рдлреЛрди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛, рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рджрд░реНрдЬ рдХрд░рдирд╛, рдкрдВрдЬреАрдХрд░рдгред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐,
рдЯреБрдХрдбрд╝реЛрдВ рдФрд░ MVP рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ !
рдирддреАрдЬрддрди, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдмрдирд╛рдпрд╛, рдФрд░ рд▓реЙрдЧрд┐рдирдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдиреЗ рд╕рд┐рд░реНрдл IVIV рдЕрдВрд╢реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рдкреЗрдЯрд╛:
PhoneFragment _pf = null; CodeFragment _cf = null; SignUpFragment _suf = null; public string PhoneNumber { get { if (_pf != null) { return _pf.Phone; } else { return ""; } } } public string AuthCode { get { return _cf.Code; } } public string Name { get { return _suf.FirstName; } } public string Surname { get { return _suf.Surname; } }
рд╢реВрдЯрд┐рдВрдЧ рдлреЛрдЯреЛ / рд╡реАрдбрд┐рдпреЛ
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдХрд╛рд░реНрдп рдпрд╣ рдерд╛ рдХрд┐ рдХреИрдорд░реЗ рд╕реЗ рдлреЛрдЯреЛ / рд╡реАрдбрд┐рдпреЛ рджреВрд╕рд░реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдП рдпрд╛ рдЙрд╕реЗ рдЕрд╡рддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдпрд╣ Xamarin.Mobile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
public override bool OnMenuItemSelected(int featureId, Xamarin.ActionbarSherlockBinding.Views.IMenuItem item) { switch (item.ItemId) {
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрдиреВ рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдИрд╡реЗрдВрдЯ рдмреВрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП async-wait рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрд╕рд┐рдВрдХреНрд╕реНрдЯ-рд╡реЗрдЯ рд╕рд┐рд░реНрдл рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рд╣реИ рдЬреЛ рдЕрдВрддрддрдГ рдПрдХ рд╣реА рдирд┐рд░рдВрддрд░рддрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдФрд░ рдХреБрдЫ рднреА рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ:
#if __ANDROID__ /// <summary> /// /// </summary> /// <param name="context"></param> /// <returns></returns> 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("{0:dd_MM_yyyy_HH_mm}.jpg", DateTime.Now), Directory = "TalksPictures" }) .ContinueWith((prevTask) => { if (prevTask.IsCanceled) { _imv.SendSmallMessage("User canceled"); return; } if (PlatformSpecificImageResize != null) { string path = PlatformSpecificImageResize(prevTask.Result); // DomainModel.Message msg = new DomainModel.Message(r.Next(Int32.MaxValue), 0, _imv.ChatId, _imv.PendingMessage, "", 0); _imv.AddMineMessage(msg); } }) .ContinueWith((prevTask) => { if (!prevTask.IsCanceled) { Console.WriteLine("User ok"); } }, TaskScheduler.FromCurrentSynchronizationContext()); return true; } return false; }
Xamarin, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рд╕реНрдЯреЛрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ / рдпрд╛ рдЖрдИрдУрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдШрдЯрдХреЛрдВ рдХреЗ рдкреЛрд░реНрдЯ рд╣реИрдВ, рджреЛрдиреЛрдВ рдореБрдлреНрдд рдФрд░ рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, ActionBar.Scherlok рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рд╣реИ рдФрд░ Android.Support.v7 рд╣рд╛рд▓ рд╣реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдШрдЯрдХреЛрдВ рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рд╕реАрдзреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ NuGet рдореЗрдВ, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛ рдХреНрд▓рд┐рдХ рдореЗрдВ, рдЖрдк Android 2.3 рдФрд░ рдЙрдЪреНрдЪрддрд░ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ ActionBar рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рдХрд╛рд╢рди
рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ Google рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдореЛрджрд┐рдд рд╣реИред

рдЗрд╕рдореЗрдВ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдЬрд╝рд╛рдорд░реАрди рдХреА рдЯреАрдо рдиреЗ рд╡реАрдПрд╕ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдПрдХ рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдмрдирд╛рдпрд╛ рдЬреЛ рдЖрдкрдХреЛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдФрд░ рдХрд┐рдпрд╛

рд╕рдЪ рд╣реИ, рдореИрдВ рддреБрд░рдВрдд рдЗрд╕ рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ KeyStore рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ред рдХреБрдВрдЬреА рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдерд╛ред рдореБрдЭреЗ рдкреЗрди рдмрдирд╛рдирд╛ рдерд╛ред
рдкрд░реАрдХреНрд╖рдг
рдкрд░реАрдХреНрд╖рдг рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдиреЛрдЯред рдПрдХ рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рднрдпрд╛рдирдХ рдФрд░ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕реЗ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм рддрдХ рдХреЗ рд╕рдмрд╕реЗ рд╕рд╕реНрддреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдХреА рдХреАрдордд 3000 рд░реВрдмрд▓ рд╣реИ, рдПрдХ рдЪреАрдиреА рдЯреИрдмрд▓реЗрдЯ рдПрдХ рд╕рдорд╛рди рдХреАрдордд рдкрд░ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рддреБрд░рдВрдд рдЕрдкрдиреА рдкрддреНрдиреА рдлреНрд▓рд╛рдИ рдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб 4.0.1 рдХреЗ рд╕рд╛рде рдЦрд░реАрджрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ 2.3 рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд░рд╛рдирд╛ рдПрдЪрдЯреАрд╕реА рдерд╛ред
IOS рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рдмреЗрд╢рдХ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╕рдмрд╕реЗ рд╕рд╕реНрддрд╛ рдореИрдХрдмреБрдХ рд▓реЗрдирд╛ рд╣реИ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП iPhone рдФрд░ iPAD рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдЦрд░реАрджрдиреЗ рдХреЗ рд▓рд┐рдП ... рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВред рдЕрдм рдореИрдВ
MacInCloud рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛
рд╣реВрдВ рдФрд░ рдЕрдЧрд░ рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рдкрд░рд┐рдгрд╛рдо
рдЕрдм рдЗрд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛,
рдПрдХ рдЕрдЪреНрдЫрд╛, рдЯреЗрд╕реНрдЯ-рдХрд╡рд░ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдмреИрдХрдПрдВрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ред
рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЧреЗ WinPhone рдФрд░ iPad рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рд╣реЛрдЧреАред рдЦреИрд░, рдореИрдВ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВред
рдХреАрдбрд╝реЗ рдкрд░ рдХрд╛рдо
"рд╕реНрд╡рдпрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ" рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЬреЛ рдЧрд▓рдд рдХрд┐рдпрд╛ рдЙрд╕рдХреЗ рднрд╡рд┐рд╖реНрдп рдкрд░ рд╕рд┐рд░реНрдл рдЯрд┐рдкреНрдкрдгреА рдХреАред
1. рдбрд┐рдЬрд╛рдЗрди рдХреА рдХрдореАред рдореИрдВрдиреЗ MTProto.Core рдХреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЛ рдмрд╛рд░ рд░рд┐рдлрд▓реЗрдХреНрдЯ рдХрд┐рдпрд╛ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдХрд╛рдЧрдЬ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмреИрдард╛ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдХреЛрд░ рдХреИрд╕реЗ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрдИ рдирд┐рд░реНрдгрдп рдЕрдирд╛рдпрд╛рд╕ рдФрд░ рдмрд┐рдирд╛ рднрд╡рд┐рд╖реНрдп рдкрд░ рдзреНрдпрд╛рди рджрд┐рдП рдХрд┐рдП рдЧрдПред
2. рдПрдВрдбреНрд░реЙрдпрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреА рдЦрд░рд╛рдм рд╕рдордЭред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореИрдВрдиреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕рдЪ рдХрд╣реВрдБ рддреЛ, рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛
рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ред рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ d.android.com рдЧрд╛рдЗрдб рдпрд╣рд╛рдВ рдмреЗрдХрд╛рд░ рд╣реИрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХреА рдмрд╛рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдФрд░ рдХреБрдЫ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
3. рд╣рда рдФрд░ рд▓рд╛рд▓рдЪред рдореБрдЭреЗ рдПрдХ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛, рдФрд░ рд╢рд╛рдпрдж рдПрдХ рд╕рд╛рде рд╣рдордиреЗ рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдпрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдЦреБрдж, рд╕рдм рдЕрдкрдиреЗ рдЖрдк рд╕реЗред