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];