Ios Watchkit OS 2,WCSession在后台运行
我有这段代码,当我在iPhone模拟器中打开应用程序时,它就可以工作了 并在Ios Watchkit OS 2,WCSession在后台运行,ios,objective-c,watchkit,watchos-2,Ios,Objective C,Watchkit,Watchos 2,我有这段代码,当我在iPhone模拟器中打开应用程序时,它就可以工作了 并在ViewDidLoad中调用它。但如果我调用此应用程序内代理,我不能调用: - (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext 但我希望它能在后台运行。 我该怎么做 这是iPhone的.delega
ViewDidLoad
中调用它。但如果我调用此应用程序内代理,我不能调用:
- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext
但我希望它能在后台运行。
我该怎么做
这是iPhone的.delegate
- (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;
}
在视图控制器中
-(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];
在iOS端的视图控制器中激活
WCSession
不是一个好选择,因为如果在后台视图控制器中启动应用程序,则永远不会加载。
您应该在应用程序代理的应用程序: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
方法移动到了您的应用程序委托
- (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];
}
}
然后,当您需要向手表发送任何类型的数据时,您可以检索默认会话并调用方法,如updateApplicationContext:error:
WCSession* session = [WCSession defaultSession];
[session updateApplicationContext:applicationDict error:nil];
谢谢,但是如何添加[self.session updateApplicationContext:applicationDict error:nil];从iPhone到.M,我需要调用self.session=[WCSession defaultSession];self.session1.delegate=self;[自我会话1激活会话];您必须将视图控制器的.m文件中的
viewdiload
中的代码移动到方法应用程序:didfishlaunchwithoptions:
insideAppDelegate.m
,创建项目时,此方法应由Xcode添加,如果不存在,则添加它。我在应用程序中添加了很好的功能:完成启动时使用了选项,但对于view controller。M我需要再次调用会话,如果可能的话,请给出示例或编写正确的代码,谢谢我需要在我的view controller中调用,因为我需要在viewController中调用会话,以便在应用程序委派后使用,但这是无效的[self.session updateApplicationContext:applicationDict error:nil];当我在应用程序中调用会话时:didFinishLaunchingWithOptions:before return在watch和view controller之间无法将所有数据发送到Viewcontroller之后