iOS WatchOS2 WatchConnectivity [WCSession defaultSession] activateSession] 失败
iOS WatchOS2 WatchConnectivity [WCSession defaultSession] activateSession] failure
我有 XCode 7.3,iPhone5 和 iOS 9.3,Apple Watch 和 WatchOS 2.2
我有一个公司项目想要支持Watch App。
首先,我构建了一个空项目以确保 watchkit 和 watchkit 扩展正常工作,并且确实有效。
我可以看到会话已建立并且手表已配对。
但是在我将相同的代码放入公司项目后,它只能用于 once:the 第一次我直接从 Xcode.When 运行 应用程序我从后台杀死了应用程序再次打开,应用程序显示没有配对手表。
在这种情况下,我得到了以下日志:
在 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 APP
在 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
中删除手表应用程序&
通过 Phone 上 Watch App 中的设置:删除 Phone App 的 Watch Extension 并重新安装它
尝试在 AppDelegate INIT 方法中设置 iPhone WCSession
我不认为代码有错,因为它是在一个空的地方工作的project.I想知道是不是环境配置有问题。
我已经为这个问题苦苦挣扎了很多天。因此,我们非常感谢您的每一个提示。
As PetahChristian was saying in the comments, in your ExtensionController class 更改此方法:
- (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 接收内容,即使您的扩展程序 运行 在后台进行并发症更新也是如此。
我解决了这个问题。代码是blow.
- (void)configSession{
dispatch_async(dispatch_get_main_queue(), ^{
if (![WCSession isSupported]) {
return;
}
_session = [WCSession defaultSession];
[_session setDelegate:self];
[_session activateSession];
});
}
但是我没有看到任何文档需要在主线程中调用这个方法。而且这个方法调用之前是在mainthread.So我觉得可能是runloop的问题
我有 XCode 7.3,iPhone5 和 iOS 9.3,Apple Watch 和 WatchOS 2.2
我有一个公司项目想要支持Watch App。 首先,我构建了一个空项目以确保 watchkit 和 watchkit 扩展正常工作,并且确实有效。 我可以看到会话已建立并且手表已配对。
但是在我将相同的代码放入公司项目后,它只能用于 once:the 第一次我直接从 Xcode.When 运行 应用程序我从后台杀死了应用程序再次打开,应用程序显示没有配对手表。 在这种情况下,我得到了以下日志: 在 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 APP
在 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
中删除手表应用程序&
通过 Phone 上 Watch App 中的设置:删除 Phone App 的 Watch Extension 并重新安装它
尝试在 AppDelegate INIT 方法中设置 iPhone WCSession
我不认为代码有错,因为它是在一个空的地方工作的project.I想知道是不是环境配置有问题。 我已经为这个问题苦苦挣扎了很多天。因此,我们非常感谢您的每一个提示。
As PetahChristian was saying in the comments, in your ExtensionController class 更改此方法:
- (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 接收内容,即使您的扩展程序 运行 在后台进行并发症更新也是如此。
我解决了这个问题。代码是blow.
- (void)configSession{
dispatch_async(dispatch_get_main_queue(), ^{
if (![WCSession isSupported]) {
return;
}
_session = [WCSession defaultSession];
[_session setDelegate:self];
[_session activateSession];
});
}
但是我没有看到任何文档需要在主线程中调用这个方法。而且这个方法调用之前是在mainthread.So我觉得可能是runloop的问题