Как определить тип архитектуры в кроссплатформенном проекте? - PullRequest
1 голос
/ 05 июля 2019

Я создал проект в Xcode 11 beta 2, с недавно представленной кроссплатформенной функцией, предназначенной как для iOS, так и для macOS.У меня проблемы с определением, запущено ли приложение на той или иной платформе.

Допустим, я добавил enum, который помогает идентифицировать платформу

enum Platform {
    case iOS
    case macOS
    case unknown
}

Теперь, если я попробую следующий код, явсегда получайте, что платформа - iOS, независимо от того, в какой среде я работаю.

#if canImport(UIKit)
    let platform: Platform = .iOS
#elseif canImport(AppKit)
    let platform: Platform = .macOS
#else
    let platform: Platform = .unknown
#endif

Я также пробовал другое соглашение #if os(iOS) || os(watchOS) || os(tvOS), но поскольку я использую версию Swift 5.0, это не должно иметь значения.

Единственное решение, которое приходит мне в голову, - это добавить OTHER_SWIFT_FLAGS в настройки сборки в зависимости от используемой архитектуры. Хорошо, я только что попытался установить значение OTHER_SWIFT_FLAGS[sdk=macosx*] = "-D" "MACOS", и оно все еще рассматривается как iOS.

Я просто не понимаю, почему предложенный выше код не работает.В настоящее время я готовлю больше места для установки бета-версии 3 (128 ГБ хранилища ftw), чтобы проверить, схожи ли результаты.

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

вы упомянули об использовании #if os(iOS), но не говорите об использовании флага macOS.Вы пробовали подобное решение?

enum Platform {
    case iOS
    case macOS
    case unknown
}

var compiledPlatform: Platform {
    #if os(iOS)
        return .iOS
    #elseif os(macOS)
        return .macOS
    #else
        return .unknown
    #endif
}

ОБНОВЛЕНИЕ:

У меня не было возможности поиграть с новыми функциями кросс-компиляции, но я думаю,в том, что вы компилируете код ровно один раз для Mac и iOS.

, поскольку код компилируется только один раз, команды препроцессора также запускаются только один раз.это делает его таким, что он всегда будет по умолчанию либо для iOS, либо для Mac и пропускает код для другого.в вашем случае это выглядит как iOS.

Я бы порекомендовал удалить проверку препроцессора и сделать ее проверкой во время выполнения.Есть определенно более чистые способы, но что-то вроде этого:

let isMac = NSClassFromString("NSView") != nil
1 голос
/ 06 июля 2019

Бродя по настройкам сборки, я обнаружил, что кроссплатформенный проект имеет SUPPORTED_PLATFORMS = iOS, поэтому я не смогу найти решение своей проблемы.Это указывает на то, что это как-то интерпретируется по-разному.

...