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

рдЪреВрдВрдХрд┐ рд╕рднреА рдХреЗ рдкрд╛рд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЬрдВрдЧрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЦрд╛рд▓реА рд╕рдордп рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдмреАрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рддреИрдпрд╛рд░ рдХреА рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рд╛рдордЧреНрд░реА рдХреА рдкреБрд╖реНрдЯрд┐ рдХреАред рдкрдврд╝реЗрдВ, рд╕рдордЭреЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░реЗрдВред
рдЖрдЗрдП рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ Apple рдиреЗ рдЬреЛрдбрд╝реЗ рд╣реИрдВред
рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕рдореВрд╣рди
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред iOS 12 рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдРрд╕реА рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдЕрдиреБрдХреВрд▓рди, рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдФрд░ рд╕рдореВрд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕рдореВрд╣рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдзреНрдпрд╛рди рджреЗрдВ - рд╡реЗ рдХреЗрд╡рд▓ рддрднреА рдкреИрдХ рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рд╣реЛрдиреЗ рд▓рдЧреЗрдВрдЧреЗ рдЬрдм рд╕рднреА рд╕реВрдЪрдирд╛рдПрдВ рдПрдХ рд╕рдордп рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП iPhone 8 рдХреА рд╕реНрдХреНрд░реАрди рдкрд░ рдЖрдкрдХреЛ 5 рдпрд╛ рдЕрдзрд┐рдХ рд╕реВрдЪрдирд╛рдПрдВ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдореЗрдВ рд░рдЦрд╛ ред
NSExtensionContext API рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди
рдЕрдЧрд▓рд╛ рдЖрдЗрдЯрдо рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдП рдЕрд╡рд╕рд░ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ NSExtensionContext рд╡рд░реНрдЧред рд╡рд╣ рд╡рд┐рдЬреЗрдЯреНрд╕, рд╕рд┐рд░реА, рдореАрдбрд┐рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдЦреЗрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╣рдо рд╕реВрдЪрдирд╛рдУрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рджреЛ рддрд░реАрдХреЗ рдФрд░ рдПрдХ рдЪрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛:
var notificationActions: [UNNotificationAction] { get set }
рдЪрд░ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рджреМрд░рд╛рди рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
func dismissNotificationContentExtension() func performNotificationDefaultAction()
рд╡рд┐рдзрд┐рдпрд╛рдБ рдЖрд╡реЗрджрди рдХреЛ рдЦреЛрд▓рддреА рд╣реИрдВ рдпрд╛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЛ рдЫрд┐рдкрд╛рддреА рд╣реИрдВред
рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдерд╛рдиреАрдп рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
let actions = [ UNNotificationAction(identifier: "like-action", title: "Like", options: []), UNNotificationAction(identifier: "open-app", title: "Open App", options: []), UNNotificationAction(identifier: "dismiss", title: "Dismiss", options: []), ] let simpleCategory = UNNotificationCategory(identifier: "category-simple", actions: actions, intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([simpleCategory])
- рд╣рдо рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣реЗрдбрд░, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЖрд░рдВрднрдХ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкреВрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЖрд╡рд╢реНрдпрдХ рд╣реИред
- рд╣рдо рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╢реНрд░реЗрдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╢реНрд░реЗрдгреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдЕрдВрддрд┐рдо рдЪрд░рдг рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗрдВрджреНрд░ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЗрдгреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред
рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЕрдзрд┐рд╕реВрдЪрдирд╛ рднреЗрдЬ рджреЗрдЧреА рддрд╛рдХрд┐ рд╣рдо рдЖрд╡реЗрджрди рдХреЛ рдХрдо рдХрд░ рд╕рдХреЗрдВ рдпрд╛ рдлреЛрди рдХреЛ рд▓реЙрдХ рдХрд░ рд╕рдХреЗрдВ:
UNUserNotificationCenter.current().getNotificationSettings { (settings) in guard settings.authorizationStatus == .authorized else { return } let content = UNMutableNotificationContent() content.title = "Cat Title" content.subtitle = "Cat Subtitle" content.body = "Cat Body" content.sound = .default content.categoryIdentifier = "category-simple" let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false) let uuid = UUID().uuidString let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger) UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in }) }
- рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╣рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИред
- рд╣рдо рдПрдХ рд╣реЗрдбрд┐рдВрдЧ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рд╢реНрд░реЗрдгреА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, "рд╢реНрд░реЗрдгреА-рд╕рд░рд▓"ред
- 3 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рдЯреНрд░рд┐рдЧрд░ рдЯреНрд░рд┐рдЧрд░ рд╕реЗрдЯ рдХрд░реЗрдВред
- рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдпреВрдпреВрдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЛ рд░рджреНрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
- рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реВрдЪрдирд╛ рдХреЗрдВрджреНрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдирдИ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕рд╛рдордЧреНрд░реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рджрд░реНрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдПрдХ Plist рдлрд╝рд╛рдЗрд▓, ViewController рдФрд░ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдкреНрд▓рд┐рд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
- UNNotificationExtensionCategory - рдЙрд╕ рд╢реНрд░реЗрдгреА рдХрд╛ рдирд╛рдо рдЬрд┐рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, "рд╢реНрд░реЗрдгреА-рд╕рд░рд▓" рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
- UNNotificationExtensionInitialContentSizeRatio - рдЗрд╕рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреА рдКрдВрдЪрд╛рдИ рдХрд╛ рдЕрдиреБрдкрд╛рддред рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
- UNNotificationExtensionUserInteractionEnabled - рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдпрд╛ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рджрд┐рд▓ рд╡рд╛рд▓рд╛ рдмрдЯрди рд╣реЛрдЧрд╛ред
- UNNotificationExtensionDefaultContentHidden - рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реАрд░реНрд╖рдХ рдФрд░ UIButton рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UIImageView, UILabel рдмрдирд╛рдПрдВред
рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ, рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЦреЛрд▓рдиреЗ рдФрд░ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВ:
func openApp() { extensionContext?.performNotificationDefaultAction() } func dismissNotification() { extensionContext?.dismissNotificationContentExtension() }
рд╣рдо UNNotificationContentExtension рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдкрд╣рд▓рд╛ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
func didReceive(_ notification: UNNotification) { self.notificationTitleLabel.text = notification.request.content.body }
рджреВрд╕рд░реЗ рдХреЛ UNNotificationAction рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕реА рд╡рд┐рдзрд┐ рдореЗрдВ, рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреНрд╕ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рдирдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) { switch response.actionIdentifier { case "like-action": let actions = [ UNNotificationAction(identifier: "1-star", title: "тШЕ", options: []), UNNotificationAction(identifier: "2-star", title: "тШЕ тШЕ", options: []), UNNotificationAction(identifier: "3-star", title: "тШЕ тШЕ тШЕ", options: []), ] extensionContext?.notificationActions = actions case "open-app": openApp() default: dismissNotification() } }
рд╣рд╛рд░реНрдЯ рдЯреЗрдк рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ IBAction рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ:
@IBAction func defaultButtonTapped(_ sender: UIButton) { openApp() }
рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ:
- UIButton рд╕реЗ рдкреНрд░реЗрд╕рд┐рдВрдЧ рдкреНрд░реЛрд╕реЗрд╕ рдХреА рдЬрд╛рддреА рд╣реИред
- UNNotificationAction рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд╡рд╛рдЪрд╛рд░ рдЖрдкрдХреЛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдПрдХ рдирдпрд╛ рдореЗрдиреВ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрдм рдЖрдк рдЙрд╕ рдкрд░ рдЯреИрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реАрдзреЗ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЙрди рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рддреЗ рд╕рдордп рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ -
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound, .providesAppNotificationSettings])
рджреВрд╕рд░реЗ, рд╣рдо userNotificationCenter (_: openSettingsFor :) рд╡рд┐рдзрд┐ рдХреЛ UNUserNotificationCenterDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
extension AppDelegate: UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { openSettings() } func openSettings() { let storyboard = UIStoryboard(name: "Settings", bundle: nil) let settings = storyboard.instantiateViewController(withIdentifier: "Settings") window?.rootViewController = settings } }
рдЕрдирдВрддрд┐рдо рд╕реВрдЪрдирд╛рдПрдБ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдореЗрд╢рд╛ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рд╕реЗ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЪреБрдирд╛рд╡ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рд╡рд╣ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ред рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, Apple рдЕрдирдВрддрд┐рдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрдирдВрддрд┐рдо ред рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдзрд┐рдХрд╛рд░
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .provisional])
рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрд╕реЗ рдкрд░реЗрд╢рд╛рди рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрд╡реЗрджрди рдХреЛ рддрдерд╛рдХрдерд┐рдд рдЬреЗрд▓ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ ред рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдзреНрд╡рдирд┐рдпрд╛рдБ, рдмреИрдЬ рдЕрдХреНрд╖рдо рд╣реИрдВ; рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рд╕реВрдЪрдирд╛ рдХреЗрдВрджреНрд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдмрдВрдж рд╕реНрдХреНрд░реАрди рдкрд░ рдпрд╛ рдмреИрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗред
рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдЯрди рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдЧрд╛ рдпрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ рдЖрдкрдХреА рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХреГрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛:
рдЧрдВрднреАрд░ рдЕрд▓рд░реНрдЯ
рдирд╡реАрдирддрдо рдмрджрд▓рд╛рд╡ рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ - рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдЕрд▓рд░реНрдЯреНрд╕ ред рдпреЗ рд╕реВрдЪрдирд╛рдПрдВ рдЖрдкрдХреЗ рдлрд╝реЛрди рдХреА рд╕реЗрдЯрд┐рдВрдЧ, рдореНрдпреВрдЯ рд╕рд╛рдЙрдВрдб рдпрд╛ рдбрд┐рд╕реНрдЯрд░реНрдм рдореЛрдб рдХреЛ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред рдРрдкреНрдкрд▓ рдЙрдиреНрд╣реЗрдВ рдЪрд┐рдХрд┐рддреНрд╕рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рд╡рд╛рдЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рдЪреАрдиреА рдХрд╛ рд╕реНрддрд░ рддреЗрдЬреА рд╕реЗ рдХреВрдж рдЧрдпрд╛), рд╕рд╛рде рд╣реА рдШрд░ рдпрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░рд┐рддреНрд░ рд╣реЛрддрд╛ рд╣реИ:
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдЗрдХрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Apple рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреА рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрд▓реЛрдЪрдирд╛рддреНрдордХ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .criticalAlert])
рдФрд░ рд╣рдо рд╕реВрдЪрдирд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ:
let content = UNMutableNotificationContent() content.title = "WARNING" content.body = "Storm alert" content.categoryIdentifier = "storm-alert" content.sound = UNNotificationSound.defaultCriticalSound(withAudioVolume: 1.0)
рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдЕрд▓рд░реНрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрд╕ рд╡реЙрд▓реНрдпреВрдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рдПрдЧреАред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдирдИ рдЕрдзрд┐рд╕реВрдЪрдирд╛рдПрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдЧреАред рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЦреБрдж рдХреЛ рдЬреАрдердм рдкрд░ рдХреЛрдб рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдПрдВ рдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВред
рдЖрдк iOS 10 рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛рдУрдВ рдкрд░ рдПрдХ рдИ-рд▓реАрдЬрди рд▓реЗрдЦ рдпрд╛ WWDC рдХреА рд░рд┐рдкреЛрд░реНрдЯ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рд╕реВрдЪрдирд╛рдУрдВ рдореЗрдВ рдирдпрд╛ рдХреНрдпрд╛ рд╣реИред рд╣рдо 28 рд╕рд┐рддрдВрдмрд░ рдХреЛ рдорд╛рд╕реНрдХреЛ рдореЗрдВ MBLT DEV 2018 рдореЗрдВ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред
рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рджрд┐рди рдФрд░ рдлрд░ рд╕реАрд▓ рд╣реИ ^ _ ^
UPD: рдЖрд▓реЗрдЦ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕рдореВрд╣рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдмрд░ рдореЗрдВ рд╣реИред