Возможно, вы сможете использовать то, что вы описали с помощью собственного кода на Android, , вероятно, невозможно вызвать вызов API из JavaScript с помощью Ionic/Cordova.
Проблема в том, что Ionic и Cordova полагаются на Android WebView
для размещения JavaScript, который будет называться веб-службой. WebView
должен находиться внутри Activity
, который представляет собой встроенную конструкцию Android, на которой размещен визуальный экран. Такой визуальный экран не может быть создан без его отображения, поэтому нет способа выполнить ваш код JavaScript, чтобы вызвать вызов API, если экран фактически не отображается пользователю.
Альтернативой было бы создание гибридного приложения, которое использует собственный компонент для обнаружения маяка и вызова API, а также для создания остальной части вашего приложения с использованием Ionic. Именно с этим решением я работал с другими разработчиками Ionic. Если вы идете по этому маршруту, я бы рекомендовал использовать Android Beacon Library, чтобы обнаружить радиомаяки Eddystone еще до запуска приложения, а затем запустить уведомление из своих собственных обратных вызовов при обнаружении маяковых сигналов, а затем сделать ваш вызов API.
Стоит отметить, что, хотя для этой библиотеки есть ионные привязки, они работают только тогда, когда приложение находится на переднем плане.
Вот как бы вы создали код, чтобы сделать вызов API, когда Eddystone Beacon обнаруживается с помощью этой библиотеки:
public class MyApplicationName extends Application implements BootstrapNotifier {
private static final String TAG = "MyApplicationName";
private RegionBootstrap regionBootstrap;
@Override
public void onCreate() {
super.onCreate();
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
// wake up the app when any beacon is seen (you can specify specific id filers in the parameters below)
Region region = new Region("match-any-eddystone", null, null, null);
regionBootstrap = new RegionBootstrap(this, region);
}
@Override
public void didDetermineStateForRegion(int arg0, Region arg1) {
// Don't care
}
@Override
public void didEnterRegion(Region arg0) {
Log.d(TAG, "Got a didEnterRegion call");
// TODO: MAKE API CALL HERE
}
@Override
public void didExitRegion(Region arg0) {
// Don't care
}
}
Полное раскрытие: Я ведущий разработчик проекта Beacon библиотеки Android.
Спасибо за ваш ответ. Просто, чтобы подтвердить, можно запустить вызов API без взаимодействия с пользователем? Если это так, то я продолжу гибридное приложение или даже просто родное –
Да, это абсолютно возможно. См. Мой отредактированный ответ с примером кода. – davidgyoung
Спасибо .. отличный ответ Я работаю над этим, наконец, решил пойти с родным приложением. –