iOS WatchKit - как определить, работает ли ваш код в расширении часов или в приложении
С WatchKit у вас есть приложение, которое работает на телефоне, и приложение для часов, которое работает как расширение.
Если вы создаете библиотеку, которая содержит общий код, который будет использоваться как в приложении телефона, так и в расширении часов, есть ли способ узнать, выполняется ли код в приложении телефона или в расширении часов?
Т.е.
if ([self isRunningInWatchExtension]) {
NSLog(@"this is running on watch");
} else {
NSLog(@"this is running on phone app");
}
- (BOOL)isRunningInWatchExtension {
???
}
3 ответа
Я сделал это, проверив идентификатор пакета:
if ([[[NSBundle mainBundle] bundleIdentifier] isEqualToString:kAppBundleIdentifier]) {
// Running in main app
}
else if ([[[NSBundle mainBundle] bundleIdentifier] isEqualToString:kWatchBundleIdentifier]) {
// Running in extension
}
В целевых условных выражениях есть некоторые условные обозначения, которые могут вам помочь,
#if TARGET_OS_WATCH
//do something for watch
#else
//do something for ios ==> assuming you only support two platforms
#endif
Это может быть легко, если вы вызываете какие-либо пользовательские методы в своем общем каркасном классе. Вам просто нужно добавить дополнительные параметры метода в метод. И если вы вызываете этот метод из приложения iOS или приложения Watchkit, добавьте соответствующую пару ключ-значение в словарь для параметров. И сравните это в ваших рамках методов.
Чтобы определить это из init или любого другого метода, вы все равно можете узнать по этому коду,
NSLog(@"%@",[NSThread callStackSymbols]);
Итак, вам нужно проанализировать эту строку и получить соответствующие целевые имена. Если он вызывается приложением iOS, вы получите строку " UIKit ", а из расширения приложения watch kit вы получите строку " YourApp WatchKit Extension ". Вы также можете сослаться на этот SO-ответ для анализа этой строки и сравнить ее - /questions/15634761/tsel-c-najti-vyizyivayuschego-metoda/15634763#15634763