私は XCode 7.3、iOS 9.3 を搭載した iPhone5、WatchOS 2.2 を搭載した Apple Watch を持っています。
Watch アプリをサポートしたい会社のプロジェクトがあります。最初に、空のプロジェクトを作成して、ウォッチキットとウォッチキット拡張機能が機能していることを確認しました。セッションが確立され、ウォッチがペアリングされていることがわかります。
しかし、会社のプロジェクトに同じコードを入れた後、一度だけ機能します: 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 拡張機能を削除し、再インストールしました。
AppDelegate INIT メソッドで iPhone WCSession をセットアップしてみました
空のプロジェクトで動作しているので、コードが間違っているとは思いません。環境設定に問題があるのだろうか。私は今、この問題に何日も苦労しています。したがって、すべてのヒントは高く評価されます。