it-swarm.com.ru

Изменение альтернативного значка для iPad

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

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

Я искал объявление и обнаружил, что мне нужно добавить ~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

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

7
Mc.Lover

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

У тебя есть:

- CFBundleIcons
  - CFBundleAlternateIcons
    - Icon Name
      - CFBundleFilesIcons
      - CFBundleFilesIcons~ipad

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

- CFBundleIcons
  - CFBundleAlternateIcons
    - Icon Name
      - CFBundleFilesIcons
- CFBundleIcons~ipad
  - CFBundleAlternateIcons
    - Icon Name
     - CFBundleFilesIcons

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

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

 Screenshot

2
Dave Wood

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

 enter image description here

1
Rizwan Shaikh

Я заметил, что ваш plist имеет UIPrerenderedIcon установлен в NO

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

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

Правка 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.

1
AD Progress

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

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

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

Прочитайте Кайюань Сюй ответьте для более ясного представления о том, как использовать CFBundleAlternateIcons.

0
Farhad

С приведенной ниже структурой я могу изменить значок в 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

0
iVarun