Как мне открыть настройки моего приложения, если они не существуют

#ios #swift #settings

#iOS #swift #Настройки

Вопрос:

Моему приложению требуется доступ к медиатеке пользователя. Мой вопрос относится к следующему сценарию:

  1. Для этого приложения не существует записи настроек iOS.
  2. Пользователь нажимает ссылку, чтобы запустить средство выбора мультимедиа Apple.
  3. Я открываю диалоговое окно авторизации доступа к медиа-библиотеке Apple MPMediaLibrary.requestAuthorization()
  4. Пользователь нажимает «Не разрешить»
  5. Пользователь снова нажимает ссылку, чтобы запустить средство выбора мультимедиа Apple.
  6. Я открываю диалоговое окно с предупреждением, объясняющее проблему и предоставляющее кнопку для открытия настроек iOS приложения.

     UIApplication.shared.open(URL(string:UIApplicationOpenSettingsURLString)!)
      

Это работает нормально, пока приложение / экран настроек iOS не открыто. Запускается приложение «Настройки iOS» и открывает вновь созданные настройки моего приложения.

Если открыто приложение / экран настроек iOS (не для моего приложения, просто откройте где-нибудь), приложение настроек iOS появится и будет расположено там, где оно когда-либо было. Не то, что я хочу. Если я снова переключусь на свое приложение, открою диалоговое окно и второй раз введу URL open, настройки iOS откроются для моего приложения.

Это нормальное поведение? Как мне это исправить?

Stackoverflow хорошо справляется с представлением ссылок на существующие вопросы, которые могут быть ответом, который я ищу, но не получается.


Я все еще в тупике из-за проблемы с настройками моего приложения. Дальнейшее тестирование привело к появлению в lite связанной проблемы. Как и в настройках, значок моего приложения не отображается. Обе проблемы, похоже, решаются при 2-й установке. Я подумал, что, указав подробную информацию о значке приложения, кто-то может увидеть проблему.

Mac Mini
Mojave 10.14.4
Xcode 10.2
Xcode — Project — Цель развертывания IOS = 11.0
Xcode — Target — Цели развертывания = 12.1
Xcode — Swift v5

Физические устройства:
— iPhone 6plus ios 12.1.3
— iPhone X iOS 12.1.4

Поведение:

 - installation on Xcode Simulator results in:
    * icon appears as it should with initial installation.(multiple devices tested)  

- installation on physical devices by Xcode side-loading via debugger results in:
    * after initial installation, icon is missing. 
    * app runs as expected.
    * ios settings entry exists.
    * ios iPhone storage entry exists.
    * 2nd debug run, icon appears. (2nd run can be immediate or after device disconnected/reconnected or Xcode restarted)  

- installation of ipa on physical devices by Xcode -> Window -> Devices amp; Simulators results in:
    * after initial installation, icon is missing.
    * (of course app cannot be run without icon)
    * ios settings entry exists.
    * ios iPhone storage entry exists.
    * 2nd ipa installation, icon appears. (2nd run can be immediate or after device disconnected/reconnected or Xcode restarted)
  

Примечание: я воссоздал и повторно сгенерировал свои значки несколькими различными инструментами. Никаких изменений в поведении.

Примечание: я загрузил пару простых демонстрационных проектов Xcode с GitHub. Они не содержат никаких значков. Они зависят от значка ios по умолчанию. То же поведение, что и в моем приложении.

Любые идеи или прямые догадки будут оценены.

Комментарии:

1. Я использую практически тот же код для открытия настроек в своем приложении, но с моей стороны он отлично открывает страницу настроек моих приложений, даже если настройки уже открыты. Мой код немного отличается: UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!) Вероятно, это потому, что я использую более новую версию Swift. Вы могли бы попробовать настроить новый проект с последней версией Xcode и iOS и попытаться воспроизвести проблему. Если проблема устранена, вам следует обновить все до последней версии.

2. Спасибо за твой ответ, Зандор. В моем коде Swift 4.0 IOS 12.1 использовался предложенный вами синтаксис открытого URL. У меня только что был мозговой пердеж. Я пошел дальше и обновил проект до Swift 4.2, как вы предложили. Я по-прежнему получаю такое же поведение при тестировании на физическом iPhone 6 plus или iPhone X, как привязанном, так и не привязанном. So….no радость.

3. Я только что создал новый проект, поместил кнопку в центр представления раскадровки, создал выход действия и поместил свою предыдущую строку в действие. Я заметил, что это откроет настройки, но не страницу моего приложения. Это произошло потому, что страница приложения отсутствовала при ручной прокрутке настроек. Затем я включил удаленные уведомления в фоновом режиме, и страница появилась. Теперь нажатие кнопки открывает настройки приложения. Возможно, в вашем приложении нет никаких настроек? Вы можете загрузить мой тестовый проект по git.zsinfo.nl/Zandor300/appsettingstest чтобы попробовать это самостоятельно. (Xcode 12.2, Swift 5)

4. Зандор, спасибо за твои усилия. В моей ситуации запись приложения «Системные настройки» создается при установке / боковой загрузке / запуске приложения Xcode. (Я хотел бы протестировать установку на физическом устройстве без запуска …. это можно сделать в Xcode?)

5. То, что я сказал в своем последнем комментарии, было неверным. Запись приложения «Настройки системы» создается, когда я разрешаю или запрещаю авторизацию доступа к музыкальной библиотеке.

Ответ №1:

Как бы то ни было….. Я отправил приложение в Apple для проверки. Оно было одобрено и находится в App Store (Анонс песни). ipa, который я загрузил в App Store Connect, показал такое же поведение «нет значка приложения при первоначальной установке» при установке на мои устройства через Xcode. При загрузке из App Store значок отображается, как и ожидалось.

Поди разберись.

Комментарии:

1. Это должен быть комментарий. В ответах должно быть достаточно информации, чтобы понять ответ. Ответ должен быть описан на разумном уровне детализации и / или включать минимальный пример ответа.

2. Ответ «не беспокойтесь об этом». В моем случае это, похоже, проблема только с Xcode, будь то боковая загрузка или развертывание ipa на устройстве.