Обзор
KlugPush добавляет удалённые push-уведомления в приложения AIR на macOS. Он регистрирует приложение в сервисе push-уведомлений Apple, выдаёт токен устройства для вашего сервера и доставляет входящие уведомления в ActionScript.
На macOS пользователя, однажды отклонившего уведомления, повторно не спрашивают. Поэтому KlugPush в любой момент сообщает текущий статус разрешения и открывает страницу «Уведомления» в системных настройках, чтобы пользователи могли включить уведомления позже.
KlugPush ежедневно используется в версии для Mac наших приложений, нашего доказательства работоспособности.
Возможности
- Автономность: один ANE, без базовой библиотеки и зависимых ANE
- Запрашивает разрешение и регистрирует приложение для удалённых уведомлений
- Токен устройства для вашего сервера — сразу после завершения регистрации
- Входящие уведомления передаются в ActionScript в виде JSON
- Актуальный статус разрешения: ещё не решено, отклонено или разрешено
- Открывает системные настройки сразу на странице «Уведомления»
- Отправка напрямую через сервис push-уведомлений Apple, дополнительный push-провайдер не нужен
Поддерживаемые платформы
На других платформах isSupported возвращает false, поэтому один и тот же код можно оставить в кроссплатформенном приложении.
Начало работы
Добавьте расширение в дескриптор вашего приложения:
<extensions>
<extensionID>com.klug.push.Push</extensionID>
</extensions>
Приложение должно быть подписано с правом push-уведомлений (entitlement) и профилем подготовки, включающим возможность Push Notifications.
Примеры кода
Четыре полных сценария из API, который работает в версии наших приложений для Mac. Каждый вызов возвращается сразу; результаты приходят через ваши обратные вызовы и в виде StatusEvent. Полная документация →
import com.klug.push.Push; var push:Push = Push.getInstance(); if ( push.isSupported ) // macOS; false on every other platform { // asks for permission on the first start, then registers with Apple's push service. // The token also arrives when the user declines: permission only affects the display. push.register( onToken, onPushError, onNotification ); } function onToken( token:String ):void { if ( token != loadSavedToken() ) // your app functions sendTokenToServer( token ); // e.g. a POST to https://your.server/push } function onPushError( message:String ):void { // typical cause: the app is not signed with the push entitlement and a matching profile trace( "push registration failed: " + message ); }
function onNotification( json:String ):void { // the full payload as your server sent it: the "aps" part plus your own keys var payload:Object = JSON.parse( json ); if ( payload.hasOwnProperty( "stationId" ) ) // a key your server adds openLiveView( payload.stationId ); // your app function } // later, e.g. after the user signed in to another account function onLogin():void { if ( push.token != null ) // the last token; null until registration finished sendTokenToServer( push.token ); }
import flash.events.Event; import flash.desktop.NativeApplication; // the live status arrives asynchronously; the callback stays set and // also receives the answer when register() shows the prompt push.refreshStatus( updateNotificationSwitch ); function updateNotificationSwitch( status:int ):void { if ( status == Push.STATUS_AUTHORIZED ) showSwitch( "on" ); // your app function else if ( status == Push.STATUS_DENIED ) showSwitch( "off" ); else if ( status == Push.STATUS_NOT_DETERMINED ) showSwitch( "not asked" ); } // macOS never asks a second time: the way back is System Settings function onSwitchTapped():void { if ( push.authStatus == Push.STATUS_DENIED ) push.openSettings(); } // the user may have changed it there: read it again when the app comes back NativeApplication.nativeApplication.addEventListener( Event.ACTIVATE, function( e:Event ):void { push.refreshStatus( updateNotificationSwitch ); });
import flash.events.StatusEvent; push.addEventListener( StatusEvent.STATUS, function( e:StatusEvent ):void { // here the LEVEL names the kind and the CODE carries the value if ( e.level == Push.TOKEN ) sendTokenToServer( e.code ); else if ( e.level == Push.ERROR ) trace( "push error: " + e.code ); else if ( e.level == Push.NOTIFICATION ) onNotification( e.code ); // JSON }); push.register(); // all three callbacks are optional
Обзор API
| Push.getInstance() | Возвращает единственный экземпляр. |
| isSupported | True на macOS, false на остальных. |
| register(onToken, onError, onNotification) | Запрашивает разрешение и регистрирует приложение для удалённых уведомлений. Все три обратных вызова необязательны; onNotification срабатывает, пока приложение запущено. Возвращает false там, где push не поддерживается. |
| token | Последний токен устройства или null, пока регистрация не завершена. |
| authStatus | Последний известный статус разрешения; -1, пока не выполнен register() или refreshStatus(). |
| refreshStatus(onStatus) | Считывает текущий статус разрешения; onStatus(status:int) вызывается по получении, а также снова с ответом на запрос из register(). |
| openSettings() | Открывает системные настройки на странице «Уведомления». |
| STATUS_NOT_DETERMINED, STATUS_DENIED, STATUS_AUTHORIZED | Значения статуса разрешения 0, 1 и 2. macOS может также сообщать 3 (provisional) и 4 (ephemeral). |
| TOKEN, ERROR, NOTIFICATION | Уровни StatusEvent для слушателей: уровень указывает тип, код несёт значение. |
События
| level token | code = токен устройства, шестнадцатеричная строка |
| level error | code = сообщение об ошибке регистрации |
| level notification | code = содержимое уведомления в формате JSON |
Купить KlugPush
Годовая лицензия на одно приложение AIR со всеми обновлениями в течение 12 месяцев. После оплаты вы получаете расширение, библиотеку ActionScript и документацию по e-mail, обычно в течение одного рабочего дня. Лицензия и условия
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Без поддержки
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Ответ по e-mail в течение 7 дней
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Ответ по e-mail в течение 48 часов
Требования
| AIR SDK | 51.x (HARMAN) |
| macOS | macOS 11 или новее |
| Подпись | Право push-уведомлений (entitlement) и соответствующий профиль подготовки |
| Сервер | Отправляет уведомления через сервис push-уведомлений Apple |