2015-10-26 3 views
0

Я программирую мобильное приложение с помощью Cordova. Я использую push-уведомления с помощью Push Plugin. Приложение предназначено для работы на всех платформах, но сейчас я тестирую Android и Windows.Кордова - извлечение локального хранилища из java-файлов Push Plugin

В частности файла JavaScript Я спасаю значение называет это «категорию» в LocalStorage:

localStorage.setItem("category", JSON.stringify(categoryarray)); 

Теперь при отправке толчок уведомления, категория необходимо решить, следует ли показывать уведомление или нет , Если пользователь подписался на эту конкретную категорию, тогда уведомление должно быть показано, в противном случае - нет. Для этого я просто создаю условие и проверяю, подписался ли пользователь на категорию, включенную в уведомление (но это не имеет отношения к точке вопроса). Когда приложение запускается, это условие можно обрабатывать в javascript. Когда приложение не работает, это обрабатывается в Java коде:

else { 
      extras.putBoolean("foreground", false); 

      // Send a notification if there is a message 
      if (extras.getString("message") != null && extras.getString("message").length() != 0) { 
       createNotification(context, extras); 
      } 
     } 

Теперь я хочу, чтобы получить значение из локального хранилища в этом случае, что уведомление выталкивается, когда приложение не работает (и быть возможность проверить, следует ли показывать уведомление или нет).

Я пришел в эту ссылку: Android Service reads localStorage?

Но это, кажется, предназначено для Android машинного кода (ссылка на WebView). Кроме того, я не совсем понял, как это работает, и, кроме того, если оно применимо для моей проблемы.

Что вы предлагаете? Как мне это сделать?

Редактировать: Я изначально не понял, что Java-код Push-плагина не будет скомпилирован с помощью приложения Cordova. Поэтому редактирование кода, которое можно извлечь из каталога Cordova, на самом деле бесполезно. Если кто-то еще ничего не может предложить, я знаю, что это вопрос без ответа. Придется повторить попытку создания API для этой цели и обработать, кто получит это уведомление со стороны сервера! (Причина, по которой я прибегал к этому методу, заключалась в том, что мне не удалось создать API для целей уведомления)

ответ

0

Я изначально не понял, что Java-код Push-плагина не будет скомпилирован с помощью Cordova приложение. Поэтому редактирование кода, которое можно извлечь из каталога Cordova, на самом деле бесполезно. Если кто-то еще ничего не может предложить, я знаю, что это вопрос без ответа.

Это неверно, код плагина Кордовы компилируется при компиляции приложения Кордовы. Все плагины Cordova предоставляют собственный исходный код, который скомпилируется в приложение при запуске cordova build (или cordova run <platform>).

Если вы решили полностью решить эту проблему на стороне клиента (вместо того, чтобы управлять категориями, на которых пользователь подписался на бэкэнд и только отправляет уведомление, если пользователь подписался на категорию), вы можете расширить PushPlugin для управления подписками на категории.

Как грубый эскиз:

В PushNotification.js, добавьте способ подписаться на канал:

PushNotification.prototype.subscribeToChannel(successCallback, errorCallback, channel) { 
    cordova.exec(successCallback, errorCallback, "PushPlugin", "subscribeToChannel", [{channel: channel}]); 
} 

В PushPlugin.java Поймать subscribeToChannel действие в функции execute:

public boolean execute(String action, JSONArray data, CallbackContext callbackContext) { 
... 
    if ("subscribeToChannel".equals(action)) { 
     //get the attached data 
     JSONObject jo = data.getJSONObject(0); 
     String channel = (String) jo.get("channel"); 
     addChannelToSubscriptions(channel); 
    } 
... 
} 

public void addChannelToSubscriptions(String channel) { 
    //store as a list in a sharedpreferences list 
} 

Затем, когда получено уведомление, вы можете проверить, является ли канал каналом, на который подписаны.

// Send a notification if subscribed to the channel 
if (extras.getString("channel") != null && isSubscribedTo(extras.getString("channel"))) { 
    createNotification(context, extras); 
} 

public boolean isSubscribedTo(String channel) { 
    //see if the channel is in the shared preferences. 
} 

Лично я считаю, что было бы легче управлять подписками на внутреннем интерфейсе, чтобы управлять его в приложении, вы должны реализовать эту логику для каждой платформы вы поддерживаете. Было бы проще просто добавить вызов webservice в ваш Javascript. В качестве дополнительной альтернативы, если вы не хотите обрабатывать логику подписки на своем бэкэнд, вы можете посмотреть на услугу, например Parse, где концепция подписки на каналы встроена в службу.