Хората заменят съдържание с най-новото от 1938 г. Снимка от Central Press за Getty Images.

Как да замените съдържанието на известие за iOS

Възползвайте се максимално от новите функции за известяване на iOS 10.

Известията за iOS обикновено са сравнително недосегаеми. След като го изпратите, той ще влезе в телефона на потребителя, докато не го прекарате. Но след пускането на iOS 10, нови API ни предоставиха много по-голям контрол върху известията след публикуването им, включително възможността да заменим съдържанието на съществуващо известие. Използвахме ги, за да поддържаме актуализираните ни видео известия на живо, със същия принцип, който използвахме и при уеб известията за предоставяне на резултати от изборите. За съжаление, внедряването в iOS не е толкова лесно, колкото би могло да бъде, така че ето бърз преглед на това как да го направите:

Лесният начин

Ако имате достатъчно късмет да стартирате своя собствена услуга за избутване или използвате такава, която внедрява сравнително новия HTTP2 API на Apple за изпращане на известия, имате късмет. Има нов атрибут, който можете да изпратите като част от натискане на полезен товар, наречен „apns-cras-id“. Когато iOS устройство получи това известие, то ще замени всяко съществуващо известие с този идентификационен номер за срив, който в момента се показва в таблата за известия на потребителя (за тези от вас, които са разгледали в API за уведомяване в мрежата, това е повече или по-малко еквивалентно на използвания атрибут на маркера там). Така че, всичко, което трябва да направите, е да генерирате уникален идентификационен номер за всеки изпратен сигнал, след това, ако искате да го замените, изпратете друго известие, използвайки същия този идентификационен номер, който ще заеме неговото място.

Тук обаче има един голям проблем: много доставчици на push известия не са въвели тази нова функционалност. Когато за последно проверих, нито SNS на Amazon, нито Google Firebase Cloud Messaging не го поддържат. Така че ако не можете да внедрите идентификатори на нишки, трябва да добавите допълнителен код към приложението си.

Актуализация: Firebase Cloud Messaging вече поддържа apns-cras-id. Благодаря на Дан Тренц, че го посочи.

Трудният начин: Разширения за уведомяване на услуги

Apple представи нова категория разширение за приложения в iOS 10, наречена разширение за уведомяване. Това е малък фрагмент код, който се изпълнява точно преди телефонът да покаже изпратеното от вас известие и ви позволява да персонализирате съдържанието на това известие, преди потребителят изобщо да го види. Основно е предназначен да се използва за прикачване на снимки или видео към известие, но също така ви позволява да промените повечето атрибути на известие, преди да бъде показано. За съжаление * не позволява * да персонализирате идентификатора на нишката, но можем да подражаваме на това поведение.

Когато изпращаме известие, можем да прикачим собствен персонализиран идентификатор към полезния товар (нещо, което всички push услуги * do * поддръжка). След това, когато нашата услуга за уведомяване се стартира, вземете този идентификационен номер:

клас NotificationService: UNNotificationServiceExtension {
    
    отмени функцията didReceive (
        _ заявка: UNNotificationRequest,
        withContentHandler contentHandler:
            @escaping (UNNotificationContent) -> void)
    {
        
        нека userInfo = request.content.userInfo
        нека customID = userInfo ["custom-payload-id"] като? низ
        
    }
}

След това чрез API на UNUserNotificationCenter можем да получим списък с всички видими понастоящем известия, които имаме на телефона на потребителя, и да намерим едно, което съответства на нашия идентификационен номер:

нека customID = userInfo ["custom-payload-id"] като? низ
UNUserNotificationCenter.current ()
.getDeliveredNotifications {уведомления в
    нека съвпадение = notifications.first (където: {извести в
        нека съществуваUserInfo = notify.request.content.userInfo
        нека id = съществуващUserInfo ["custom-payload-id"] като? низ
        return id == customID
    })
    
}

и, ако съществува, го премахнете:

ако нека matchExists = съвпадение {
    UNUserNotificationCenter.current (). (RemoveDeliveredNotifications
        withIdentifiers: [matchExists.request.identifier]
    )
}

Решението, базирано на срив на ИД, се заменя незабавно, докато нашето хак ясно показва, че известието изчезва и след това се появява отново:

Но като се имат предвид, всичко работи добре.

Следващи стъпки

В идеалния случай не би трябвало да правим нищо от това. Подозирам, че доставчиците на push услуги не са внедрили полето на apns-cras-id, защото то изисква да използвате HTTP2 API, което би означавало, че ще трябва да реинженерират целия си стек на push съобщения и това ще отнеме известно време , Така че Apple може да предостави идентификатора за срив чрез стария си API, или може да ни позволи да персонализираме идентификатора за срив като част от разширението на услугата за известия. Все още ще се нуждаем от допълнителен локален код, но поне ще правим нещата по начина, по който трябва да се правят.

Също така имайте предвид тези нови API-та, когато работите върху нещо свързано с известията. Колкото повече можем да направим, за да гарантираме, че потребителят получава най-новата информация, когато погледне заключения си екран, толкова по-добре!

Guardian Mobile Innovation Lab работи с щедрата подкрепа на фондацията John S. and James L. Knight.