WatchOS 2-iOS用户默认共享

WatchOS 2-iOS用户默认共享,ios,nsuserdefaults,watchkit,watchos-2,ios-app-group,Ios,Nsuserdefaults,Watchkit,Watchos 2,Ios App Group,我正在尝试在iOS和WatchOS 2之间同步用户详细信息。在以前版本的WatchKit应用程序组中,分享这样的偏好是非常好的,但在版本2中,我也在为同样的偏好而奋斗 现在,我尝试使用WCSession的transferUserInfo:方法发送用户信息,然后将该用户信息保存到watchOS的userDefaults中。但问题是这样的细节手表必须首先要求iPhone发送用户信息。若iPhone应用程序并没有被使用,那个么在这种情况下,Watch应用程序并不能反映用户信息的变化 有人对WatchO

我正在尝试在iOS和WatchOS 2之间同步用户详细信息。在以前版本的WatchKit应用程序组中,分享这样的偏好是非常好的,但在版本2中,我也在为同样的偏好而奋斗

现在,我尝试使用
WCSession
transferUserInfo:
方法发送用户信息,然后将该用户信息保存到watchOS的userDefaults中。但问题是这样的细节手表必须首先要求iPhone发送用户信息。若iPhone应用程序并没有被使用,那个么在这种情况下,Watch应用程序并不能反映用户信息的变化


有人对WatchOS 2中的这种实现有想法吗?我做得对吗?请建议是否有人知道这一点。

如果您在手表上使用
WCSession
sendMessage
API,如果iOS应用尚未运行,它将在后台唤醒。所以你可以这样做:

手表分机代码:

[[WCSession defaultSession] sendMessage:@{@"cmd":@"sendUpdate"} replyHandler:nil errorHandler:^{ /*handle errors*/ }]
iOS应用程序代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    <...>
    [[WCSession defaultSession] setDelegate:self];
    [[WCSession defaultSession] activateSession];
    <...>
}

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

- (void)sessionDidBecomeInactive:(WCSession *)session
{}

- (void)sessionDidDeactivate:(WCSession *)session
{
    [session activateSession];
}

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message {
    NSString *cmd = message[@"cmd"];
    if ([cmd isEqual:@"sendUpdate"]) {
        [self sendUpdate];
    }
}

- (void)sendUpdate {
    WCSession *session = [WCSession defaultSession];
    if (session.isWatchAppInstalled && session.activationState == WCSessionActivationStateActivated) {
        [[WCSession defaultSession] transferUserInfo:[self dictionaryFullOfUpdates]];
    }
}
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项{
[[WCSession defaultSession]setDelegate:self];
[[WCSession defaultSession]activateSession];
}
-(void)会话:(WCSession*)会话激活IDCompleteWithState:(WCSessionActivationState)激活状态错误:(可为null的NSError*)错误{
}
-(void)会议经济活动:(WCSession*)会议
{}
-(无效)会话IDDeactivate:(WCSession*)会话
{
[会话激活会话];
}
-(void)会话:(WCSession*)会话didReceiveMessage:(NSDictionary*)消息{
NSString*cmd=message[@“cmd”];
如果([cmd isEqual:@“sendUpdate”]){
[自我更新];
}
}
-(无效)发送更新{
WCSession*会话=[WCSession defaultSession];
如果(session.isWatchAppInstalled&&session.activationState==WCSessionActivationStateActivated){
[[WCSession defaultSession]transferUserInfo:[self DictionaryFullOfUpdate]];
}
}

这显然比您可能要做的要简单,但应该给您一个想法

如果您在手表上使用
WCSession
sendMessage
API,它将在后台唤醒尚未运行的iOS应用程序。所以你可以这样做:

手表分机代码:

[[WCSession defaultSession] sendMessage:@{@"cmd":@"sendUpdate"} replyHandler:nil errorHandler:^{ /*handle errors*/ }]
iOS应用程序代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    <...>
    [[WCSession defaultSession] setDelegate:self];
    [[WCSession defaultSession] activateSession];
    <...>
}

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

- (void)sessionDidBecomeInactive:(WCSession *)session
{}

- (void)sessionDidDeactivate:(WCSession *)session
{
    [session activateSession];
}

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message {
    NSString *cmd = message[@"cmd"];
    if ([cmd isEqual:@"sendUpdate"]) {
        [self sendUpdate];
    }
}

- (void)sendUpdate {
    WCSession *session = [WCSession defaultSession];
    if (session.isWatchAppInstalled && session.activationState == WCSessionActivationStateActivated) {
        [[WCSession defaultSession] transferUserInfo:[self dictionaryFullOfUpdates]];
    }
}
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项{
[[WCSession defaultSession]setDelegate:self];
[[WCSession defaultSession]activateSession];
}
-(void)会话:(WCSession*)会话激活IDCompleteWithState:(WCSessionActivationState)激活状态错误:(可为null的NSError*)错误{
}
-(void)会议经济活动:(WCSession*)会议
{}
-(无效)会话IDDeactivate:(WCSession*)会话
{
[会话激活会话];
}
-(void)会话:(WCSession*)会话didReceiveMessage:(NSDictionary*)消息{
NSString*cmd=message[@“cmd”];
如果([cmd isEqual:@“sendUpdate”]){
[自我更新];
}
}
-(无效)发送更新{
WCSession*会话=[WCSession defaultSession];
如果(session.isWatchAppInstalled&&session.activationState==WCSessionActivationStateActivated){
[[WCSession defaultSession]transferUserInfo:[self DictionaryFullOfUpdate]];
}
}
这显然比你可能会做的简单,但应该给你一个想法