iOS WatchOS2 WatchConnectivity [WCSession defaultSession] activSession] ошибка
У меня есть XCode 7.3, iPhone5 с iOS 9.3, Apple Watch с WatchOS 2.2
У меня есть проект компании, который хочет поддержать приложение Watch. Во-первых, я создал пустой проект, чтобы убедиться, что расширение watchkit и watchkit работает, и оно работает. Я вижу, что сеанс установлен и часы сопряжены.
Но после того, как я вставил тот же код в проект компании, он может работать только один раз: в первый раз я запускаю приложение непосредственно из Xcode. Когда я убиваю приложение из фона и снова открываю его, приложение не показывает парные часы. В этом состоянии я получил журнал ниже: В приложении для iOS
paired == NO ---- watchAppInstalled=== NO---- complicationEnabled==NO ----<WCSession:0x7ffb9a815ab0,hasDelegate:No,activationState:2>
в расширении watchKit
Error Domain=WCErrorDomain Code=7004 "WatchConnectivity session has not been activated." UserInfo={NSLocalizedRecoverySuggestion=Activate the WatchConnectivity session., NSLocalizedDescription=WatchConnectivity session has not been activated., NSLocalizedFailureReason=Function activateSession has not been called.}
мой код о wcsession:
iOS приложение
в AppDelegate+GC_WCSession
- (void)startWCSession{
[self configSession];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLoginStatus:) name:GCLoginNotifyKey object:nil];
}
- (void)configSession{
if (![WCSession isSupported]) {
return;
}
_session = [WCSession defaultSession];
[_session setDelegate:self];
[_session activateSession];
}
- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
[self.session activateSession];
if ([applicationContext objectForKey:k_WK_Token]) {
[self synchronousUserInfo];
}
}
- (void)changeLoginStatus:(NSNotification *)noti{
///
[self synchronousUserInfo];
}
- (void)synchronousUserInfo{
///customCode
[self.session updateApplicationContext:replayDict error:nil];
}
- (WCSession *)session{
if (![WCSession isSupported] || ![[WCSession defaultSession] isPaired ]|| ![[WCSession defaultSession]isWatchAppInstalled] ) {
return nil;
}
return _session;
}
в AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self startWCSession];
}
Расширение watchKit
в ExtensionDelegate
- (void)applicationDidFinishLaunching {
// Perform any final initialization of your application.
[self startWCSession];
}
- (void)startWCSession{
[self configSession];
}
- (void)configSession{
_session = [WCSession defaultSession];
[_session setDelegate:self];
[_session activateSession];
}
- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
///customcode
}
- (WCSession *)session{
return _session;
}
Это то, что я пробовал до сих пор:
сбросить содержимое и настройки всех симуляторов
удаленное приложение для часов с часов и с iPhone
через настройки в приложении Watch на телефоне: удалено приложение Watch Extension for Phone и установлено его заново
Попытка настройки iPhone WCSession в методе AppDelegate INIT
Я не думаю, что код неправильный, потому что он работает в пустом проекте. Интересно, есть ли проблемы в конфигурации среды. Я борюсь с этой проблемой уже много дней. Так что каждый намек высоко ценится.
2 ответа
Я решил эту проблему. Код удар.
- (void)configSession{
dispatch_async(dispatch_get_main_queue(), ^{
if (![WCSession isSupported]) {
return;
}
_session = [WCSession defaultSession];
[_session setDelegate:self];
[_session activateSession];
});
}
Но я не вижу никаких документов, которые должны вызывать этот метод в основном потоке. Более того, этот метод вызывается раньше и находится в главном потоке. Так что я думаю, что это может быть проблемой runloop.
Как сказал в комментариях PetahChristian, в вашем классе ExtensionController измените этот метод:
- (void)applicationDidFinishLaunching {
// Perform any final initialization of your application.
[self startWCSession];
}
быть:
- (instancetype)init
{
self = [super init];
if (self) {
[self startWCSession];
}
return self;
}
- (void)applicationDidFinishLaunching {
// Perform any final initialization of your application.
}
После этого вы сможете получать контент через WatchConnectivity, даже если ваше расширение работает в фоновом режиме для обновления с усложнением.