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

时间:2016-02-08 16:24:24

标签: ios objective-c iphone apple-watch wcsession

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

我已经在两侧配置了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在viewDidLoad方法中声明,它包含数据。

在接收方(Watch Extension) 我配置WCSession并在ExtensionDelegate.m中接收数据,如下所示:

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

    }
}

2 个答案:

答案 0 :(得分:2)

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

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)
  

请注意:   如果对方应用未打开或会话未配对且处于活动状态,则此发送可能会失败。因此,如果您不能错过任何数据,请使用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])

答案 1 :(得分:1)

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