Ios 数据没有从iphone传输到真实设备上的iWatch(AppleWatch)

Ios 数据没有从iphone传输到真实设备上的iWatch(AppleWatch),ios,objective-c,iphone,apple-watch,wcsession,Ios,Objective C,Iphone,Apple Watch,Wcsession,我有一个iOS应用程序,我在appleWatch上为它编程了一个扩展。 我正在使用transferUserInfo方法将数据(NSDictionary)发送到appleWatch扩展。一切都在模拟器中运行,但当我试图在真实设备上运行应用程序时,似乎iWatch没有收到任何东西,尽管iPhone正在发送数据(我发现这是因为我调试了发送方) 我已经在两侧配置了WCSession。我已经在我应该接收数据的类中确认了WCSessionDelegate。 我使用session:didReceiveUser

我有一个iOS应用程序,我在appleWatch上为它编程了一个扩展。 我正在使用transferUserInfo方法将数据(NSDictionary)发送到appleWatch扩展。一切都在模拟器中运行,但当我试图在真实设备上运行应用程序时,似乎iWatch没有收到任何东西,尽管iPhone正在发送数据(我发现这是因为我调试了发送方)

我已经在两侧配置了WCSession。我已经在我应该接收数据的类中确认了WCSessionDelegate。 我使用session:didReceiveUserInfo:method在ExtensionLegate中接收数据,但仍然像我说的那样,在模拟器中一切正常,但在实际设备上没有传输任何数据

有人知道问题出在哪里吗

代码如下: 在发送方:

在我的班级里,MensaViewController.m

- (void)viewDidLoad
   if ([WCSession isSupported]) {
        session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
   }
   NSLog(@"A dish is being sent");
  [session transferUserInfo:dishDictionary];
}
dishDictionary在viewDidLoad方法中声明,它包含数据

在接收器侧(手表分机) 我在extensionelegate.m中配置WCSession并接收数据,如下所示:

- (void)applicationDidBecomeActive {
    if ([WCSession isSupported]) {
        session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
        NSLog(@"Session activated in iWatch");
    }
}
我有这个方法来接收数据:

- (void)session:session didReceiveUserInfo:(NSDictionary<NSString *,id> *)userInfo{

    NSLog(@"Received data from the iPhone");

    NSArray<NSString*> *dictionaryKeys = userInfo.allKeys;
    for(int i = 0; i < dictionaryKeys.count; i++){
        Boolean equalsMensaString = [dictionaryKeys[i] isEqualToString:@"beilagen"];
        if(equalsMensaString)
            [self handleTransferredDish:userInfo];

        Boolean equalsNewsString = [dictionaryKeys[i] isEqualToString:@"article"];
        if(equalsNewsString)
            [self handleTransferredNews:userInfo];

        Boolean equalsEventString = [dictionaryKeys[i] isEqualToString:@"description"];
        if(equalsEventString)
            [self handleTransferredEvents:userInfo];

    }
}
-(void)会话:会话didReceiveUserInfo:(NSDictionary*)userInfo{
NSLog(@“从iPhone接收数据”);
NSArray*dictionaryKeys=userInfo.allkey;
for(int i=0;i
如果查看源函数描述,可以看到用于传输数据的方法的描述:

public func transferUserInfo(userInfo: [String : AnyObject]) -> WCSessionUserInfoTransfer
系统将用户信息字典排队,并将其传输到 在适当的时候开发相应的应用程序。用户信息的传输 将在发送应用程序退出后继续。对应应用程序 将在下次启动时收到委托回调(如果文件已 成功到达。userInfo字典只能接受 属性列表类型

因此..无法保证系统会在您实际使用应用程序时发送此
userInfo

请改用以下方法:

public func sendMessage(message: [String : AnyObject], replyHandler: (([String : AnyObject]) -> Void)?, errorHandler: ((NSError) -> Void)?)
客户端可以使用此方法向对方应用程序发送消息。希望收到对特定问题的答复的客户 消息应在replyHandler块中传递。如果无法发送消息 已发送或如果无法接收回复,则errorHandler块 将使用错误调用。如果回答者和 如果指定了errorHandler,则将只调用其中一个。 只能在发送应用程序运行时发送消息。如果 发送应用程序在发送消息之前退出发送将失败。 如果对应应用程序未运行,则对应应用程序将被禁用 收到消息后启动(仅限iOS对应应用程序)。这个 消息字典只能接受属性列表类型

以及接收:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)
注意: 如果对方应用程序未打开或会话未配对且未激活,则此发送可能失败。因此,如果您不能错过任何数据,您应该使用
updateApplicationContext
transferUserInfo
(实际上我更喜欢
updateApplicationContext

并确保您在收到这些案例时正确执行


func会话(会话:WCSession,didReceiveApplicationContext应用上下文:[字符串:AnyObject])

我知道我来不及回答自己的问题了。我们使用的是苹果手表2和iPhone5或6(2年后就不记得了!),发生的一切都很神奇,因为苹果手表的电池电量非常低(在5-10%的范围内)。即使给苹果手表充电,我们也没有任何问题。结束

您是否在日志中看到从iPhone收到的数据。我建议您使用
-session:didfinishUserInfo:error:
注销错误。顺便说一下,尝试将扩展代码放入
applicationdFinishLaunching
方法当应用程序的两侧都打开时,您是否在手表上接收数据?我在模拟器中接收数据,但在真正的iWatch上执行时,我没有任何数据显示,甚至在我收到数据的日志中都没有。我将尝试其他方法,并应用您的建议,希望它能起作用:)我尝试了这里所述的方法,但不幸的是,它仍然不起作用。我找到了另一个项目,并在iWatch上执行了它,它使用sendMessage和transferUserInfo工作得非常好。我会再试一次,一旦发现问题所在,我会在这里发布。我知道这一点,但问题是,我不希望用户每次想要查看iWatch应用程序中已经提供的内容时都打开他的iPhone应用程序。那没有道理。使用session:transferUserInfo:我今天早上能够传输数据,但是在它工作一次之后,就再也没有工作过。奇怪的是,我的代码中连一个字符都没有更改。即使在我重启mac、iPhone和iWatch之后,它仍然工作了,而且再也没有工作过。
session.sendMessage(messageData, replyHandler: { (replyData) -> Void in
            replyHandler?(replyData)
            }, errorHandler: { (error) -> Void in
                print("error: code:\(error.code) - \(error.localizedDescription)")
                errorHandler?(error)
                 do {
                        try session.updateApplicationContext(messageData)
                    } catch {
                        print("There was an error trying to update watchkit app on the background")
                    }
        })