Ios 数据没有从iphone传输到真实设备上的iWatch(AppleWatch)
我有一个iOS应用程序,我在appleWatch上为它编程了一个扩展。 我正在使用transferUserInfo方法将数据(NSDictionary)发送到appleWatch扩展。一切都在模拟器中运行,但当我试图在真实设备上运行应用程序时,似乎iWatch没有收到任何东西,尽管iPhone正在发送数据(我发现这是因为我调试了发送方) 我已经在两侧配置了WCSession。我已经在我应该接收数据的类中确认了WCSessionDelegate。 我使用session:didReceiveUserInfo:method在ExtensionLegate中接收数据,但仍然像我说的那样,在模拟器中一切正常,但在实际设备上没有传输任何数据 有人知道问题出在哪里吗 代码如下: 在发送方: 在我的班级里,MensaViewController.mIos 数据没有从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
- (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")
}
})