我有一个WatchOS2应用程序,它通过WCSession
方法sendMessage:replyHandler:errorHandler:
与iOS应用程序通信
iOS应用程序正确响应,但我经常收到域WCErrorDomain
的代码为7014
的错误:"Payload not be delivered“
当iOS应用程序不在前台时,这种情况更常见。
4.我没有找到解决这个问题的办法,我希望你们中有人知道解决这个问题的办法
发布于 2016-09-08 13:46:38
对于在iOS10 beta 6和GM上有问题的任何人,并且您正在使用Swift3,解决方案是将iOS应用程序中的委托函数头更改为以下内容:
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
注意@转义和Any类型,而不是AnyObject类型。
发布于 2015-10-22 15:03:57
试试这个,这个解决了我的问题。在InterfaceController中,添加以下方法以将数据传递给phone。
-(void)sendDataToPhone:(NSDictionary* _Nonnull)dictData
{
if(WCSession.isSupported){
WCSession* session = WCSession.defaultSession;
session.delegate = self;
[session activateSession];
if(session.reachable)
{
[session sendMessage:dictData replyHandler: ^(NSDictionary<NSString *,id> * __nonnull replyMessage) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@".....replyHandler called --- %@",replyMessage);
// Play a sound in watch
[[WKInterfaceDevice currentDevice] playHaptic:WKHapticTypeSuccess];
});
}
errorHandler:^(NSError * __nonnull error) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Error = %@",error.localizedDescription);
});
}
];
}
else
NSLog(@"Session Not reachable");
}
else
NSLog(@"Session Not Supported");
}
#pragma mark - Standard WatchKit delegate
-(void)sessionWatchStateDidChange:(nonnull WCSession *)session
{
if(WCSession.isSupported){
WCSession* session = WCSession.defaultSession;
session.delegate = self;
[session activateSession];
}
}
在手机端,添加以下代码,用于从watch接收数据。
在didFinishLaunchingWithOptions中添加以下内容。
// Allocating WCSession inorder to communicate back to watch.
if(WCSession.isSupported){
WCSession* session = WCSession.defaultSession;
session.delegate = self;
[session activateSession];
}
现在添加WCSessionDelegate。
#pragma mark - WCSession Delegate
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler
{
if(message){
NSData *receivedData = [message objectForKey:@"AudioData"];
NSDictionary* response = @{@"response" : [NSString stringWithFormat:@"Data length: %lu",(unsigned long)receivedData.length]} ;
replyHandler(response);
}
}
#pragma mark - Standard WatchKit Delegate
-(void)sessionWatchStateDidChange:(nonnull WCSession *)session
{
if(WCSession.isSupported){
WCSession* session = WCSession.defaultSession;
session.delegate = self;
[session activateSession];
if(session.reachable){
NSLog(@"session.reachable");
}
if(session.paired){
if(session.isWatchAppInstalled){
if(session.watchDirectoryURL != nil){
}
}
}
}
}
希望本文能对您有所帮助:)
发布于 2016-12-17 18:09:06
对不起,我没有足够的声誉来评论答案。我的问题在彼得·罗伯特的回答中得到了解决:随着Swift 3的出现,WCErrorCodeDeliveryFailed出现了,解决方案只是将AnyObject更改为replyHandlers上的Any。
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
//code
replyHandler (answer as [String : Any])
}
https://stackoverflow.com/questions/33200630
复制相似问题