То, каковы правила позади “X, хотело бы использовать Ваше текущее местоположение” на iPhone?

Используя осведомленность местоположения о триггерах iPhone "X хотели бы использовать Ваше текущее местоположение" - "Не позволяют" / "хорошо". В документации CLLocationManager это указано:

"У пользователя есть опция запрета доступа приложения к данным службы определения местоположения. Во время его начального использования приложением Базовая платформа Местоположения предлагает пользователю подтверждать, что использование службы определения местоположения приемлемо. Если пользователь отклоняет просьбу, объект CLLocationManager сообщает о соответствующей ошибке своему делегату во время будущих запросов".

Я нашел, что "начальное использование" было два раза, если Вы совершаете нападки "хорошо" для разрешения служб определения местоположения. С третьего раза на iPhone будет помнить Вашу установку за все будущее использование приложения.

Однако пользователь, нажатие "Do not allow", будет постоянно беспокоиться каждый раз, когда часть приложения пробует к службам определения местоположения использования. Я попробовал по крайней мере 15 раз в моем собственном приложении и коснулся, "Не позволяют" еще больше на "Ванкувере 2010 - официальное мобильное руководство зрителя". Это является чрезвычайно раздражающим для пользователей, не желающих использовать эту функцию.

Мои вопросы:

  • Для всех приложений iPhone будет спрашивать два раза и помнить установку, если Вы совершите нападки "хорошо". Действительно ли это - корректное наблюдение?
  • Существует ли предел на объем попыток, которые iPhone продолжит спрашивать, совершаете ли Вы нападки, "Не позволяют", или это никогда не помнят? Как Вы обрабатываете это? С тех пор locationManager:didFailWithError: уведомляется, я предполагаю, что это могло увеличить встречное свойство каждый раз и сохранить это. В следующий раз, когда приложение используется, эта установка проверяется в моем собственном коде. Если счетчик> = 2, не используйте базовое местоположение.
  • Единственным путем я нашел для удаления установки "OK", однажды помнил, путем сброса его для ВСЕХ приложений в целом-> Сброс-> предупреждения Местоположения. Существует ли способ сделать это только для одного приложения, или из моего собственного кода?

13
задан Mads Mobæk 18 February 2010 в 09:13
поделиться

1 ответ

Мне удалось установить (более раннюю версию) SDK на компьютере с ОС Windows, а затем скопировать соответствующие библиотеки в среду разработки Linux. Я хотел бы, чтобы солнце предоставило все JDK в формате zip/tar. Я ненавижу установку программного обеспечения только для того, чтобы получить файлы .jar из архива. Следует отметить, что SDK включает в себя эмулятор мобильного устройства, который не работает под Linux, но для компиляции кода нужен только .jars.

-121--4903732-

Для того, чтобы любой человек, исследующий этот вопрос в будущем, вот решение, которое я в конечном итоге реализовал. Это основано на ответе Джона Боуэна, который я выбрал как лучшее решение проблемы.

Сначала я создал стиль для прозрачного списка, содержащего переключатели, как предметы. Затем я создал кнопки для перехода в поле списка - мои кнопки исправлены, а не считываются в приложение как данные, поэтому я жестко закодировал их в разметку.

Я использую перечисление ListButtons в модели представления, чтобы представить кнопки в списке, и я использую свойство Тэгов каждой кнопки, чтобы передать последовательности значение перечисления для этой кнопки. Свойство ListBox.SelectedStartPath позволяет указать свойство Тэгов в качестве источника для выбранного значения, которое связывается с моделью представления с помощью свойства SelectedValue . Я думал, что мне понадобится конвертер значений для преобразования между последовательностью и его значением перечисления, но встроенные конвертеры WPF справились с преобразованием без проблем.

Вот полная разметка для Window1.xaml :

<Window x:Class="RadioButtonMvvmDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">

    <!-- Resources -->
    <Window.Resources>
        <Style x:Key="RadioButtonList" TargetType="{x:Type ListBox}">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="ItemContainerStyle">
                <Setter.Value>
                    <Style TargetType="{x:Type ListBoxItem}" >
                        <Setter Property="Margin" Value="5" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                    <Border BorderThickness="0" Background="Transparent">
                                        <RadioButton 
                                            Focusable="False"
                                            IsHitTestVisible="False"
                                            IsChecked="{TemplateBinding IsSelected}">
                                            <ContentPresenter />
                                        </RadioButton>
                                    </Border>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Setter.Value>
            </Setter>
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBox}">
                        <Border BorderThickness="0" Padding="0" BorderBrush="Transparent" Background="Transparent" Name="Bd" SnapsToDevicePixels="True">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <!-- Layout -->
    <Grid>
        <!-- Note that we use SelectedValue, instead of SelectedItem. This allows us 
        to specify the property to take the value from, using SelectedValuePath. -->

        <ListBox Style="{StaticResource RadioButtonList}" SelectedValuePath="Tag" SelectedValue="{Binding Path=SelectedButton}">
            <ListBoxItem Tag="ButtonA">Button A</ListBoxItem>
            <ListBoxItem Tag="ButtonB">Button B</ListBoxItem>
        </ListBox>
    </Grid>
</Window>

Модель представления имеет единственное свойство SelectedButton, которое использует перечисление ListButtons для отображения выбранной кнопки. Свойство вызывает событие в базовом классе, который я использую для моделей просмотра, которое вызывает событие PropertyChanged :

namespace RadioButtonMvvmDemo
{
    public enum ListButtons {ButtonA, ButtonB}

    public class Window1ViewModel : ViewModelBase
    {
        private ListButtons p_SelectedButton;

        public Window1ViewModel()
        {
            SelectedButton = ListButtons.ButtonB;
        }

        /// <summary>
        /// The button selected by the user.
        /// </summary>
        public ListButtons SelectedButton
        {
            get { return p_SelectedButton; }

            set
            {
                p_SelectedButton = value;
                base.RaisePropertyChangedEvent("SelectedButton");
            }
        }

    }
} 

В производственном приложении установщик SelectedButton вызовет метод класса обслуживания, который выполнит действие, требуемое при выборе кнопки.

И чтобы быть полным, вот базовый класс:

using System.ComponentModel;

namespace RadioButtonMvvmDemo
{
    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Protected Methods

        /// <summary>
        /// Raises the PropertyChanged event.
        /// </summary>
        /// <param name="propertyName">The name of the changed property.</param>
        protected void RaisePropertyChangedEvent(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
                PropertyChanged(this, e);
            }
        }

        #endregion
    }
}

Надежда, которая помогает!

-121--962293-
  1. Да, она всегда спросит вас дважды. Странный и непривлекательный имхо. Насколько я понимаю, это на случай, если ты нажмешь не ту кнопку в первый раз. После этого предполагается, что вы знаете, чего хотели.

  2. Я обнаружил следующее в примере «DonalMe»:

    «Don 't Allow» на двух последовательных запусках приложений - это то же самое, что и «never allow». Но я также читал, что другие люди видят то же поведение, что и вы. Может быть, изменение в последнем обновлении ОС? В любом случае, твой подход звучит разумно.

  3. Я не верю, что вы можете выполнить сброс только для одного приложения, извините.

5
ответ дан 2 December 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: