![](/img/trans.png)
[英]Send messages between iOS and WatchOS with WatchConnectivity in watchOS2
[英]iOS WatchOS2 WatchConnectivity [WCSession defaultSession] activateSession] failure
我有 XCode 7.3、帶 iOS 9.3 的 iPhone5、帶 WatchOS 2.2 的 Apple Watch
我有一個想要支持 Watch App 的公司項目。 首先,我構建了一個空項目以確保 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 的代碼:
- (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;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self startWCSession];
}
- (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 中刪除手表應用程序
通過手機上的手表應用中的設置:刪除手機應用的手表擴展並重新安裝
嘗試在 AppDelegate INIT 方法中設置 iPhone WCSession
我不認為代碼是錯誤的,因為它在一個空項目中工作。我想知道環境配置是否有問題。 我現在在這個問題上掙扎了很多天。 所以每一個提示都受到高度贊賞。
正如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 接收內容。
我解決了這個問題。 代碼是吹的。
- (void)configSession{
dispatch_async(dispatch_get_main_queue(), ^{
if (![WCSession isSupported]) {
return;
}
_session = [WCSession defaultSession];
[_session setDelegate:self];
[_session activateSession];
});
}
但是我在主線程中沒有看到任何需要調用該方法的文檔。 而且這個方法是在主線程之前調用的,所以我覺得可能是runloop的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.