Тестирование прототипа 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

Другие вопросы по тегам