У меня проблема с изменением иконки приложения на iPad. На iPhone все работает нормально, но на iPad я получаю эту ошибку:

[по умолчанию] Не удалось задать для параметра AdditionalIconName значение AI-Gorgosaurus для ...: 0> ошибка: Ошибка Domain = NSCocoaErrorDomain Code = 4 "Файл не существует". UserInfo = {NSUnderlyingError = 0x600000248a30 {Error Domain = LSApplicationWorkspaceErrorDomain Code = -105 "iconName не найден в записи CFBundleAlternateIcons" UserInfo = {NSLocalizedDescription = iconName не найден в файле с именемBBundleAlternateIcons).

Я искал объявление и обнаружил, что мне нужно добавить ~ipad в CFBundleIconFiles, но все равно получаю ту же ошибку !.

Вот код:

  func changeIcon(to name: String?) {
        //Check if the app supports alternating icons
        guard UIApplication.shared.supportsAlternateIcons else {
            return;
        }

        //Change the icon to a specific image with given name
        UIApplication.shared.setAlternateIconName(name) { (error) in
            //After app icon changed, print our error or success message
            if let error = error {
                print("App icon failed to due to \(error.localizedDescription)")
            } else {
                print("App icon changed successfully.")
            }
        }
    }

enter image description here

Я только что проверил на другом проекте и работает отлично! но не в моем текущем проекте почему ?! у тебя есть идеи?

17
Mc.Lover 21 Авг 2018 в 16:08

6 ответов

Лучший ответ

Ваш info.plist составлен неправильно.

У тебя есть:

- CFBundleIcons
  - CFBundleAlternateIcons
    - Icon Name
      - CFBundleIconFiles
      - CFBundleIconFiles~ipad

Но должно быть:

- CFBundleIcons
  - CFBundleAlternateIcons
    - Icon Name
      - CFBundleIconFiles
- CFBundleIcons~ipad
  - CFBundleAlternateIcons
    - Icon Name
     - CFBundleIconFiles

По сути, после того, как он работает с иконками iPhone, CFBundleIcons, продублируйте все дерево как CFBundleIcons~ipad. Файлы iPad не должны быть вложены в CFBundleIcons.

Вы смешиваете CFBundleIcons~ipad и CFBundleIconFiles~ipad (что не является допустимым ключом).

Screenshot

19
Dave Wood 4 Ноя 2019 в 06:34

Пожалуйста, внесите эти изменения в ваш plist файл для установки альтернативных иконок для iPhone и iPad.

enter image description here

2
Rizwan Shaikh 27 Ноя 2018 в 06:23

Попытка дать более повторяемую (легкую для копирования / вставки) версию этого ответа.

1) Вам нужны изображения следующих имен и размеров, добавленные в виде обычных файлов .png (без каталогов активов)

.../AppIcon-Dark/iPad-app.png
  pixelWidth: 76
.../AppIcon-Dark/iPad-app@2x.png
  pixelWidth: 152
.../AppIcon-Dark/iPad-pro@2x.png
  pixelWidth: 167
.../AppIcon-Dark/iPhone-app@2x.png
  pixelWidth: 120
.../AppIcon-Dark/iPhone-app@3x.png
  pixelWidth: 180

Затем вы можете добавить / вставить следующее в ваш info.plist

<key>CFBundleIcons</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>AppIcon-Dark</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>iPhone-app</string>
            </array>
        </dict>
    </dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>AppIcon</string>
        </array>
    </dict>
</dict>
<key>CFBundleIcons~ipad</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>AppIcon-Dark</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>iPad-app</string>
                <string>iPad-pro</string>
            </array>
        </dict>
    </dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>AppIcon</string>
        </array>
    </dict>
</dict>

Затем я установил свой значок со следующим

func updateIcon() {
    if #available(iOS 13.0, *) {
        let dark = window?.traitCollection.userInterfaceStyle == .dark

        let currentIconName = UIApplication.shared.alternateIconName
        let desiredIconName:String? = dark ? "AppIcon-Dark" : nil

        if currentIconName != desiredIconName {
            UIApplication.shared.setAlternateIconName(desiredIconName) {
                (error) in
                print("failed: \(String(describing: error))")
            }
        }
    }
}
1
Confused Vorlon 16 Мар 2020 в 15:31

Ошибка показывает имя файла, отличное от имени в .plist CFBundleAlternateIcons. Убедитесь, что вы указали правильное имя файла и оно существует в папке проекта .

Ошибка Показывает AI-Gorgosaurus в качестве имени файла. Скриншот .plist показывает AI-Diabloceratops~ipad, также удалите символ ~ из имени файла.

Выполните очистку и постройте проект после того, как убедитесь, что файл верен. Убедитесь, что у вас есть @2x и @3x версия значков в папке проекта .

Прочитайте ответ Kaiyuan Xu, чтобы получить более четкое представление о том, как использовать CFBundleAlternateIcons.

0
Farhad 28 Авг 2018 в 23:54

С приведенной ниже структурой я могу изменить значок в iPad:

    if #available(iOS 10.3, *) {
        let newAppIconName = "Icon2"

        guard UIApplication.shared.alternateIconName != newAppIconName else { return }

        UIApplication.shared.setAlternateIconName(newAppIconName)
    }
}

Код Plist:

<key>CFBundleIcons</key>
<dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>AppIcon</string>
        </array>
        <key>UIPrerenderedIcon</key>
        <true/>
    </dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>Icon2</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>icon60</string>
            </array>
            <key>CFBundleIcons~ipad</key>
            <array>
                <string>iTunesArtwork80.png</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <true/>
        </dict>
    </dict>
</dict>

enter image description here

-1
iVarun 21 Авг 2018 в 13:52

То, что я заметил, - то, что ваш plist имеет UIPrerenderedIcon, установленный в НЕТ

Измените это на ДА

Возможно, проблема в рендеринге.

Редактировать 1: добавить расширение .png, чтобы увидеть, помогает ли оно

РЕДАКТИРОВАТЬ 2: Попробуйте изменить имя файла нового значка на ipadAlternate.png. Затем измените то же имя в списке, как выглядит, как будто есть какое-то несоответствие с вашим списком и самим файлом значков.

РЕДАКТИРОВАТЬ 3: Вы очистили папку DerivedData? У меня была проблема некоторое время назад, и ничто не помогло, включая очистку проекта и т. Д. Но я попытался удалить все в папке / Users / YOURUSERNAME / Library / Developer / Xcode / DerivedData /, и он снова начал работать. Стоит попробовать.

РЕДАКТИРОВАТЬ 4: Попробуйте выполнить шаг из РЕДАКТИРОВАНИЯ 3. Затем перезапустите проект и удалите из него все альтернативные файлы значков. Выберите перемещение в корзину, а затем CMD + SHIFT + K для очистки. Затем выберите CMD + B, чтобы построить. Затем добавьте значки туда, где они были. Убедитесь, что цель выбрана правильно, и скопируйте элементы, если необходимо выбрать. По какой-то причине Xcode потерял отслеживание вашего файла, и он показывает ошибку, нет файла.

Если это не поможет, попробуйте описанные выше шаги. Но сначала попробуйте переместить весь проект в другую папку.

РЕДАКТИРОВАТЬ 5: Есть еще одна идея, которую вы могли бы попробовать для себя. Попробуйте удалить файл plist в текущем проекте (сохраните его резервную копию перед удалением), затем запустите новый проект, в котором смена значков работает нормально. Добавьте лист из этого проекта в этот. Проверьте, работает ли смена значков. Если да, то добавьте все недостающие ключи, которые были у вас в предыдущем проекте.

ВНИМАНИЕ: Это последнее средство, но это может сработать. Начните новый проект и настройте его с помощью значков, которые вы хотите чередовать. Сначала проверьте, работают ли они, а затем добавьте весь код и зависимости из проекта, где он не работает. Только не перезаписывайте файлы PLIST.

РЕДАКТИРОВАТЬ 6: Попробуйте удалить приложение из симулятора или устройства, на котором вы его пытаетесь, и переустановить. Вся проблема может быть связана с обновлением и остатками предыдущей версии приложения.

РЕДАКТИРОВАТЬ 7: Попробуйте скопировать проект на другой Mac и посмотреть, если проблема не устранена. Какую версию XCode вы используете ?? Если это Xcode 9, возможно, попробуйте использовать бета-версию Xcode 10.

2
Marcy 15 Ноя 2018 в 06:08
51949430