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

Posted

技术标签:

【中文标题】数据未从 iphone 传输到真实设备上的 iWatch (AppleWatch)【英文标题】:Data is not being transferred from iphone to iWatch (AppleWatch) on real devices 【发布时间】:2016-02-08 16:24:23 【问题描述】:

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

我在两边都配置了 WCSession。我已经在我应该接收数据的类中符合 WCSessionDelegate。 我正在使用 session:didReceiveUserInfo: 方法在 ExtensionDelegate 中接收数据,但仍然像我说的那样在模拟器中一切正常,但在真实设备上没有传输任何内容。

有人知道问题出在哪里吗?

代码如下: 在发送方:

在我的班级 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 在 vi​​ewDidLoad 方法中声明,它包含数据。

在接收方(Watch Extension) 我在 ExtensionDelegate.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];

    

【问题讨论】:

您在日志中看到Received data from the iPhonemessage。我建议您使用- session:didFinishUserInfoTransfer:error: 注销错误。对了,试着把扩展代码放在applicationDidFinishLaunching方法里 当应用程序两边都打开时,您的手表是否会收到数据? 我在模拟器中接收数据,但是在真正的 iWatch 上执行时,我没有得到任何数据显示,甚至在我收到数据的日志中也没有。 我会尝试其他方法并应用您的建议并希望它会起作用:) 我尝试了此处所述的方法,但不幸的是它仍然不起作用。我找到了另一个项目,并在 iWatch 上执行了它,它使用 sendMessage 和 transferUserInfo 完美运行。我会尝试更多,一旦我找出问题所在,我会在这里发布。 【参考方案1】:

如果您查看源函数描述,您可以看到您用于传输数据的方法的描述:

public func transferUserInfo(userInfo: [String : AnyObject]) -> WCSessionUserInfoTransfer

系统会将用户信息字典排入队列并传输到 在适当的时候对应的应用程序。用户信息传输 发送应用程序退出后将继续。对应应用 如果文件有,将在下次启动时收到委托回调 顺利到达。 userInfo 字典只能接受 属性列表类型。

所以..当您实际使用该应用程序时,无法保证系统会发送此userInfo

请改用以下方法:

public func sendMessage(message: [String : AnyObject], replyHandler: (([String : AnyObject]) -> Void)?, errorHandler: ((NSError) -> Void)?)

客户端可以使用此方法向对方应用发送消息。希望收到特定回复的客户 消息应该在replyHandler 块中传递。如果消息不能 已发送或者如果无法收到回复,则 errorHandler 块 将被错误调用。如果一个replyHandler 和一个 如果指定了errorHandler,那么将调用其中一个。 只能在发送应用程序运行时发送消息。如果 在发送消息之前发送应用程序退出发送将失败。 如果对应的应用程序没有运行,对应的应用程序将是 收到消息后启动(仅限 iOS 对应应用程序)。这 消息字典只能接受属性列表类型。

用于接收:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)

注意: 如果对应应用未打开或 Session 未配对且未激活,则此发送可能会失败。所以,如果你不能错过任何数据,你应该使用updateApplicationContexttransferUserInfo我实际上更喜欢updateApplicationContext

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")
                    
        )

并确保您收到这些案例并正确实施

func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject])

【讨论】:

我知道,但问题是,我不希望用户每次想要检查 iWatch 应用程序中已经提供的内容时都打开他的 iPhone 应用程序。这没有任何意义。使用 session:transferUserInfo: 今天早上我能够得到传输的数据,但是在它工作过一次之后,它就再也没有工作过。奇怪的是,我的代码中一个字符都没有改变。即使在我重新启动我的 Mac、iPhone 和 iWatch 后,它也能正常工作,并且再也没有工作过。【参考方案2】:

我知道我回答自己的问题已经太迟了。我们使用的是 Apple Watch 2 和 iPhone 5 或 6(2 年后不记得了!),发生的事情很神奇,因为 Apple Watch 的电池电量非常低(在 5-10% 范围内),一切都开始工作了。即使在为 Apple Watch 充电后,我们也没有任何问题。结束!

【讨论】:

以上是关于数据未从 iphone 传输到真实设备上的 iWatch (AppleWatch)的主要内容,如果未能解决你的问题,请参考以下文章

使用 NFC 的 iPhone 到 iPhone 数据传输

iPhone 未从 Apple Watch 接收应用程序上下文

iphone应用程序部署在设备中

如何将 iPhone 应用程序从 Xcode 4.3.1 部署到具有 IOS 5.0.1 越狱的真实 iPhone 设备 [重复]

如何快速将Windows电脑资料传输到苹果手机?这个方法你必须会

苹果手机怎么连接电脑传东西