Тестирование прототипа Xamarin Geofence в эмуляторе завершилось неудачно
У меня есть прототип приложения, использующего геозону, настроенный в AndroidStudio, и я смог успешно протестировать его в эмуляторе Android. Поскольку мне нужно, чтобы приложение также было iOS, я перенес прототип в Xamarin/Visual Studio 2017, чтобы убедиться, что оно работает в этой среде, поэтому я могу избавить себя от необходимости кодировать основную логику приложения в Android и iOS. Однако я не могу запустить геозон в приложении на основе Xamarin на том же эмуляторе. Кто-нибудь работал с этой технологией в Xamarin? Есть ли конкретные настройки, которые нужно изменить, чтобы Xamarin сделал это?
1 ответ
Проблема, вероятно, исходит из манифеста. В Xamarin, когда вы создаете службу (или службу намерений), она должна быть помечена атрибутом [Service]
вместо добавления его в манифест вручную.
Вам также следует проверить наличие ошибок при обработке намерения (если вы этого еще не сделали):
[Service]
public class GeofenceTransitionsIntentService : IntentService, IEnableDatabaseLogger
{
public GeofenceTransitionsIntentService()
: base(nameof(GeofenceTransitionsIntentService)) { }
protected override void OnHandleIntent(Intent intent)
{
base.OnHandleIntent(intent);
this.Log().Info("Intent received");
var geofencingEvent = GeofencingEvent.FromIntent(intent);
if (geofencingEvent.HasError)
{
var errorMessage = GeofenceErrorMessages.GetErrorString(this, geofencingEvent.ErrorCode);
this.Log().Error(errorMessage);
return;
}
var geofenceTransition = geofencingEvent.GeofenceTransition;
var geofences = geofencingEvent.TriggeringGeofences;
var location = geofencingEvent.TriggeringLocation;
if (geofenceTransition == Geofence.GeofenceTransitionEnter)
{
foreach (var geofence in geofences)
this.Log().Info($"Entered {geofence.RequestId} at {location.Latitude}/{location.Longitude}");
// do something
}
else if (geofenceTransition == Geofence.GeofenceTransitionExit)
{
foreach (var geofence in geofences)
this.Log().Info($"Exited {geofence.RequestId} at {location.Latitude}/{location.Longitude}");
// do something
}
else
{
this.Log().Error($"Geofence transition invalid type: {geofenceTransition}");
}
}
}
Вот демонстрационный (рабочий) проект, который я сделал недавно: https://github.com/xleon/geofencing-playground