Всичко, което винаги сте искали да знаете за известията в iOS

Доста малки предупреждения ..?

Известията са начин да информират потребителите, когато новите данни станат достъпни за техните приложения, дори когато приложението не работи на преден план.

Например приложението за съобщения може да уведоми потребителя, когато е пристигнало ново съобщение, а приложението за календар може да информира потребителя за предстояща среща.

С пускането на iOS-10, Apple представи чисто нови рамки за поддържане на известия, било то локални или отдалечени.Тази версия беше фокусирана върху персонализирани известия .

Без да губим време, нека просто бързо да преминем към подробностите.

Видове известия

Можем широко да класифицираме известията в две категории:

  • Локални известия - приложението конфигурира подробно известията локално и ги предава на системата. След това системата обработва доставката на известието, когато приложението не е на преден план.
  • Отдалечени известия - използвате един от сървърите на вашата компания, за да изпращате данни към потребителски устройства чрез услугата Apple Push Notification (APN).

По-долу в статията ще видим как можем да се запознаем и с двата типа известия. Нека първо започнем с въведение в тази нова рамка за уведомяване, която можем да използваме за нашата кауза.

Какво е новото в iOS-10 за известия?

С пускането на iOS-10 , Apple представи две нови рамки за обработка на известия:

  • User Notifications Framework - управлява както локални, така и отдалечени известия.
  • User Notifications UI Framework - персонализира външния вид на интерфейса за уведомяване на системата.

Ще използваме тези две рамки и някои специфични за платформата API за конфигуриране на нашите известия.

Заедно с рамките, разширението на приложението Notification serviceбеше представен също така, който ви позволява да модифицирате съдържанието на отдалечени известия, преди те да бъдат доставени.

Apple също така позволява персонализиране на потребителския интерфейс на вашето известие чрез разширението за съдържание за известия .

Прекалено много ли е за запомняне? Да ... със сигурност е така. Но не се притеснявайте. Ще видим всичко стъпка по стъпка заедно със съответния код. Спокойно. ?

Първи неща първо - конфигурирайте го!

Поискайте разрешение

За да накараме нашето приложение да уведоми потребителя за каквото и да било, трябва да знаем дали човекът, който го използва, всъщност иска това на първо място. Mayby, не харесват ли телефонът им да звъни и да показва предупреждения през цялото време? или може би всъщност искат актуализациите, но не и този дразнещ звук ... ъъъ! ☠️

И така, на първо място трябва да получим разрешение от потребителя, който ще уведомим. И това е доста просто - само два реда код и готово:

Трябва да напишете този код в AppDelegate’sметод - application:didFinishLaunchingWithOptions:преди да се върнете от него.

Моля, обърнете внимание: Тъй като системата запазва отговора на потребителя, извикванията на requestAuthorization(options:completionHandler:)метода по време на следващите стартирания не подканват потребителя отново.

Добавяне на категории и действия - Известия за действие

Потребителската рамка за известия поддържа добавяне на категории и действия към известията.

Категории - Дефинирайте видовете известия, които приложението поддържа и съобщавайте на системата как искаме да бъде представено известие.

Действия - Всяка категория може да има до четири действия, свързани с нея. Действията са основно персонализирани бутони, които с докосване отхвърлят интерфейса за уведомяване и препращат избраното действие към приложението за незабавна работа.

Добре! И какво означава това .. ??? Някой код може да ви помогне да разберете по-добре:

В горния код просто създадохме категория, наречена ПОКАНАс четири различни действия - remindLater , приемам , упадък , икоментар .

Категориите и действията се идентифицират по уникален начин чрез техните идентификатори. Винаги, когато се доставя известие с категория, системата представя известието заедно с всички действия, свързани с тази категория, след като потребителят я разшири. Ето как ще изглежда:?

Дефинирайте всички категории и действия точно по-долу, където сте конфигурирали известия в application:didFinishLaunchingWithOptions:метода.

Включете идентификатора на категорията (напр. ПОКАНА), когато планирате известието си, било то локално или отдалечено. Ще видим как да го направим в следващия раздел.

Планиране на местни известия

След като приключихме с конфигурирането на нашите известия, нека видим как всъщност да насрочите едно от приложението .

Планирането на локално известие изисква само три прости стъпки:

  1. Подгответе съдържанието
  2. Добавяне на спусък - когато известието трябва да бъде задействано
  3. Планирайте го за доставка

Нека да продължим с кода бързо, за да не се бъркаме с всичко, което се случва тук. LOL?

В горния код, заедно с другото съдържание, ние също предоставихме categoryIdentifierза поддръжка на действащи известия. В случай че не го направим, системата ще възприеме поведението си по подразбиране.

Това е. Това е всичко, което е необходимо. И да, определено работи ... хехехе.? Опитайте, преди да продължите напред. Можете да изтеглите пробата от тук.

Моля, обърнете внимание : Приложенията се държат по различен начин във фонов режим и състояния на преден план, когато се доставя известие.

  1. Приложението не се изпълнява / Приложение във фонов режим - системата показва локални известия директно на потребителя. Не получаваме обратно обаждане в приложението за това.
  2. Приложение в преден план - системата дава на приложението възможност да обработва известието вътрешно. По подразбиране системата заглушава известията за приложения на преден план .

Когато приложението е на преден план, докато известието се доставя, получаваме метода за обратно извикване UNUserNotificationCenterDelegate's- userNotificationCenter(_:willPresent:withCompletionHandler:)където можете да решите дали да обработвате известието тихо или да алармирате потребителя за това.

Не забравяйте да се съобразите AppDelegateс UNUserNotificationCenterDelegateпротокола и да го зададете като делегат на UNUserNotificationCenterсподелен обект в application:didFinishLaunchingWithOptions:.

let center = UNUserNotificationCenter.current()
center.delegate = self

Засега приключихме с местните известия. Нека да преминем към това как можем да планираме известие извън нашето приложение. Преди това нека да разгледаме как да отговорим на персонализираните действия.

Отговаряне на действия на потребителя

Конфигуриране на известията? ✔ Планиране на известия? ✔

Какво ще кажете за подслушване на известие или някакво персонализирано действие в известието? Къде ще доведе? И в двата случая системата уведомява приложението по избор на потребителя.

Всеки път, когато потребителят извърши някакво действие в известието, отговорът се изпраща до UNUserNotificationCenterDelegate'sметод - userNotificationCenter(_:didReceive:withCompletionHandler:), където можем да осигурим обработка, специфична за всяко действие.

Моля, обърнете внимание: ако приложението не работи, когато е получен отговор, системата стартира приложението във фонов режим, за да обработи отговора.

Отдалечени известия

Push известията или отдалечените известия, без значение как ги наричаме, са едни от най-често използваните с много и много случаи на употреба.

Независимо дали става въпрос за социални медии или календар или някое от помощните приложения, можем да ги видим почти навсякъде. От приложения за новини, които ни уведомяват за най-новото съдържание, до самия Medium, който ни предупреждава за най-новите публикувани статии.

Някога да се чудите как изобщо правят това? Локални известия ?? Може да е ... прави същото нещо - нали? Може би можем да направим още някаква конфигурация в самата локална и да работим?

Но Medium, например, нямат достъп до приложението на нашето лично устройство, така че как може да планира известия? Точно! Не може. Това е нещо различно и нещо повече от местните.

Добре, какво ще кажете да изпратим известието от някакъв момент и да го покажем в друг момент - това ще отговори ли на нашия въпрос? Да, със сигурност ще го направи. Но как да го направя? Това са отдалечени известия .

Точно това правят. Това е характеристиката, която е решила ГОЛЕМИЯ ПРОБЛЕМ на „Поддържане на актуалност“.

Терминология

  • APN - централният елемент на функцията за отдалечени известия. Това е услуга в облак, която позволява на одобрени приложения на трети страни, инсталирани на устройства на Apple, да изпращат push известия от отдалечен сървър на потребители по сигурна връзка.
  • Токен на устройството - специфичен за приложение маркер, който е уникален в световен мащаб и идентифицира една комбинация приложение-устройство. Той позволява комуникация между доставчика, APN и устройството.
  • Доставчик - сървър, който всъщност изпраща отдалеченото известие, включително маркера на устройството и друга информация до APN.

Важна забележка : Никога не кеширайте маркери на устройства във вашето приложение. Вместо това ги вземете от системата, когато имате нужда от тях.

APN издава нов маркер на устройството на вашето приложение, когато се случат определени събития. Гарантирано е, че маркерът на устройството е различен, например, когато потребител възстановява устройство от резервно копие, когато потребителят инсталира приложението ви на ново устройство и когато потребителят преинсталира операционната система.

Когато се опитате да извлечете маркер на устройство, но той не се е променил, методът за извличане се връща бързо.

Моля, обърнете внимание: Възможността на APN да доставят отдалечени известия до неработещо приложение изисква приложението да е стартирано поне веднъж.

Как всъщност работи

По-долу е дадено малко и бързо обяснение как всички горепосочени технологии работят заедно в синхрон за завършване на работния процес на отдалечените известия.

  1. Приложениерегистрира с APN
  2. APN изпраща маркера на устройството до устройство с, след което го изпраща до приложението
  3. Приложението изпраща този маркер на устройството до доставчика
  4. Доставчикът изпраща известия с този маркер на устройството до APN, които след това го изпраща на устройство, което след това го изпраща на приложението .

Ако известие за вашето приложение пристигне с включено устройство, но когато приложението не работи, системата все още може да покаже известието. Ако устройството е изключено, когато APN изпраща известие, APN задържа известието и опитва отново по-късно.

Справете се с него в приложението

Сега, когато сме наясно какво представляват отдалечените известия и какви неща са необходими, за да работят, нека сега преминем към това как можем да накараме нашето приложение да ги поддържа. Защото нищо не се случва само по себе си? Трябва да направим някои конфигурации, за да работят.

За да можем да обработваме отдалечени известия, нашето приложение трябва:

  1. Активирайте отдалечените известия във възможностите - само с едно щракване и сте готови с тази стъпка. В раздела Възможности на нашия проект Xcode активирайте опцията Push Notifications . Уверете се, че Push Notifications е добавен към идентификатора на приложението, който използваме за проекта.

2. Регистрирайте се в услугата Apple Push Notification (APN) и получете маркер на устройство за конкретно приложение

Искането за регистрация с APN е бързо и лесно. Просто добавете кода по-долу в UIApplicationDelegate’sметод - application:didFinishLaunchingWithOptions:преди да се върнете от него.

UIApplication.shared.registerForRemoteNotifications()

Сега има две възможности: или се регистрираме успешно, или процесът се проваля.

На успешна регистрация, с имена на праща конкретно приложение Токен устройство към устройството в UIApplicationDelegate’sметодологическа application:didRegisterForRemoteNotificationsWithDeviceToken:.

В случай на неизправност, ние получаваме обратно обаждане по UIApplicationDelegate’sметод— application:didFailToRegisterForRemoteNotificationsWithError:.

3. Изпратете маркера на устройството до сървъра на доставчика на уведомления

Към момента получихме маркера на устройството от APN . Сега трябва да изпратим този токен на нашия доставчик, който ще го използва, докато изпраща всички известия към нашето устройство.

Тъй като нямаме доставчик, засега можем да използваме Easy APNs Provider за тестване на нашите push известия. По-надолу ще видим как точно можем да се възползваме от този инструмент.

Засега просто го изтеглете и инсталирайте на вашия Mac.

4. Внедрете поддръжка за работа с входящи отдалечени известия

Разполагаме с нашия токен за устройство и нашият доставчик също знае за него. След това Доставчикът ще изпрати известието, включително този маркер и друга информация в него, и ние ще го получим на нашето устройство.

Сега какво? Какво ще се случи, когато пристигне? Как ще се появи на устройството? Какво ще се случи, когато го почукаме? Какво ще кажете за всички действия, които сме конфигурирали по-рано? Можем ли да ги вземем тук?

Твърде много въпроси ❓❓❓ Е, не се притеснявайте. Ще имаме отговори на всички тях един по един.

Какво ще се случи, когато пристигне? Ще получим обратно извикване в UIApplicationDelegate’sметод— application(_:didReceiveRemoteNotification:fetchCompletionHandler:). Той съобщава на приложението, че е пристигнало отдалечено известие, което показва, че има данни за извличане.

Как ще се появи на устройството? Той ще се появи със стандартния интерфейс за уведомяване. Ако полезният товар на известието е конфигуриран с категория , то ще се покаже като действащо известие с всички действия, свързани с тази категория. Ще обсъдим полезния товар в следващия раздел.

Какво ще се случи, когато го почукаме? Същото като местните известия. UNUserNotificationCenterDelegate'sметод - userNotificationCenter(_:didReceive:withCompletionHandler:)извиква се с обекта за отговор.

Справете се с Доставчика

Покрихме повечето неща, от които се нуждаем, за да интегрираме push известията в нашето приложение. Въпреки че знаем как да боравим с тях в приложението, все още не разполагаме с тях при доставчика.

Ние имаме доставчика. Той знае какъв маркер на устройството да използва, но само това няма да изведе известие на нашето устройство с някои заглавия и други подробности. Нито ще направи нито едно от действията да се появи.

И така, избутването на известия от доставчика изисква следните елементи:

  1. A знак устройство
  2. APN сертификат - можем да го получим от акаунта на разработчика
  3. Полезен товар - всякакви персонализирани данни, които искате да изпратите до приложението си, и включва информация за това как системата трябва да уведомява потребителя. Това е просто JSON речник с няколко двойки ключови стойности. Илюстрацията по-долу може да ви помогне да я разберете по-добре.

Нека видим какво има в този речник на JSON :

  1. apsречник- най-важният. Съдържа дефинирани от Apple ключове и се използва за определяне как системата, която получава известието, трябва да предупреждава потребителя.
  2. тревогаречник- това е по-скоро обяснителен елемент. Предоставя съдържанието на известието.
  3. категория - за действащи уведомления. Всички действия, свързани с тази категория, ще бъдат налични в известията.
  4. съдържание на разположение- За да поддържате известие за актуализация на заден план, задайте този ключ на 1.
  5. променливо съдържание- За да активирате модификацията на известието чрез разширението за приложения за уведомяване , задайте го на 1.

Тук можете да прочетете повече за персонализиране на полезния товар според вашите изисквания. Това е препратка към ключовете, които можем да добавим в речника на aps

Разширение на приложението за уведомяване

На този етап знаем какви дистанционни известияса, как работят, какво всичко ни е необходимо, за да ги накараме да работят - почти всичко! Тъй като току-що ги накарахме да работят перфектно✌️.

Сега въпросът е какво, ако искаме да модифицираме някакво съдържание в известието, получено от доставчика, преди да го представим на устройството? Ами ако известието съдържа връзка към изображение, което трябва да изтеглим, преди да го доставим на потребителя? Можем ли да направим това с това, което вече знаем? Нямаме достъп до доставчика ... и как ще го направим?

Всъщност не можем. Не можем да променим това, което получаваме, но определено можем да променим това, което представяме.

В това се състои разширението на приложението за уведомяване - промяна на съдържанието на отдалечени известия преди доставка. Толкова е просто, колкото изглежда. Няма измислен код, нищо. Наистина е много просто.

Добавяне на разширение на услугата за уведомяване към проекта

Разширенията в xcode проект се добавят като цел. Изберете File - New - Target - Notification Service Extension.

Предпоставки

Преди да започнем да модифицираме съдържанието, има някои ограничения относно това кога е разрешено да се модифицира съдържанието.

Съдържанието може да бъде модифицирано само ако:

  • Отдалеченото известие е конфигурирано да показва предупреждение.
  • Речникът на aps на отдалеченото известие включва ключ с променливо съдържание със стойността, зададена на 1.

Не можем да модифицираме тихи известия или тези, които възпроизвеждат само звук или значка на иконата на приложението.

Така че, за да се поддържат каквито и да е промени в съдържанието на известията, тези условия трябва да бъдат изпълнени.

Промяна на съдържанието

Целта на разширението на услугата за уведомяване по подразбиране, предоставена от Xcode, съдържа подклас на UNNotificationServiceExtensionкласа, който да модифицираме.

Той съдържа два метода:

  1. didReceive(_:withContentHandler:)- направете всички необходими промени в известието и уведомете системата, когато приключите. Този метод има ограничен период от време (около 30 секунди), за да изпълни задачата си и да изпълни предоставения блок за завършване.
  2. serviceExtensionTimeWillExpire()- Казва ни, че удължаването е на път да бъде прекратено. Дайте ни последен шанс да изпратим нашите промени. Ако не актуализираме съдържанието на известието, преди да изтече времето, системата показва оригиналното съдържание.

Нека разгледаме един пример. Ще променим тялото в полезния товар в Code Snippet 7 на „ Address: Sea Shells Apartments, Mumbai “.

Цялото изпълнение по подразбиране и на двата метода се осигурява от самото разширение. Просто трябва да направим промените, които искаме, като в ред 8 в горния кодов фрагмент. Засега само един ред код. По същия начин можете да модифицирате други полета според вашите изисквания.

Разширение за съдържание на известия

Наличието на привлекателен потребителски интерфейс винаги е по-добър от обикновен потребителски интерфейс по подразбиране. Добавянето на някои цветове и някои красиви шрифтове никога не е лоша идея. Ще направим същото с нашите известия, за да изглеждат Уау !?

И и и ... Apple отново е тук, за да ни спаси. Това е разширение за известие . Това представя персонализиран интерфейс за доставен локаленилиотдалечено известяване.

Добавяне на разширение за съдържание на известия към проекта

Мисля, че вече знаем как да направим това. Нали? Ще преминем към същото, което направихме за добавяне на разширение за услуга за уведомяване . Изберете File - New - Target - Notification Content Extension.

Добавяне на някои ключове към Info.plist на разширението

За да поддържаме потребителски потребителски интерфейс за локални и отдалечени известия, трябва да направим някои промени във файла Info.plist с разширение на съдържанието.

  1. UNNotificationExtensionCategory (reqd.) - низ или масив от низове. Всеки низ съдържа идентификатора на категория, декларирана от приложението. Категорията , трябва да кажа, е наистина наистина важна за известията. Персонализираният потребителски интерфейс ще се появи само за известията, лежащи в посочените категории.
  2. UNNotificationExtensionInitialContentSizeRatio (reqd.) - число с плаваща запетая, което представлява първоначалния размер на изгледа на контролера на изгледа, изразен като съотношение на височината му към ширината му . Контролерът на изглед ще използваме за създаване на потребителски интерфейс. Ще обсъдим това в предстоящия раздел.
  3. UNNotificationExtensionDefaultContentHidden - ако е вярно : показва само персонализирано съдържание. Ако е невярно : покажете съдържание по избор + по подразбиране
  4. UNNotificationExtensionOverridesDefaultTitle - ако е вярно : задайте заглавието на известието на заглавието на контролера на изгледа. Ако е невярно : заглавието на известието е зададено на името на приложението.

Ето илюстрация, която може да ни помогне да разберем по-горе горепосочените клавиши.

В горната илюстрация клавишите в Info.plist са конфигурирани като:

  1. UNNotificationExtentionCategory - ПОКАНА
  2. UNNotificationExtensionInitialContentSizeRatio - 1
  3. UNNotificationExtensionDefaultContentHidden - false
  4. UNNotificationExtensionOverridesDefaultTitle - невярно

Създаване на потребителски потребителски интерфейс

Разширението за съдържание на известия ни предоставя, UIViewControllerкоето отговаря на UNNotificationContentExtensionпротокола. Този контролер представя интерфейса на известието. Най- Storyboardфайла в разширението съдържа една ViewController, че можем да използваме, за да се създаде каквото и UI искаме известието, за да присъства.

След като създадем потребителския интерфейс, трябва да свържем елементите NotificationViewControllerв, за да попълним подробностите. Всеки път, когато пристигне известие с очаквана категория , ние получаваме обратно обаждане по UNNotificationContentExtension’sметод - didReceive(_:). Това е мястото, където можем да добавим подробности към нашия потребителски потребителски интерфейс.

Почти приключихме с потребителския интерфейс на нашето известие. Само още 1 нещо. Тъй като потребителският потребителски интерфейс е прикачен към категорията на известията ,това може да има някои действия, свързани с него. И ... разбрахте правилно! ? Ще предприемем действията си автоматично, без никаква персонализирана обработка. Брилянтно !?

Съдържание + красив потребителски интерфейс + персонализирани действия - Всичко направено. Какво повече можем да поискаме? Apple, страхотна си !?

Последен момент: можем да добавим и обработка към персонализираните действия в разширението. Системата извиква didReceive(_:completionHandler:)метод, за да отговори на всички избрани действия. Ако нашият контролер на изгледи не приложи този метод, системата доставя избраното действие на вашето приложение за обработка.

Ако се изпълни, трябва да се справим с всички възможни действия в този метод. Едно нещо, което е важно тук, е completionзатварянето.

completion: Блокът за изпълнение, когато приключите с изпълнението на действието. Трябва да извикате този блок по някое време по време на изпълнението си. Блокът няма връщана стойност.

Затварянето приема един параметър dismissот тип UNNotificationContentExtensionResponseOption. Ние предлагаме следните опции:

  1. doNotDismiss - Не отхвърляйте интерфейса за уведомяване.
  2. dismiss - Отхвърлете интерфейса за уведомяване.
  3. dismissAndForwardAction--Отхвърлете интерфейса за уведомяване и го препратете до приложението.

Това обобщава нашите известия. Твърде много за запомняне? Практиката прави напредък ? Опитайте да направите свои собствени известия сега!

Примерен проект

Можете да изтеглите примерния проект от тук.

И примерният проект за разширение на съдържанието за уведомяване можете да намерите тук.

Допълнителна информация

Не забравяйте да прочетете и другите ми статии:

  1. Всичко за Codable в Swift 4
  2. Оцветете го с ГРАДИЕНТИ - iOS
  3. Кодиране за iOS 11: Как да плъзгате и пускате в колекции и таблици
  4. Всичко, което трябва да знаете за Today Extensions (Widget) в iOS 10
  5. Изборът на UICollectionViewCell е улеснен .. !!

Чувствайте се свободни да оставяте коментари, в случай че имате въпроси.