Watchkit OS 2, WCSession работает в фоновом режиме

У меня есть этот код, он работает, когда я открываю приложение в симуляторе iPhone и вызываю это в ViewDidLoad, Но если я вызываю это в приложении делегата, я не могу позвонить:

- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext

в часы часть

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


       return YES;
}

но я хочу, чтобы приложение работало в фоновом режиме. Как я могу это сделать?

Это.delegate от iPhone

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {

        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

                    UIViewController *mainViewController = [storyboard instantiateInitialViewController];

                    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
                    self.window.rootViewController = mainViewController;
                    [self.window makeKeyAndVisible];

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

}
       return YES;

}

в ViewController

-(void)senddata:(NSString *)data {

    WCSession* session = [WCSession defaultSession];


    NSDictionary *applicationDict = ///
    [session updateApplicationContext:applicationDict error:nil];
}

Это от расширения

- (void)willActivate {
    // This method is called when watch view controller is about to be visible to user
    [super willActivate];

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



}

 [self.session updateApplicationContext:applicationDict error:nil];

1 ответ

Активация WCSession в контроллере представления на стороне iOS не очень хороший выбор, так как если приложение запускается в фоновом режиме, контроллеры никогда не будут загружены. Вы должны активировать его в application:didFinishLaunchingWithOptions: метод вашего приложения делегата.

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Any other code you might have

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

Здесь я предположил, что вы также перенесли свой WCSessionDelegate метод для вас приложение делегат.

Затем, когда вам нужно отправить любой тип данных в часы, вы можете получить сеанс по умолчанию и вызвать такие методы, как updateApplicationContext:error:

WCSession* session = [WCSession defaultSession];
[session updateApplicationContext:applicationDict error:nil];
Другие вопросы по тегам