Проблемы с отправкой данных с iPhone на WatchOS с использованием контекста приложения - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь отправить данные из моего приложения iOS в сопутствующее приложение WatchOS с помощью WCSession.Приложение iOS было создано с использованием NativeScript, поэтому требуется Objective-C.

При запуске приложений на симуляторах и реальных устройствах я получаю следующее сообщение об ошибке:

[WC] WCSession отсутствует свой делегат

Я возился с этим несколько дней, но не могу решить эту проблему.

Код iOS Objective-C (это называетсяв машинописном тексте):

#import "SendToWatch.h"
#import <WatchConnectivity/WatchConnectivity.h>

@interface SendToWatch () <WCSessionDelegate>

@end

@implementation SendToWatch

- (void)sendData: (double)value {
    if (WCSession.isSupported) {
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];

        NSError *error = nil;
        NSDictionary *applicationDict = @{@"data":[NSString stringWithFormat:@"%0.2f", value]};
        [session updateApplicationContext:applicationDict error:nil];

        if (error) {
            NSLog(@"%@", error.localizedDescription);

        }

    }
}

//MARK: - WCSessionDelegate

- (void)session:(WCSession *)session
activationDidCompleteWithState:(WCSessionActivationState)activationState
          error:(NSError *)error {
}

- (void)sessionDidBecomeInactive:(WCSession *)session {
    NSLog(@"Session Did Become Inactive");
}

- (void)sessionDidDeactivate:(WCSession *)session {
    NSLog(@"-- Session Did Deactivate --");
    [session activateSession];
}

@end

WatchOS (InterfaceController.m):

#import "InterfaceController.h"
#import <WatchConnectivity/WatchConnectivity.h>

@interface InterfaceController () <WCSessionDelegate>

@end

@implementation InterfaceController

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];

    // Creates a WCSession to allow iPhone connectivity
    if ([WCSession isSupported]) {
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
        NSLog(@"-- WCSession Active --");
    }
}

- (void)willActivate {
    [super willActivate];
    NSLog(@"-- Controller Activated --");
}

- (void)didDeactivate {
    [super didDeactivate];
    NSLog(@"-- Controller Deactive --");
}

//MARK: - WCSessionDelegate

// Receieves the data sent from the iPhone app
- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary *)applicationContext {
    NSString *receivedData = [applicationContext objectForKey:@"data"];

    NSLog(@"-- APPLICATION CONTEXT RECEIVED --");
    NSLog(@"-- Received from iOS App: %@", applicationContext);

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.dataLabel setText:receivedData];
        NSLog(@"-- DATA UPDATED --");
    });
}

- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(NSError *)error {
}

@end

1 Ответ

0 голосов
/ 27 сентября 2019

Вам нужно переместить конфигурацию сеанса и код активации

if ([WCSession isSupported]) {
   WCSession* session = [WCSession defaultSession];
   session.delegate = self;
   [session activateSession];
}

куда-нибудь в начале жизненного цикла приложения iOS, а не в сообщении sendData.

...