Можно ли определить, работает ли моя инфраструктура как часть основного приложения или расширения?

В iOS или OS X Framework, который содержит общий код как для приложений, так и для приложений, существует ли способ определить, выполняется ли код под основным приложением или один из его расширений? В частности, я хотел бы определить, используется ли фрейм как часть расширения WatchKit, а не внутри iPhone-приложения.

UIDevice.currentDevice всегда возвращает iPhone, поскольку это то, что работает с кодом. Я считаю, что могу проверить, существует ли WKInterfaceDevice , но это не кажется слишком элегантным.

Один из вариантов – проверить расширение файла текущей цели. Это имеет то преимущество, что он работает в общих библиотеках и средах, тогда как другие параметры часто работают только в пределах самой цели:

 + (BOOL) isAppExtension { return [[[NSBundle mainBundle] executablePath] containsString:@".appex/"]; } 

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

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

В частности, для WatchKit я придумал следующее:

 [[[NSBundle mainBundle] bundleIdentifier] hasSuffix:@"watchkitextension"]; 

Или в Свифт:

 NSBundle.mainBundle().bundleIdentifier?.hasSuffix("watchkitextension") 

Это зависит от того, что расширение WatchKit должно иметь идентификатор пакета, заканчивающийся в watchkitextension.

  • SPErrorGizmoInstallNeverFinishedErrorMessage в Watchkit
  • Расширение WatchKit не видит данные, сохраненные в NSUserDefaults с группой приложений
  • Данные WatchKit не отображаются
  • «isReachable» неверно при отправке сообщения из приложения watch в приложение iOS
  • Запрос данных из HealthKit на Apple Watch
  • Статический фон с прокручиваемыми таблицами в Watchkit для Xcode (Apple Watch)
  • WCSession sendMessage в Xcode 7.0 (7A218) Симулятор
  • Использует ли Apple часы свой собственный bluetooth, когда я использую каркас ядра в расширении набора часов или iPhone-bluetooth?
  • Получать локальное уведомление в watchkit
  • PFQuery findObjectsInBackgroundWithBlock: приложение WatchKit работает в симуляторе, а не на часах, если приложение iOS не находится на переднем плане
  • Watchkit & Realm 0.92.3
  • Interesting Posts

    Методы делегатов NSURLConnection в фоновом потоке

    Parse хранит локальные объекты хранилища данных для их кеширования и очистки?

    Создание и хранение PDF-документа программно с помощью Swift для iOS

    Ошибка iOS 10: UICollectionView получил атрибуты макета для ячейки с пути указателя, который не существует

    NSArray objectAtIndex: сокращенное

    Нужно ли мне удалять CABasicAnimation, когда анимация закончена?

    как фильтровать MPMediaItems файлами .mp3 для воспроизведения песен в AVPlayer

    iOS 8 UIVisualEffect View с UIBlurEffect становится непрозрачным

    Получить видео NSData от ALAsset url iOS

    UIStoryboardSegue против текущего контроля?

    Scrollview, как foursquare с картами + список

    контролировать и обнаруживать, если iphone подключен и заряжается, Wi-Fi подключен, когда приложение находится в режиме ожидания

    В iOS, как читать данные формы нескольких частей в NSURLRequest, происходящих из WKWebView?

    Ошибка компилятора Swift: «Слишком сложное выражение» при конкатенации строк

    Как использовать ASIFormDataRequest для http post array объектов NSDictionary

    Давайте будем гением компьютера.