iOS 8 - рд╡рд┐рдЬреЗрдЯ



IOS 8 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдЯреБрдбреЗ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдЕрдм рддрдХ, рдПрдкреАрдЖрдИ рдЕрдВрдд рдореЗрдВ рдмрдВрдж рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдПрдХ рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрдИ рдХреНрд╖рдг рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЕрднреА рднреА рдЕрдкрдирд╛ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдПрдХ рдХрдЯ (рдиреЛрдЯ, рд╕реНрд╡рд┐рдлреНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реВрдВред






рдПрдХреНрд╕рдЯреЗрдВрд╢рди



IOS рдиреЗ рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреЗрд╢ рдХреА - рдПрдХреНрд╕рдЯреЗрдВрд╢рдиред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрд╛рд╣рд░ рдХреБрдЫ рд╕рд╛рдордЧреНрд░реА рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреНрд╡рд╛рдЗрдВрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ iOS рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ:



рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗрд╡рд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдмрдВрдбрд▓ рд╣реИред рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред



рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред рдпрд╣ рдПрдХ рдЖрд╡реЗрджрди рдирд╣реАрдВ рд╣реИ!

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдРрдк рдХреЛ рдРрдк рдЖрдИрдкреАрд╕реА (рдкрд╛рдЗрдк, рд╕реЙрдХреЗрдЯ, ...) рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд [UIApplication OpenURL] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: (рдЕрдм рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛ рджреЗрдЦреЗрдВ) рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрдк рд╕рдореВрд╣ ред



рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдорд╛рди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред



рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдБ рд╣реИ ред



рд╡рд┐рдЬреЗрдЯ



рд╡рд┐рдЬреЗрдЯ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЯреБрдбреЗ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕реВрдЪрдирд╛ рдХреЗрдВрджреНрд░ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯреБрдбреЗ рдЦреЛрд▓рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЬрд┐рд╕ рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ рд╡рд╣ рддреБрд░рдВрдд рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред



рд╡рд┐рдЬреЗрдЯ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЬреЗрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рдж рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдЕрднреА рднреА рдмреАрдЯрд╛ рд╣реИ)ред рд╡рд┐рдЬреЗрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗрдВрджреНрд░ рдореЗрдВ рдЯреБрдбреЗ рд╕реНрдХреНрд░реАрди рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╕рдВрдкрд╛рджрди рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдЬреЗрдЯ рдЬреЛрдбрд╝реЗрдВред



рдХрдВрдЯреЗрдирд░ рдФрд░ рд╡рд┐рдЬреЗрдЯ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдВрдмрдВрдз NotificationCenter.framework рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИред



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



рд╡рд┐рдЬреЗрдЯ рдХреЛ рд╣рдореЗрд╢рд╛ рдЕрдкрдбреЗрдЯ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП, iOS рдХрднреА-рдХрднреА рд╡рд┐рдЬреЗрдЯ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдЬрдм рд╡рд┐рдЬреЗрдЯ рдлрд┐рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрдЦрд┐рд░реА рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЕрд╕рд▓реА рд╡рд┐рдЬреЗрдЯ рд╡рд┐рдВрдбреЛред рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП, NCWidgetProviding рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

protocol NCWidgetProviding : NSObjectProtocol { // Called to allow the client to update its state prior to a snapshot being taken, or possibly other operations. // Clients should call the argument block when the work is complete, passing the appropriate 'NCUpdateResult'. @optional func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) // Clients wishing to customize the default margin insets can return their preferred values. // Clients that choose not to implement this method will receive the default margin insets. @optional func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets }
      
      





рдЬрдм рд╡рд┐рдЬреЗрдЯ рд╡рд┐рдЬреЗрдЯрд░реБрдк рдпреВрдЯрдбреЗрдЯрд╡рд┐рдЯ рдХреЙрдордкреНрд▓реЗрд╕рдореЗрдВрдЯрд╣реИрдВрдбрд▓рд░ рдХреЛ рд╡рд┐рдЬреЗрдЯ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЕрдкрдиреА рд╡рд┐рдВрдбреЛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рдкреВрд░реНрдгрд╣реИрдВрдбрд▓рд░ рдмреНрд▓реЙрдХ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:



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



рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗрдВрджреНрд░ рд╡рд┐рдЬреЗрдЯ рдХреА рдЪреМрдбрд╝рд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд┐рдЬреЗрдЯ рд╕реНрд╡рдпрдВ рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдКрдБрдЪрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЬреЗрдЯ рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ рдпрд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ UIViewController рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрддреНрддрд┐ред

 override func viewDidLoad() { super.viewDidLoad() self.preferredContentSize.height = 350 }
      
      





рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ:



рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд┐рдЬреЗрдЯ UI рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реАрдорд╛рдПрдБ рд╣реИрдВ:



рдЪреВрдВрдХрд┐ рдХреАрдмреЛрд░реНрдб рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрдВрдЯреЗрдирд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



рд╡рд┐рдЬреЗрдЯ рдмрд╛рддрдЪреАрдд



рд╡рд┐рдЬреЗрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, NCWidgetController рдХреНрд▓рд╛рд╕ рд╣реИред

рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╕реЗрдЯ рд╣реИрд╕рдВрддреЛрд╖: forWidgetWithBundleIdentifier: рдореЗрдердб, рдЬреЛ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдбреЗрдЯ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 NCWidgetController.widgetController().setHasContent(true, forWidgetWithBundleIdentifier: "com.e-legion.Traffic.Widget")
      
      





рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдЬреЗрдЯ рдФрд░ рдХрдВрдЯреЗрдирд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдХрдВрдЯреЗрдирд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди



рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, NSExtensionContext рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ UIViewController рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реА рдПрдХреНрд╕рдЯреЗрдВрд╢рдирдХреЙрдиреНрдЯреЗрдХреНрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИред

 class NSExtensionContext : NSObject { // The list of input NSExtensionItems associated with the context. If the context has no input items, this array will be empty. var inputItems: AnyObject[]! { get } // Signals the host to complete the app extension request with the supplied result items. The completion handler optionally contains any work which the extension may need to perform after the request has been completed, as a background-priority task. The `expired` parameter will be YES if the system decides to prematurely terminate a previous non-expiration invocation of the completionHandler. Note: calling this method will eventually dismiss the associated view controller. func completeRequestReturningItems(items: AnyObject[]!, completionHandler: ((Bool) -> Void)!) // Signals the host to cancel the app extension request, with the supplied error, which should be non-nil. The userInfo of the NSError will contain a key NSExtensionItemsAndErrorsKey which will have as its value a dictionary of NSExtensionItems and associated NSError instances. func cancelRequestWithError(error: NSError!) // Asks the host to open an URL on the extension's behalf func openURL(URL: NSURL!, completionHandler: ((Bool) -> Void)!) }
      
      





рдпрд╛рдиреА, рд╡рд┐рдЬреЗрдЯ рд╕реЗ рдХрдВрдЯреЗрдирд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕реНрдХреАрдо рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЯреНрд░реИрдлрд╝рд┐рдХ: //"), рдФрд░ рдЖрдкрдХреЛ рд╡рд┐рдЬреЗрдЯ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛

 self.extensionContext.openURL(NSURL(string: "traffic://"), completionHandler: nil)
      
      



ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, iOS рд╕реБрд░рдХреНрд╖рд╛ рдХрдВрдЯреЗрдирд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЛ рд░реЛрдХрддреА рд╣реИред рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рд▓рдХреНрд╖реНрдп рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдПрдХ рд╣реА рдРрдк рд╕рдореВрд╣ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред



рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдВрдЯрд╛рдЗрдЯреЗрд▓рдореЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рд╣реЛрдЧреА:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.application-groups</key> <array> <string>group.96GT47C53G.traffic</string> </array> </dict> </plist>
      
      





96GT47C53G рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЯреАрдо рдЖрдИрдбреА рд╣реИред рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, group.traffic, ...



рдЕрдм, рдХрдВрдЯреЗрдирд░рдлреНрд▓реЛрд░рд╕ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреАрдРрдкреНрд▓реАрдХреЗрд╢рди рдЧреНрд░реВрдкрдЗрдВрдЯреЗрдВрдЯрд┐рдлрд╛рдпрд░ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.96GT47C53G.traffic")
      
      





рдЙрджрд╛рд╣рд░рдг



рддреЛ, рдЖрдЗрдП рдПрдХ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рдЯреНрд░реИрдлрд┐рдХ рдЬрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдирдХреНрд╢рд╛ рджрд┐рдЦрд╛рдПрдЧрд╛ред рд╣рдо Yandex.Maps API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреНрд░реИрдлрд╝рд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред



рдПрдХ рддрд╕реНрд╡реАрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг: http://static-maps.yandex.ru/1.x/?ll=30.35,59.9690273&spn=0.01,0.2&size=300,250&l-map,trf

рджрд░рдЕрд╕рд▓, рд▓реЗрдЯ рдФрд░ рд▓реЛрди рдореИрдк рдХрд╛ рдХреЗрдВрджреНрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ spn рдбрд┐рдЧреНрд░реА рдореЗрдВ рдореИрдк рдбрд┐рд╕реНрдкреНрд▓реЗ рдПрд░рд┐рдпрд╛ рдХреА рд╕реАрдорд╛ рд╣реЛрддреА рд╣реИред



рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕ рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред



рдПрдХ рдХрдВрдЯреЗрдирд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ



рдХрдВрдЯреЗрдирд░ рдХрд╛ рдХрд╛рд░реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдПрдХ "рд╕реЗрдЯ рдлреНрд░реЗрдо" рдмрдЯрди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рджреГрд╢реНрдп рд╣реЛрдЧрд╛, рдЬреЛ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрдЧрд╛ред





рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ lat, lon, spn рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдореНрди рдХреЛрдб рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ:

 @IBAction func updateWidgetButtonTapped(sender : AnyObject) { var dict : NSMutableDictionary = NSMutableDictionary() dict["spn"] = self.mapView.region.span.latitudeDelta dict["lat"] = self.mapView.region.center.latitude dict["lon"] = self.mapView.region.center.longitude var dictUrl : NSURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.96GT47C53G.traffic").URLByAppendingPathComponent("settings.dict") dict.writeToFile(dictUrl.path, atomically: true) NCWidgetController.widgetController().setHasContent(true, forWidgetWithBundleIdentifier: "com.e-legion.Traffic.Widget") }
      
      





рд╡рд┐рдЬреЗрдЯ рдЬреЛрдбрд╝реЗрдВ



рд╡рд┐рдЬреЗрдЯ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдирдпрд╛ рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред

File-> New-> Target рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ iOS-> Application Extension-> Today Extension рдЪреБрдиреЗрдВред







рдЕрдм рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЕрднреА рдЕрдкрдиреЗ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╡рд┐рдЬреЗрдЯ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, TodayViewController рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 init(coder aDecoder: NSCoder!) { super.init(coder: aDecoder) }
      
      





рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ Info.plist рдлрд╝рд╛рдЗрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдЗрд╕рдореЗрдВ NSExtension рдХреБрдВрдЬреА рд╣реИ, рдЬреЛ рдХреБрдЫ рд╡рд┐рдЬреЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

 <key>NSExtension</key> <dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.widget-extension</string> </dict>
      
      





NSExtensionMainStoryboard рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХрд╛ рдирд╛рдо рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред NSExtensionPrincipalClass рдХреЗ рд╕рд╛рде NSExtensionMainStoryboard рдХреБрдВрдЬреА рдХреА рдЬрдЧрд╣ рдФрд░ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдИрдВ рдУрд░ рдмрджрд▓рд╛рд╡ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ widgetMarginInsetsForProposedMarginInsets рд╡рд┐рдзрд┐ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд UIEdgeInsets рд▓реМрдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред

  func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) }
      
      





рд╡рд┐рдЬреЗрдЯ рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдПрдХ рдЕрдкрдбреЗрдЯ рдореИрдк рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИред рдЕрдкрдбреЗрдЯ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╡рд┐рдЬреЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (viewWillLoad), рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдФрд░ рд╡рд┐рдЬреЗрдЯрдкреЗрд░рдлреЙрд░реНрдо рдпреВрдкреАрдбреЗрдЯрд╡реЗрдЯрдХрдВрдкреНрд▓реАрдореЗрдВрдЯрд╣реИрдВрдбрд▓рд░ рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ред рд╡рд┐рдЬреЗрдЯ рдХрдВрдЯреЗрдирд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред



рдирд┐рд╖реНрдХрд░реНрд╖



рд╡рд┐рдЬреЗрдЯ рдПрдХ рдмрд╣реБрдд рд╣реА рд╢рд╛рдВрдд рдЪреАрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд╕рдм рдХреБрдЫ рдирдо рд╣реИред рдХрднреА-рдХрднреА рдХреНрд░реИрд╢ рд╣реЛрддреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рд╡рд┐рдЬреЗрдЯ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЖрджрд┐ред рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рднреА рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреА рдХрдореА рд╣реИред рдЬрд▓реНрдж рд╣реА рдпрд╣ рд╕рдм рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╕рдореГрджреНрдз рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдЬреЛ рд╣реИ рдЙрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред



All Articles