рдХреНрдпреЛрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ?
рдПрдХ рдореИрдХ рдФрд░ iPhone, рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдХрд┐рд╕реА рддрд░рд╣ рдЧрд▓рдд рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдорд╕реНрдпрд╛ рдпрд╣рд╛рдБ рдмрджрд▓ рдЧрдИ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╖рдп рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдФрд░ рдХреЛрдХреЛ рдореЗрдВ рдбреБрдмреЛ рджрд┐рдпрд╛ред
рддреНрдпрд╛рдЧ
рдХреГрдкрдпрд╛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХреЗрд╡рд▓ iOS рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЖрд╡реЗрджрди рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ Objective-C рдкрд░ рдкрд╣рд▓рд╛ рдЖрд╡реЗрджрди рднреА рд╣реИред рдореИрдВ рдХрднреА рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдпрд╛ рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХрд╛ рдвреЛрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдордЧреНрд░ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рд╛, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЖрдИрдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИред рдЦрд╛рд╕рдХрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред
рдЕрд╕реНрд╡реАрдХрд░рдг реи
рдпрд╣ рдкреЛрд╕реНрдЯ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдж рдкреНрд░реИрдЧреНрдореЗрдЯрд┐рдХ рдмреБрдХрд╢реЗрд▓реНрдлрд╝ рдореИрдЧрдЬрд╝реАрди рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдИ рдереА -
рдпреВрдПрд╕ рд╡реАрдЬрд╛: рдорд╛рдп рдлрд░реНрд╕реНрдЯ рдЖрдИрдлреЛрди рдРрдк ред рдпрд╣рд╛рдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд░реВрд╕реА рд╕рдВрд╕реНрдХрд░рдг, рдкрддреНрд░рд┐рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдЯреАрдХ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдПрдХ рдЕрд▓рдЧ рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред
"рд╣реНрдпреВрд╕реНрдЯрди! рд╣рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ! тАЭ
рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕рд╛рд▓ рдореЗрдВ, рдореБрдЭреЗ рдХрдИ рдмрд╛рд░ рд▓рдВрджрди рдореЗрдВ рджреВрддрд╛рд╡рд╛рд╕ рдореЗрдВ рдЕрдореЗрд░рд┐рдХреА рд╡реАрдЬрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, "рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЖрдкрдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╡реАрдЬрд╝рд╛ рдХреЗ рдмрдЬрд╛рдп рд╡реЗ рдПрдХ рдмреИрдЪ рдирдВрдмрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдордп-рд╕рдордп рдкрд░ рдЙрдирдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рджреЗрдЦреЗрдВ, рдЬрд╣рд╛рдВ рдПрдХ рдкреАрдбреАрдПрдл рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдирд┐рд░реНрджреЗрд╢ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ (рдЕрдзрд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднреЗрдЬреЗрдВ, рдкрд╛рд╕рдкреЛрд░реНрдЯ рднреЗрдЬреЗрдВ) рдЖрджрд┐)ред рдЖрдк
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреАрдбреАрдПрдл рдХреЗ
рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдлрд╝рд╛рдЗрд▓ рдЦреБрд▓рддреА рд╣реИ, CTRL-F рджрдмрд╛рдПрдВ, рдирдВрдмрд░ (рдмреИрдЪ рдирдВрдмрд░) рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдПрдВред
рд╕реНрд╡рдЪрд╛рд▓рди рдХрд╛ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдерд╛ - iPhone рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рдПрдХ рдмрд╛рд░ рдЖрд╡реЗрджрди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдбреНрд░рд╛рдЗрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдмрдЯрди рдкрд░ рдПрдХ рдХреНрд▓рд┐рдХ рдХреЗ рд╕рд╛рде рд╡реАрдЬрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ, рдЙрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рд╕рдм рдЦреЛрдпрд╛ рдирд╣реАрдВ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕рд┐рдЧрд╡рд┐рди рдпрд╛ рдорд┐рдирдЧрд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
GNUstep рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ-рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП AppKit рдФрд░ Foundation рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдХрд╛рд╢, рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрддрдиреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЧреЛрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдКрдВрдЧрд╛ред рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЖрд╡реЗрджрди рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдкреАрдбреАрдПрдл рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдореИрдХ рджреЛрдиреЛрдВ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдж рдореЗрдВ, рд╣рдо iOS рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди, рдЕрдлрд╕реЛрд╕, рдпрд╣ рдХреЗрд╡рд▓ рдореИрдХ рдорд╛рд▓рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХреНрд╕рдХреЛрдб рдореЗрдВ рдПрдХ iPhone рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдкрд░ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рд╣реИрдХрд┐рдВрдЯреЛрд╢ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ iPhone рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореИрдХ рдХреЗ рдмрд┐рдирд╛ рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
Windows рдкрд░ GNUstep рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рдореБрдЭреЗ рджреЛ рдорд╣рд╛рди рдкрдж рдорд┐рд▓реЗ:
- " рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рд╕реАрдЦреЗрдВ " - рдЬреАрдПрдирдпреВрд╕реНрдЯреЗрдк рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдиреНрдпреВрдирддрдо рдЖрд╡реЗрджрди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
- " рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдХреНрд▓реИрдВрдЧ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА " - рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдХреНрд▓реИрдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░реЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ GNUstep рдХреЗ рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ GCC, Apple рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд╕реНрддреБрдирд┐рд╖реНрда-рд╕реА рднрд╛рд╖рд╛ рд╕реНрддрд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Apple рдХреБрдЫ рд╕рдордп рдХреЗ рдмрд╛рдж рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ Clang рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рддреЛ, рдЖрдкрдХреЛ рдХреНрд▓реИрдВрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЕрднреА рддрдХ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ-рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛, рдФрд░ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдЙрда рдЧрдпрд╛ред
рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдФрд░ рдЖрдИрдУрдПрд╕ рдПрдкреАрдЖрдИ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛
рдореИрдВ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдерд╛, рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдЕрд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдлрд╡рд╛рд╣реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рдЪреЗрддрд╛рд╡рдиреА :
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдореЗрдВ рдЕрдореЗрдЬрд╝реЕрди рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрдмрджреНрдз рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирдВрдмрд░ рд╣реИред рдЗрди рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреА рдЧрдИ рд╕рдВрднрд╛рд╡рд┐рдд рдЦрд░реАрджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░рддрд┐рд╢рдд рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рди рдХрд░реЗрдВ, рдпрд╛ рдХрдЯ-рдкреЗрд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ "рдХреНрд▓реАрди" рдХрд░реЗрдВред рдЖрдкрдХреА рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред1.
iOS рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ: рдж рдмрд┐рдЧ рдирд░реНрдб рд░реЗрдВрдЪ рдЧрд╛рдЗрдб, 3 / рдИ (рдмрд┐рдЧ рдирд░реНрдб рд░реЗрдВрдЪ рдЧрд╛рдЗрдбреНрд╕) 

2.
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ: рдж рдмрд┐рдЧ рдирд░реНрдб рд░реЗрдВрдЪ рдЧрд╛рдЗрдбреНрд╕ (рдмрд┐рдЧ рдирд░реНрдб рд░реЗрдВрдЪ рдЧрд╛рдЗрдбреНрд╕) 

3.
рдЙрджреНрджреЗрд╢реНрдп-рд╕реА (4 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг) рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдбреЗрд╡рд▓рдкрд░ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА) 

рдПрдХ рдЬрд╛рджреБрдИ рдореБрдлреНрдд рджрд╕реНрддрд╛рд╡реЗрдЬ рднреА рд╣реИ -
C ++ рд╕реЗ Objective-C рддрдХ ред
рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдп рдХреЛ рддреАрди рдореБрдЦреНрдп рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рдкрд╛рд░реНрд╕рд░ рдкреАрдбреАрдПрдл
- рдкреАрдбреАрдПрдл рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ (рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ)
- IOS рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╕реА рдпрд╛ рд╕реА ++ рдореЗрдВ рдХрдо рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдореБрдЭреЗ рдпреВрдЖрдИ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдиреБрднрд╡ рд╣реИ (рдореИрдВ рдбреЗрд▓реНрдлреА / рд╕реА ++ рдмрд┐рд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЧрдбрд╝рдмрдбрд╝ рдХрд░рддрд╛ рдерд╛), рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡ рдХреЗ рд▓рд┐рдП "рдбреНрд░рд╛рдЗрд╡" C рдФрд░ рдХреЛрдХреЛ рдЖрд╕рд╛рди рд╣реИрдВред рдпрд╣ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрдз-рдореИрдиреБрдЕрд▓ рдореЙрдбрд▓ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ CII рдореЗрдВ RAII рдХреЗ рдмрд╛рдж рдФрд░ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░) рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рд╕реНрд╡рдпрдВ рдореЗрдореЛрд░реА рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдЧрдгрдирд╛ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдЙрдирдХреЗ рд╕рд╣реА рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд╣реИред рдПрдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдореЗрдореЛрд░реА рд▓реАрдХ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХреНрд╕рдХреЛрдб рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рд░реВрдкрд░реЗрдЦрд╛ рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдиреАрдЪреЗ рдореИрдВ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдФрд░ рдХреЛрдХреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдЫрд╛рдкреЗрдВ рджреВрдВрдЧрд╛ред рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдирдореЗрдВ рдЕрдиреБрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдореЗрдВ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдХреИрд╕реЗ рдмрдирддреЗ рд╣реИрдВред рдпрд╣ рд▓рдЧрднрдЧ рдПрдХ рдорд╛рдирд╡ рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдХрд╣рддрд╛ рд╣реВрдВ "рдХреГрдкрдпрд╛, рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдПрдХ рд╕реБрдИ рдЦреЛрдЬреЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рд╛рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ", рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдореЗрдВ рдпрд╣ рд╣реЛрдЧрд╛:
+ (bool)findInPortion:(NSMutableData *)someData needle:(NSString*)aNeedle andAddTo:(NSMutableArray*)aList { ... }
рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓рдЧрднрдЧ рдкреВрд░реНрдг рдкреНрд░рд╕реНрддрд╛рд╡ рдорд┐рд▓рддрд╛ рд╣реИред рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдкреВрд░рд╛ рдирд╛рдо
findInPortion:needle:andAddTo:
рддрд░реНрдХ рдирд╛рдо рджрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдирд╛рдо рд╡рд┐рдзрд┐ рдХреЗ рдкреВрд░реНрдг рдирд╛рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЪрд░ рддрд░реНрдХреЛрдВ (
someData
,
aNeedle
рдФрд░
aList
) рдХреЗ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рдПрдХ рдмрд▓реНрдХрд┐ "рдХреНрд░рд┐рдпрд╛" рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рд▓реЗрдХрд┐рди Xcode рдореЗрдВ рд╢рд╛рдирджрд╛рд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдкреНрд░рдгрд╛рд▓реА рдЬрдм рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛрдб рдЖрдкрдХреЛ рдЗрди рд╕рднреА рдШреБрдорд╛рд╡реЛрдВ рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд░реИрдВрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓рдВрдмреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рддреЛрдбрд╝рддреЗ рд╕рдордп рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рдВрд░реЗрдЦрдг рдЙрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рдирд╛рдо рдЕрд▓рдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд░рдВрдкрд░рд╛рдЧрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:
NSMutableArray* list = NSMutableArray.alloc.init;
рдпрд╣ рд▓рд┐рдЦрд╛ рд╣реИ:
NSMutableArray* list = [[NSMutableArray alloc] init];
рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрджрдд рдХреА рдмрд╛рдд рд╣реИред рдлрд┐рд░ рд╕реЗ, рдХреЛрдб рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдкреНрд░рдгрд╛рд▓реА рдЬреЛ рдЖрдк рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдЯрдлрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рднреА рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдФрд░ рдХреЛрдХреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдмрд╕ рдорд╛рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВред рд╡реЗ рд╣рд░ рдЬрдЧрд╣ рдХреЛрдХреЛ рдореЗрдВ рд╣реИрдВред рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЙрд▓рдмреИрдХ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рд╕рд╛рде, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдмрдВрдбрд▓ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛, рдмрд╕ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреЙрд▓рдмреИрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ PDF рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ
NSURLConnection рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдПрдХ
NSURLConnectionDelegate рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рдкреНрд░рд╛рд╡рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдирд╛рдУрдВ рдХреЗ
рд╣реЛрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдХреА рд╢рд╛рдо рдХрд┐рддрд╛рдмреЛрдВ рдХреЗ рдкреАрдЫреЗ рдШреВрдорддреА рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдЖрд╡реЗрджрди рдХреЗ рдХрдВрдХрд╛рд▓ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдорд╛рд░реНрд▓рдЬрд╝реЛрди рдмреИрд▓реЗ рдХрд╛ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдерд╛ред рдЕрдЧрд▓рд╛, рдкреАрдбреАрдПрдл рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рдкрд╛рд░реНрд╕рд░ рдкреАрдбреАрдПрдл
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рджреВрддрд╛рд╡рд╛рд╕ рд╕реЗ рдорд┐рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдкреАрдбреАрдПрдл рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реИред рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╡рд┐рд╡рд░рдг
рдПрдбреЛрдм рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдореИрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ "
рдкреАрдбреАрдПрдл рд╕рдВрджрд░реНрдн рддреАрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг, рд╕рдВрд╕реНрдХрд░рдг 1.4 " рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдкреАрдбреАрдПрдл рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдореЗрд░реЗ рдмрд╣реБрдд рдХреЙрдиреНрдбреЛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рднрд╛рдЧреЛрдВ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рд╣рдо рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдирдП рдЯреБрдХрдбрд╝реЗ рдХреЛ рдмрдлрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдкреАрдбреАрдПрдл рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
stream
рдФрд░
endstream
рдореЗрдВ рдлрд╝реНрд░реЗрдо рдХреЗ рдЯреБрдХрдбрд╝реЗ рджреЗрдЦреЗрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА
zlib/inflate
рдорд╛рдзреНрдпрдо рд╕реЗ
zlib/inflate
ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реБрджреНрдз рдкрд╛рда рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕рдореЗрдВ рдЕрдкрдиреЗ рдмреИрдЪ рдирдВрдмрд░ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдкреАрдбреАрдПрдл рдорд╛рд░реНрдХрдЕрдк рднрд╛рд╖рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдпрджрд┐ рдирдВрдмрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ рдФрд░ рдЕрдЧрд▓реЗ рдмреНрд▓реЙрдХ рдкрд░ рдЬрд╛рдПрдВред
рдкрд╛рд░реНрд╕рд░ рдХреЗ рдореБрдЦреНрдп рдЪрд░рдг:
- рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдХреНрд╖рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдХ рд╣реИ, рдЬрд┐рд╕реЗ
stream\r\n
рдФрд░ endstream\r\n
рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдмрдлрд░ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдЯрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ zlib/inflate
рдорд╛рдзреНрдпрдо рд╕реЗ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд░рддреЗ zlib/inflate
ред - рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдЦрд╛рд▓реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдмреНрд▓реЙрдХ рдЯреЗрдХреНрд╕реНрдЯрд▓ рд╣реИред рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ
BT\r\n
(рдЖрд░рдВрдн рдкрд╛рда) рдФрд░ ET\r\n
(рдЕрдВрдд рдкрд╛рда) рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдвреВрдВрдврдиреЗ рд╣реЛрдВрдЧреЗред рд╣рдо рдРрд╕реЗ рд╕рднреА рдмреНрд▓реЙрдХ рдвреВрдВрдврддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред - рдЪрд░рдг 2 рдореЗрдВ рдкрд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░, рдЙрди рд╕рдмрд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдЬреЛ рдХреЛрд╖реНрдардХ рд╕реЗ рдШрд┐рд░реЗ рдирд╣реАрдВ рд╣реИрдВред рдХреЛрд╖реНрдардХ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рд╡рд╣ рд╕реЗрд╡рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
- рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкреАрдбреАрдПрдл рд╕реЗ рд╕рд╛рджрд╛ рдкрд╛рда рдирд┐рдХрд╛рд▓рд╛ рд╣реИред рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рддреАрди рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ: рдЖрд╡реЗрджрди рд╕рдВрдЦреНрдпрд╛ (рдмреИрдЪ рд╕рдВрдЦреНрдпрд╛), рд╕реНрдерд┐рддрд┐ рдФрд░ рджрд┐рдирд╛рдВрдХред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреЗрдЬ рд╣реЗрдбрд░ рдЕрднреА рднреА рднрд░ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд░реЗрдЦрд╛ рдПрдХ рдмреИрдЪ рд╕рдВрдЦреНрдпрд╛ (11 рдЕрдВрдХ) рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рддрд┐-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рджрд┐рдирд╛рдВрдХ-рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдЧреАред рд╣рдо рдЙрдиреНрд╣реЗрдВ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╣рдо рдПрдХ рдирдП рдмреИрдЪ рдирдВрдмрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рд┐рд▓рд╡рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рджреВрддрд╛рд╡рд╛рд╕ рдЗрд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдкрд╛рдардХреЛрдВ рдХреЛ рдЕрдкрдиреЗ рджрдо рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
ADDITION ред рд▓реЗрдЦ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡реЗрдм рд╕реЗрд╡рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдЬрд┐рд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЖрдк рд╕рд░рд▓ URL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреАрдбреАрдПрдл рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг "рдХрд┐рдЪрди" "рдХреНрд▓рд╛рдЙрдб рдкрд░" рд╣реЛрддрд╛ рд╣реИред рдбреЙред рдбреЙрдм рдиреЗ рд╣рд╛рд▓ рд╣реА
рдореЗрдВ Google App Engine рджреНрд╡рд╛рд░рд╛ Go Powered рдореЗрдВ рдореЗрд░рд╛ рд▓реЗрдЦ,
Restful Web Service рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЬреЛ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ рд╡реЗ рдЗрд╕ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди "рд╕рдорд╛рдкреНрдд" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреА рдУрд░ рдореБрдбрд╝реЗрдВ, рдФрд░ рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╕реЗ рдХреЛрдИ рдЬрд╡рд╛рдм рдЖрддрд╛ рд╣реИ, рддреЛ рд╡рд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдкреАрдбреАрдПрдл рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рд╢реБрд░реВ рдХрд░реЗрдВред
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЖрд╡реЗрджрди
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬреЛ рдкреАрдбреАрдПрдл рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдкрд░ рдЙрд╕рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реЗрдЧрд╛ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЗрд╕реЗ GNUstep рдФрд░ Clang рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Mac, рдФрд░ Windows рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ iOS рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдлрд╛рдЗрд▓реЗрдВ:
BatchPDFParser.m
(рдФрд░ .h
) - рдкреАрдбреАрдПрдл рдкрд╛рд░реНрд╕рд░редNSURLConnectionDirectDownload.m
( .h
) - рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред NSURLConnection
(рдЖрд░рдВрднреАрдХрд░рдг, рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ, рдИрд╡реЗрдВрдЯ рд▓реВрдк) рдХреЗ рд▓рд┐рдП рдПрдХ "рдбреЛрдЬрд░" рд╣реИредDirectDownloadDelegate.m
(( .h
) - NSURLConnection
рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЬреЛ рдбрд╛рдЙрдирд▓реЛрдб рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдХреЙрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИредViewController.m
рдХрд╛ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИред рдпрд╣ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмреАрдЪ рдХреА "рдкрд░рдд" рд╣реИред OSX рдФрд░ iOS MVC (рдореЙрдбрд▓-рд╡реНрдпреВ-рдХрдВрдЯреНрд░реЛрд▓рд░) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ "рдирд┐рдпрдВрддреНрд░рдХ" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рдмреАрдЪ рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реНрдЯрдмреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреВрд░реНрдг рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редmain-cli.m
- рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБред
BatchPDFParser.h
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
Batch
рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрд╡реЗрджрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдФрд░ рд╡рд░реНрдЧ
BatchPDFParser
, рдЬреЛ
BatchPDFParser
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ
findInPortion:needle:andAddTo:
рд╡рд┐рдзрд┐ (рд╡реИрд╕реЗ, рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рд╣реИ, рджреЗрдЦреЗрдВ
+
рдкрдВрдХреНрддрд┐
+
рд╢реБрд░реБрдЖрдд?)ред
@interface Batch: NSObject { NSString *batchNumber, *status, *date; } @property (atomic, copy) NSString* batchNumber, *status, *date; @end @interface BatchPDFParser: NSObject + (bool)findInPortion:(NSMutableData *)data needle:(NSString* const)needle andAddTo:(NSMutableArray*)list; @end
BatchPDFParser.m
рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕рд░ рдкреАрдбреАрдПрдл рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред
#import <Foundation/Foundation.h> #import "BatchPDFParser.h" #import "zlib.h" @implementation Batch @synthesize batchNumber, status, date; - (void) dealloc { [batchNumber release]; [status release]; [date release]; [super dealloc]; } @end @implementation BatchPDFParser
findInData:fromOffset:needle:
рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ (рдкреНрд░рдХрд╛рд░
strstr()
) рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рддреА рд╣реИред рдЦреЛрдЬ рдЖрджрд┐рдо рд╣реИ, рдФрд░ рдЗрд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ILC рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗред
+ (int) findInData:(NSMutableData *)data fromOffset:(size_t)offset needle:(char const * const)needle { int const needleSize = strlen(needle); char const* const bytes = [data mutableBytes]; int const bytesLength = [data length] - needleSize; for (int i = 0; i < bytesLength;) { char const* const current = memchr(bytes + i, needle[0], bytesLength - i); if (current == NULL) return -1; if (memcmp(current, needle, needleSize) == 0) return current - bytes; i = current - bytes + 1; } return -1; }
рдпрджрд┐ рдмреИрдЪ рдПрдХ рдмреИрдЪ рд╕рдВрдЦреНрдпрд╛ рд╣реИ: рддреЛ
isBatchNumber:number:
рд╡рд┐рдзрд┐
isBatchNumber:number:
:
+ (bool) isBatchNumber:(NSString*)number { long long const value = [number longLongValue]; return value >= 20000000000L && value < 29000000000L; }
findBatchNumberInChunk:needle:andAddTo:
BT
рдФрд░
ET
рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛
findBatchNumberInChunk:needle:andAddTo:
рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП
findBatchNumberInChunk:needle:andAddTo:
рдЦреЛрдЬред рдХреЛрд╖реНрдардХ рдореЗрдВ рдкрд╛рда рдЙрдирдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкрд╛рдпрд╛ рдХреЗ рдмреАрдЪ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╡реЗрджрди рд╕рдВрдЦреНрдпрд╛, рд╕реНрдерд┐рддрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рджрд┐рдирд╛рдВрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред
+ (bool) findBatchNumberInChunk:(char const*)chunk needle:(NSString*)needle andAddTo:(NSMutableArray*)list { enum { waitBT, waitText, insideText } state = waitBT; enum { waitBatchNumber, waitStatus, waitDate } batchParserState = waitBatchNumber; NSMutableString* line = [[NSMutableString alloc] init]; Batch* batch = nil; bool found = NO; while (*chunk) { if (state == waitBT) { if (chunk[0] == 'B' && chunk[1] == 'T') { state = waitText; [line deleteCharactersInRange:NSMakeRange(0, [line length])]; } } else if (state == waitText) { if (chunk[0] == '(') { state = insideText; } else if (chunk[0] == 'E' && chunk[1] == 'T') { if (batchParserState == waitBatchNumber) { if ([self isBatchNumber:line]) { [batch autorelease]; batch = [[Batch alloc] init]; batch.batchNumber = line; batchParserState = waitStatus; } } else if (batchParserState == waitStatus) { batch.status = line; batchParserState = waitDate; } else if (batchParserState == waitDate) { batch.date = line; batchParserState = waitBatchNumber; if ([batch.batchNumber isEqualToString:needle]) { NSString* pair = [NSString stringWithFormat:@"%@\n%@", batch.status, batch.date]; [list addObject:pair]; NSLog(@"Found match: '%@' '%@' '%@'", batch.batchNumber, batch.status, batch.date); found = YES; } } [line autorelease]; line = [[NSMutableString alloc] init]; state = waitBT; } } else if (state == insideText) { if (chunk[0] == ')') { state = waitText; } else { char const c[2] = { chunk[0], 0 }; [line appendString:[NSString stringWithUTF8String:&c[0]]]; } } chunk += 1; } [line release]; [batch release]; return found; }
рдЕрдм рдореБрдЦреНрдп рд╡рд┐рдзрд┐
findInPortion:needle:andAddTo:
рдпрд╣рд╛рдВ,
stream\r\n
рдФрд░
endstream\r\n
рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рдордЧреНрд░реА рдХреЛ
zlib/inflate
findBatchNumberInChunk:needle:andAddTo:
рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░
findBatchNumberInChunk:needle:andAddTo:
рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
+ (bool)findInPortion:(NSMutableData *)portion needle:(NSString*)needle andAddTo:(NSMutableArray*)list { static char const* const streamStartMarker = "stream\x0d\x0a"; static char const* const streamStopMarker = "endstream\x0d\x0a"; bool found = false; while (true) { int const beginPosition = [self findInData:portion fromOffset:0 needle:streamStartMarker]; if (beginPosition == -1) break; int const endPosition = [self findInData:portion fromOffset:beginPosition needle:streamStopMarker]; if (endPosition == -1) break; int const blockLength = endPosition + strlen(streamStopMarker) - beginPosition; char const* const zipped = [portion mutableBytes] + beginPosition + strlen(streamStartMarker); z_stream zstream; memset(&zstream, 0, sizeof(zstream)); int const zippedLength = blockLength - strlen(streamStartMarker) - strlen(streamStopMarker); zstream.avail_in = zippedLength; zstream.avail_out = zstream.avail_in * 10; zstream.next_in = (Bytef*)zipped; char* const unzipped = malloc(zstream.avail_out); zstream.next_out = (Bytef*)unzipped; int const zstatus = inflateInit(&zstream); if (zstatus == Z_OK) { int const inflateStatus = inflate(&zstream, Z_FINISH); if (inflateStatus >= 0) { found = found || [BatchPDFParser findBatchNumberInChunk:unzipped needle:needle andAddTo:list]; } else { NSLog(@"inflate() failed, error %d", inflateStatus); } } else { NSLog(@"Unable to initialize zlib, error %d", zstatus); } free(unzipped); inflateEnd(&zstream); int const cutLength = endPosition + strlen(streamStopMarker); [portion replaceBytesInRange:NSMakeRange(0, cutLength) withBytes:NULL length:0]; } return found; } @end
DirectDownloadViewDelegate.h
NSURLConnectionDelegate
рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИрдбрд░:
@protocol DirectDownloadViewDelegate<NSObject> - (void)setProgress: (float)progress; - (void)appendStatus: (NSString*)status; - (void)setCompleteDate: (NSString*)date; @end
DirectDownloadDelegate.h
рджрд░рдЕрд╕рд▓, рдбреЗрд▓реАрдЧреЗрдЯ рдЦреБрдж
NSURLConnectionDelegate
ред
#import "DirectDownloadViewDelegate.h" @interface DirectDownloadDelegate : NSObject { NSError *error; BOOL done; BOOL found; NSMutableData *receivedData; float expectedBytes, receivedBytes; id<DirectDownloadViewDelegate> viewDelegate; NSString* needle; } - (id) initWithNeedle:(NSString*)aNeedle andViewDelegate:(id<DirectDownloadViewDelegate>)aViewDelegate; @property (atomic, readonly, getter=isDone) BOOL done; @property (atomic, readonly, getter=isFound) BOOL found; @property (atomic, readonly) NSError *error; @end
DirectDownloadDelegate.m
рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
#import <Foundation/Foundation.h> #import "DirectDownloadDelegate.h" #import "BatchPDFParser.h" @implementation DirectDownloadDelegate @synthesize error, done, found;
рдирд┐рд░реНрдорд╛рддрд╛
initWithNeedle:andViewDelegate:
рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрдиреНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐,
DirectDownloadViewDelegate
рд╕рд╛рде
DirectDownloadViewDelegate
, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдХреНрд░реАрди рд░рд┐рдлреНрд░реЗрд╢ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ, рд╡реИрд╕реЗ, рд╣рдо рдкрд╣рд▓реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ,
(void) dealloc:
- (id) initWithNeedle:(NSString*)aNeedle andViewDelegate:(id<DirectDownloadViewDelegate>)aViewDelegate { viewDelegate = aViewDelegate; [viewDelegate retain]; needle = [[NSString alloc] initWithString:aNeedle]; receivedData = [[NSMutableData alloc] init]; expectedBytes = receivedBytes = 0.0; found = NO; return self; } - (void) dealloc { [error release]; [receivedData release]; [needle release]; [viewDelegate release]; [super dealloc]; }
connectionDidFinishLoading:
рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░
connectionDidFinishLoading:
рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
- (void) connectionDidFinishLoading:(NSURLConnection *)connection { done = YES; NSLog(@"Connection finished"); }
connection:didFailWithError:
рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдзрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред
- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)anError { error = [anError retain]; [self connectionDidFinishLoading:connection]; }
connection:didReceiveData:
рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЪреИрдирд▓ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдирдпрд╛ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдРрд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдмрдлрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рдкреНрд░рдЧрддрд┐ рд╕рдВрдХреЗрддрдХ (рдПрдХ рдЕрдиреНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐,
viewDelegate
рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкреАрдбреАрдПрдл рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдЬреЛ рдорд┐рд▓рд╛ рдерд╛ рдЙрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВред
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)someData { receivedBytes += [someData length]; [viewDelegate setProgress:(receivedBytes / expectedBytes)]; [receivedData appendData:someData]; NSMutableArray* list = [[NSMutableArray alloc] init]; bool foundInCurrentPortion = [BatchPDFParser findInPortion:receivedData needle:needle andAddTo:list]; for (id batch in list) { NSLog(@"[%@]", [batch stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]); [viewDelegate appendStatus:batch]; } [list release]; found = found || foundInCurrentPortion; }
рдЕрдВрддрд┐рдо
NSURLConnectionDelegate
рдкреНрд░рддрд┐рдирд┐рдзрд┐
NSURLConnectionDelegate
рдЬрд┐рд╕реЗ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реЗ
connection:didReceiveResponse:
рдХрд╣рд╛ рдЬрд╛рддрд╛
connection:didReceiveResponse:
рдЬрдм HTTP рд╣реЗрдбрд░ рдпреБрдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рддреЛ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рднрд╡рд┐рд╖реНрдп рдХреА рдлрд╝рд╛рдЗрд▓ рдХреА рд▓рдВрдмрд╛рдИ "рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ" рд╣реЗрдбрд░ рд╕реЗ рд▓реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рд╣рдо рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбрд╛рдЙрдирд▓реЛрдб рд╕рдВрдХреЗрддрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХреЗрдВред
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)someResponse { NSDictionary *headers = [someResponse allHeaderFields]; NSLog(@"[didReceiveResponse] response headers: %@", headers); if (headers) { if ([headers objectForKey: @"Content-Length"]) { NSLog(@"Content-Length: %@", [headers objectForKey: @"Content-Length"]); expectedBytes = [[headers objectForKey: @"Content-Length"] floatValue]; } else { NSLog(@"No Content-Length header found"); } } }
NSURLConnectionDirectDownload.h
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
donwloadAtURL:searching:viewingOn:
, рдЬрд┐рд╕реЗ рд╣рдо
NSURLConnection
рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдк рдореМрдЬреВрджрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдирдП рддрд░реАрдХреЛрдВ рдХреЛ "рдорд┐рдХреНрд╕" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдо
DirectDownload
рд╢реНрд░реЗрдгреА рдХреЛ
DirectDownload
рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
@interface NSURLConnection (DirectDownload) + (BOOL) downloadAtURL:(NSURL *)url searching:(NSString*)batchNumber viewingOn:(id)viewDelegate; @end
NSURLConnectionDirectDownload.m
рдЦреИрд░, рдкреАрдбреАрдПрдл рдбрд╛рдЙрдирд▓реЛрдб рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧред
donwloadAtURL:searching:viewingOn:
рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рддрдм рдпрд╣
NSRunLoop
рд▓реВрдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд▓реВрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдбрд╛рдЙрдирд▓реЛрдб рдЕрднреА рднреА GUI рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рдирд╣реАрдВ рд╣реИред рдпрд╣
viewDelegate
рдХреЗ "рдЪреЗрд╣рд░реЗ" рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
viewDelegate
рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
#import <Foundation/Foundation.h> #import "DirectDownloadDelegate.h" @implementation NSURLConnection (DirectDownload) + (BOOL) downloadAtURL:(NSURL *)url searching:(NSString*)batchNumber viewingOn:(id)viewDelegate { NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; DirectDownloadDelegate *delegate = [[[DirectDownloadDelegate alloc] initWithNeedle:batchNumber andViewDelegate:viewDelegate] autorelease]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:delegate]; [request release]; while ([delegate isDone] == NO) { [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; } if ([delegate isFound] != YES) { [viewDelegate appendStatus:@"This batch number is not found."]; NSLog(@"This batch number is not found."); } NSLog(@"PDF is processed"); [connection release]; NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss"; NSString* lastUpdateDate = [dateFormatter stringFromDate:[NSDate date]]; NSLog(@"Last update at: %@", lastUpdateDate); [viewDelegate setCompleteDate:lastUpdateDate]; [dateFormatter release]; NSError *error = [delegate error]; if (error != nil) { NSLog(@"Download error: %@", error); return NO; } return YES; } @end
ViewController.m
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдЯрдмреНрд╕ рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрд╛рдж рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред
#import <Foundation/Foundation.h> #import #define IBAction void
рдПрдХ рдЦрд╛рд▓реА
ViewController
рд╕реНрдЯрдм
ViewController
ред
@interface ViewController : NSObject <DirectDownloadViewDelegate> @end #import "NSURLConnectionDirectDownload.h"
рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрддрд╛ред
static char const* const pdf = "http://photos.state.gov/libraries/unitedkingdom/164203/cons-visa/admin_processing_dates.pdf";
рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ рдХрд╛ рдирдХрд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
@implementation ViewController
appendStatus:
рдкрд░реАрдХреНрд╖рдг рдХреЙрд▓рдмреИрдХ
appendStatus:
рдЕрдЧрд▓реЗ рдЕрдиреБрд░реЛрдз рдЕрджреНрдпрддрди рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдмрд╕ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣рдо рд╕реНрдХреНрд░реАрди рдлреЙрд░реНрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред
- (void) appendStatus:(NSString*)status { NSLog(@"appendStatus(): '%@'", [status stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]); // Some code is skipped here because not required for the command line mode. }
setProgress:
рдЯреЗрд╕реНрдЯ рдХреЙрд▓рдмреИрдХ
setProgress:
рдЬрдм рдбреЗрдЯрд╛ рдХреЗ рдЕрдЧрд▓реЗ рдмреИрдЪ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдбрд╛рдЙрдирд▓реЛрдб рдЗрдВрдбрд┐рдХреЗрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- (void) setProgress:(float)progress { // Some code is skipped here because not required for the command line mode. }
setCompleteDate:
рдкрд░реАрдХреНрд╖рдг рдХреЙрд▓рдмреИрдХ
setCompleteDate:
рдкреАрдбреАрдПрдл рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░
setCompleteDate:
рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдпрд╣рд╛рдВ, рдлрд┐рд░ рд╕реЗ, рд╣рдо рдмрд╕ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВред
- (void) setCompleteDate:(NSString*)date { NSLog(@"setCompleteDate(): '%@'", date); // Some code is skipped here because not required for the command line mode. }
рдЦреИрд░, рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ рдЬреЛ рд╕рдмрдХреБрдЫ рдЪрд▓рд╛рддреА рд╣реИ рд╡рд╣
updateBatchStatus:
рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдлреЙрд░реНрдо рдкрд░ рдПрдХ рдмрдЯрди рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рдЗрд╕реЗ
main()
рд╕реЗ рдкреБрдХрд╛рд░рд╛ рдЬрд╛рддрд╛ рд╣реИред
- (bool) updateBatchStatus:(NSString*)batchNumber { NSURL *url = [[[NSURL alloc] initWithString:[NSString stringWithCString:pdf encoding:NSASCIIStringEncoding]] autorelease]; return [NSURLConnection downloadAtURL:url searching:batchNumber viewingOn:self]; } @end
рдореБрдЦреНрдп-cli.m
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдЪрд▓рд╛рдПрдВред
#import <Foundation/Foundation.h> #import "DirectDownloadDelegate.h" @interface ViewController : NSObject <DirectDownloadViewDelegate> - (bool) updateBatchStatus:(NSString*)batchNumber; @end int main(int argc, char *argv[]) { @autoreleasepool { ViewController* viewController = [ViewController alloc]; [viewController updateBatchStatus:[NSString stringWithCString:argv[1] encoding:NSASCIIStringEncoding]]; [viewController release]; } return 0; }
рдЪрд▓реЛ рдпрд╣ рд╕рдм рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ?
рдореИрдХ рдХреЗ рд▓рд┐рдП
Makefile
:
files = \ ViewController.m \ BatchPDFParser.m \ NSURLConnectionDirectDownload.m \ DirectDownloadDelegate.m main-cli.m all: build run build: clang -o USVisaTest -DTESTING -framework Foundation -lz $(files) run: ./USVisaTest 20121456171
GNUmakefile
GNUstep рдХреЗ рд▓рд┐рдП
GNUmakefile
:
include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME = USVisa USVisa_OBJC_FILES = \ ../ViewController.m \ ../BatchPDFParser.m \ ../NSURLConnectionDirectDownload.m \ ../DirectDownloadDelegate.m \ ../main-cli.m USVisa_TOOL_LIBS = -lz ADDITIONAL_OBJCFLAGS = -DTESTING CC = clang include $(GNUSTEP_MAKEFILES)/tool.make run: ./obj/USVisa 20121456171
рд╣рдо рдЯрд╛рдЗрдк
make
ред рд╡рд┐рдВрдбреЛрдЬ:
This is gnustep-make 2.6.2. Type 'mmake print-gnustep-make-help' for help. Making all for tool USVisa... Creating obj/USVisa.obj/../... Compiling file ViewController.m ... Compiling file BatchPDFParser.m ... Compiling file NSURLConnectionDirectDownload.m ... Compiling file DirectDownloadDelegate.m ... Compiling file main-cli.m ... Linking tool USVisa ...
рдЖрдк рдЕрд╕рд▓реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
make run
рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рд╛:
This is gnustep-make 2.6.2. Type 'mmake print-gnustep-make-help' for help. ./obj/USVisa 20121456171 2012-06-19 17:27:11.472 USVisa[3420] [didReceiveResponse] response headers: {"Accept-Ranges" = bytes; "Cache-Control" = "max-age=600"; Connection = "keep-alive"; "Content-Length" = 2237242; "Content-Type" = "application/pdf"; Date = "Tue, 19 Jun 2012 16:27:11 GMT"; ETag = "\"4b2ca3e41de5ba4ae45670e776edfc3b:1339778351\""; "Last-Modified" = "Fri, 15 Jun 2012 16:06:15 GMT"; Server = Apache; } 2012-06-19 17:27:11.604 USVisa[3420] Content-Length: 2237242 2012-06-19 17:27:12.093 USVisa[3420] Found match: '20121456171' 'send passport & new travel itinerary' '14-Jun-12' 2012-06-19 17:27:12.104 USVisa[3420] [send passport & new travel itinerary\n14-Jun-12] 2012-06-19 17:27:12.111 USVisa[3420] appendStatus(): 'send passport & new travel itinerary\n14-Jun-12' 2012-06-19 17:27:13.769 USVisa[3420] Connection finished 2012-06-19 17:27:13.774 USVisa[3420] PDF is processed 2012-06-19 17:27:13.961 USVisa[3420] Last update at: 2012/06/19 16:27:13 2012-06-19 17:27:13.972 USVisa[3420] setCompleteDate(): '2012/06/19 16:27:13'
рддреЛ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдкреАрдбреАрдПрдл рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХрд░реЗрдВред рдЕрдм рдЖрдЗрдП iOS рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред рдХрд╛рд╢, рдХреЗрд╡рд▓ рдореИрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдПред
рд╕реНрдХреНрд░реАрди рд▓реЗрдЖрдЙрдЯ
рдореИрдВрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмреЗрд╣рдж рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛: рдПрдХ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдлреЙрд░реНрдо, рдПрдХ рдмрдЯрди рдФрд░ рдЕрдкрдбреЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ред

рдбрд╛рдЙрдирд▓реЛрдб рд╕рдВрдХреЗрддрдХ рдФрд░ рдХрддрд╛рдИ рд╕реНрд▓рд╛рдЗрдбрд░ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред
ViewController.h
рдЕрдм рдпрд╣ рдПрдХ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
TESTING
рдореИрдХреНрд░реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдореИрдВрдиреЗ рд╕рд░рд▓реАрдХреГрдд рдФрд░ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмреАрдЪ рдЕрд▓рдЧрд╛рд╡ рдХрд┐рдпрд╛ред
#import <Foundation/Foundation.h> #import "DirectDownloadViewDelegate.h" #ifdef TESTING #define IBAction void @interface ViewController : NSObject <DirectDownloadViewDelegate> @end #else #import "ViewController.h" #endif #import "NSURLConnectionDirectDownload.h" static char const* const pdf = "http://photos.state.gov/libraries/unitedkingdom/164203/cons-visa/admin_processing_dates.pdf"; @implementation ViewController #ifndef TESTING @synthesize updateProgressView, batchNumberTextField, statusTextView, lastUpdatedLabel, updateButton; #endif NSString* const PropertiesFilename = @"Properties"; NSString *pathInDocumentDirectory(NSString *fileName) { NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDirectory = [documentDirectories objectAtIndex:0]; return [documentDirectory stringByAppendingPathComponent:fileName]; }
рдЕрдм
appendStatus:
рдХреЛ рдХреЙрд▓рдмреИрдХ
appendStatus:
рди рдХреЗрд╡рд▓ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реНрдХреНрд░реАрди рдлреЙрд░реНрдо рднреА рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред
- (void) appendStatus:(NSString*)status { NSLog(@"appendStatus(): '%@'", [status stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]); #ifndef TESTING if ([[statusTextView text] length] == 0) [statusTextView setText:@"Status:\n"]; [statusTextView setText:[[statusTextView text] stringByAppendingString:status]]; [statusTextView setText:[[statusTextView text] stringByAppendingString:@"\n"]]; #endif }
setProcess:
рдбрд╛рдЙрдирд▓реЛрдб рдЗрдВрдбрд┐рдХреЗрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред
- (void) setProgress:(float)progress { #ifndef TESTING updateProgressView.progress = progress; #endif }
setCompleteDate:
рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдкрд╛рда рдмреЙрдХреНрд╕ рдореЗрдВ рдЕрджреНрдпрддрди рддрд┐рдерд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
- (void) setCompleteDate:(NSString*)date { NSLog(@"setCompleteDate(): '%@'", date); #ifndef TESTING [lastUpdatedLabel setText:date]; #endif } - (bool) updateBatchStatus:(NSString*)batchNumber { NSURL *url = [[[NSURL alloc] initWithString:[NSString stringWithCString:pdf encoding:NSASCIIStringEncoding]] autorelease]; return [NSURLConnection downloadAtURL:url searching:batchNumber viewingOn:self]; }
рдЕрдм рдХреБрдЫ рдЖрдИрдУрдПрд╕-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреБрдиреМрддрд┐рдпрд╛рдВред
viewDidLoad:
рд╡рд┐рдзрд┐
viewDidLoad:
рд╕реНрдХреНрд░реАрди рд▓реЛрдб рд╣реЛрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдХрддрд╛рдИ рд╕реНрд▓рд╛рдЗрдбрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рджреЛ рддрддреНрд╡реЛрдВ, рдПрдХ рдмрдЯрди рдФрд░ рдПрдХ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреА рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ Xcode рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд┐рд▓реНрдбрд░ рдлреЙрд░реНрдо рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
#ifndef TESTING - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. spinnerActivityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [spinnerActivityIndicatorView setColor:[UIColor blueColor]]; CGSize size = [[self view] frame].size; [spinnerActivityIndicatorView setCenter:CGPointMake(size.width / 2, size.height / 2 + 60)]; [self.view addSubview:spinnerActivityIndicatorView]; CGRect rect = [self.updateButton bounds]; rect.size.height += 10; [self.updateButton setBounds:rect]; rect = [self.batchNumberTextField bounds]; rect.size.height += 20; [self.batchNumberTextField setBounds:rect]; #ifdef DEBUG NSLog(@); #endif }
viewDidUnload
рдлреЙрд░реНрдо рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. }
рд╡рд┐рдзрд┐ shouldAutorotateToInterfaceOrientation:
рдЖрдк рдЙрдиреНрдореБрдЦреАрдХрд░рдг рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рдкреЛрд░реНрдЯреНрд░реЗрдЯ рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЙрд▓реНрдЯрд╛ рдирд╣реАрдВред - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } #endif
рдкреНрд░рдкрддреНрд░ рдкрд░ launchUpdate:
рдмрдЯрди Update
рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд░рддреА рд╣реИред рд╣рдо рдлрд┐рд░ рд╕реЗ рдЙрддреНрдкрд╛рджрди рд╕реВрдЪрдХ рдбрд╛рдЙрдирд▓реЛрдб рджрдмрд╛рдиреЗ, рдФрд░ рд╕реНрд▓рд╛рдЗрдбрд░ рдХрддрд╛рдИ рджреНрд╡рд╛рд░рд╛ рдмрдЯрди рддрд╛рд▓рд╛ред - (IBAction)launchUpdate:(id)sender { [self setProgress:0.0]; #ifndef TESTING [updateButton setEnabled: NO]; [updateProgressView setHidden:NO]; NSString* previousStatus = [statusTextView text]; [statusTextView setText:@""]; NSString* batchNumber = [batchNumberTextField text]; [spinnerActivityIndicatorView startAnimating]; BOOL const ok = [self updateBatchStatus:batchNumber]; [spinnerActivityIndicatorView stopAnimating]; if (!ok) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Internet connectivity problem" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alert show]; [alert release]; [statusTextView setText:previousStatus]; } [updateProgressView setHidden:YES]; [updateButton setEnabled: YES]; #endif }
рддрд░реАрдХреЗ saveProperties:
рдФрд░ loadProperties:
рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╢реБрд░реВ рдФрд░ рдЖрд╡реЗрджрди рдХреЗ рд╕реНрдЯреЙрдк рдкрд░ рдкреНрд░рдкрддреНрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рддред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдкреВрдЫрдирд╛ рд╣реЛрдЧрд╛ред - (void) saveProperties { NSDictionary *props = [[NSDictionary alloc] initWithObjectsAndKeys: #ifndef TESTING batchNumberTextField.text, @"batchNumberTextField", statusTextView.text, @"statusTextView", lastUpdatedLabel.text, @"lastUpdatedLabel", #endif nil]; for (NSString* key in props) { NSLog(@"%@ - %@", key, [props objectForKey:key]); } NSString* filename = pathInDocumentDirectory(PropertiesFilename); if ([props writeToFile:filename atomically:YES] == NO) NSLog(@"Unable to save properties into file [%@]", filename); [props release]; } - (void) loadProperties { NSDictionary *props = [[NSDictionary alloc] initWithContentsOfFile:pathInDocumentDirectory(PropertiesFilename)]; for (NSString* key in props) { NSLog(@"%@ - %@", key, [props objectForKey:key]); } #ifndef TESTING [batchNumberTextField setText:[props objectForKey:@"batchNumberTextField"]]; [statusTextView setText:[props objectForKey:@"statusTextView"]]; [lastUpdatedLabel setText:[props objectForKey:@"lastUpdatedLabel"]]; #endif [props release]; } - (IBAction)textFieldReturn:(id)sender { #ifndef TESTING [sender resignFirstResponder]; #endif } -(IBAction)backgroundTouched:(id)sender { #ifndef TESTING [batchNumberTextField resignFirstResponder]; #endif } @end
рд╡рд╣ рд╕рдм рд╣реИ!
рд╣рдордиреЗ рд╕рднреА рдореБрдЦреНрдп рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреАред рдЖрд╡реЗрджрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рд╣реИред рдЖрдк рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдорд╢реАрди рдореЗрдВ рднрд░рдиреЗ (рдПрдкреНрдкрд▓ рдбреЗрд╡рд▓рдкрд░ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╕реЗ рдЦрд░реАрджрдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛)ред- рдореИрдВ GitHub рдкрд░ рдкреВрд░рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ usvisa рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрддрд░реНрдЧрдд ред рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВредрдЖрдк рд╡реАрдбрд┐рдпреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:рдФрд░ рдЕрдзрд┐рдХ!
рдпрджрд┐ рдЖрдк рдПрдХ рд▓рд╛рдЦ рдкреНрд░рддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдмреЗрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╕реБрдВрджрд░ рдЖрдЗрдХрди рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП 57x57 рдФрд░ 114x114, рдФрд░ рдРрдкрд╕реНрдЯреЛрд░ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП 512x512 рдФрд░ 1024x1024редрд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЦреБрд▓реЗ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЖрдЗрдХрди рд▓реЗ рдЬрд╛рдПрдВрдЧреЗ - рдж рдЧреНрд░реЗрдЯ рд╕реАрд▓ рдСрдлрд╝ рдж рдпреВрдирд╛рдЗрдЯреЗрдб рд╕реНрдЯреЗрдЯреНрд╕ ред
рдкреБрдирд╢реНрдЪ
рдореИрдВрдиреЗ AppStore рд╕реЗрдВрд╕рд░ "рдЗрд╕реЗ рд▓рдкреЗрдЯрд╛" рдХреЗ рдмрд╛рдж рдЗрд╕ рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдирд┐рдпрдореЛрдВ рдореЗрдВ рдПрдХ рдЖрдЗрдЯрдо рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реБрдП, рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ HTML5 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд░ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╡реЗ рдЕрдм farting рдпрд╛ рдХреЗрд╡рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдПрдХ рд╕реНрдерд┐рд░ рддрд╕реНрд╡реАрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред HTML5 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд░ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЗрдВрд╕рд░ рдХреЗ рд╕рд╛рде рдмрд╣рд╕ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реНрдХреЛрд░ рдХрд┐рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ Apple рдмреЗрдХрд╛рд░ рдФрд░ рдХрдо-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд - рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рдЦреБрд╢реА рдорд┐рд▓реА рд╣реИ, рдФрд░ рдлрд┐рд▓рд╣рд╛рд▓ рдореИрдВ рджреЛ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВредрдкреА рдкреА рдПрд╕
рдЬрд▓реНрдж рд╣реА рд╡рд╣рд╛рдБ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП iOS рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рд╣реИ, рддреЛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдард╣рд░рдиреЗ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреЗрдЦрддреЗ ред