数据未从 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 在 viewDidLoad 方法中声明,它包含数据。
在接收方(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 iPhone
message。我建议您使用- 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 未配对且未激活,则此发送可能会失败。所以,如果你不能错过任何数据,你应该使用
updateApplicationContext
或transferUserInfo
(我实际上更喜欢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)的主要内容,如果未能解决你的问题,请参考以下文章
iPhone 未从 Apple Watch 接收应用程序上下文
如何将 iPhone 应用程序从 Xcode 4.3.1 部署到具有 IOS 5.0.1 越狱的真实 iPhone 设备 [重复]