所以我使用Watch Connectivity来请求从iPhone到Watch的阵列.
这个想法sendMessage来自手表,iPhone将在didReceiveMessage方法中回复数组.
然而,iPhone似乎没有响应,我认为iPhone会在我从Watch发送消息时打开应用程序.我甚至尝试打开应用程序,sendMessage但仍然没有运气.当我等待足够长时间时,我收到以下错误消息:
错误域= WCErrorDomain代码= 7012"消息回复花了太长时间." UserInfo = {NSLocalizedDescription =消息回复耗时太长.,NSLocalizedFailureReason =发生回复超时.}
有人知道我哪里出错吗?
Apple Watch
import WatchKit
import Foundation
import CoreData
import WatchConnectivity
class BookmarkedInterfaceController: WKInterfaceController, WCSessionDelegate {
var session : WCSession!
var objects: [AnyObject]!
@IBOutlet var table: WKInterfaceTable!
override func willActivate() {
super.willActivate()
//Check if session is supported and Activate
if (WCSession.isSupported()) {
session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
sendMessageToIphone()
}
func sendMessageToIphone() {
if WCSession.defaultSession().reachable {
print("WCSession is reachabe")
let …Run Code Online (Sandbox Code Playgroud) 我正在使用WatchConnectivity框架从我的应用程序接收一个字符串.这是我如何从应用程序发送Obj-C中的字符串:
-(void) viewDidLoad {
//WATCHKIT
WCSession* session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
[self sendInfoToWatch];
}
-(void) sendInfoToWatch {
WCSession* session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
[session sendMessage:@{@"a":@"hello"} replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
} errorHandler:^(NSError * _Nonnull error) {
}];
}
Run Code Online (Sandbox Code Playgroud)
我的Watch应用程序在Swift中.这是我检索消息的方式:
注意: "支持wc会话"工作并记录到控制台
override func willActivate() {
if(WCSession.isSupported()){
NSLog("wc session is supported")
self.session = WCSession.defaultSession()
self.session.delegate = self
self.session.activateSession()
}
super.willActivate()
}
Run Code Online (Sandbox Code Playgroud)
永远不会调用以下函数,NSLog的任何一个都不会显示,因此QRCodeTitleLabel不会更新其文本.
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
//recieving …Run Code Online (Sandbox Code Playgroud) 因此,WatchOS 2 支持核心运动框架,并允许活动的 WatchKit 应用程序访问来自 Apple Watch 加速计的数据。我想访问这些数据,但是是在 iPhone 上。除了在手表上打开一个应用程序来收集数据并通过手表连接将其传输回手机之外,还有其他方法可以做到这一点吗?
在 Healthkit 中,手表收集的所有数据都会同步回手机,这意味着我的 iPhone 应用程序可以通过 HKSampleQuery 直接获取数据。我想知道 Healthkit 中的“Active Energy”记录是否只是手表核心运动加速度计数据的汇总,但我不确定。
我曾考虑过使用手表连接和 SendMessage 将手表从 iPhone 上唤醒并获取数据,但我读到这是不可能的。我可以从手表上唤醒 iPhone,但反之则不行。
我看过 WWDC 2015 视频,包括“核心运动的新增功能”。它显示您可以在手表上获取核心运动数据,但无法在iPhone上获取手表核心运动数据。
有什么建议么?谢谢
我正在尝试使用 WatchConnectivity 框架将字符串从 Apple Watch 发送到 iPhone。
\n\n我启动了两个会话,一个是 WCSession,一个是 HKSession,因为我想在读取心率信息时将其从手表传输到 iPhone。(如果有更好的方法请告诉我)。
\n\n如果有帮助,我已经发布了我收到的日志消息。
\n\n2017-04-14 20:01:24.660433-0400 MoodTunes WatchKit Extension[180:16033] [WC] -[WCSession _onqueue_notifyOfMessageError:messageID:withErrorHandler:] AD8F92C9-FCAA-45B0-9B4C-0D5C95B72BEE\n errorHandler: YES with WCErrorCodeTransferTimedOut->IDSErrorTypeTimedOut-\n>IDSResponseTimedOut\nWatch send failed with error Error Domain=WCErrorDomain Code=7017 "Transfer \ntimed out." UserInfo={NSUnderlyingError=0x175a7da0 {Error \nDomain=com.apple.identityservices.error Code=23 "Timed out" UserInfo=\n{NSUnderlyingError=0x1752d4f0 {Error Domain=com.apple.ids.idssenderrordomain \nCode=12 "(null)"}, NSLocalizedDescription=Timed out}}, \nNSLocalizedDescription=Transfer timed out.} \nRun Code Online (Sandbox Code Playgroud)\n\niPhone ViewController.swift
\n\nimport HealthKit\nimport WatchKit\nimport Foundation\nimport CoreLocation\nimport WatchConnectivity\nimport UIKit\n\nclass ViewController: UIViewController, CLLocationManagerDelegate, \nWCSessionDelegate { \n\n@IBOutlet weak var timerLabel: UILabel!\n@IBOutlet weak var milesLabel: UILabel!\n@IBOutlet …Run Code Online (Sandbox Code Playgroud) 概述:
WCSession尽管它们已配对,但我无法在手表或手机模拟器上激活在 Xcode Devices 窗口中,我的手表模拟器和手机模拟器是配对的。我可以使用 WatchKit App 方案启动我的手表应用程序(它也启动手机模拟器,但不打开移动应用程序)。然后我通过单击手机模拟器上的应用程序图标来启动我的移动应用程序。
移动应用:
ViewController 工具 WCSessionDelegateviewDidLoad方法中被激活观看应用:
InterfaceController 工具 WCSessionDelegatewillActivate方法中被激活当我运行 WatchKit 应用程序时,会记录以下消息:
[WC] WCSession has not been activated
Run Code Online (Sandbox Code Playgroud)
当我通过单击应用程序图标打开移动应用程序时,我收到以下消息:
[WC] WCSession has not been activated
Apple Watch is not paired
[WC] WCSession has not been activated
WatchKit app is not installed on the paired watch
Run Code Online (Sandbox Code Playgroud)
(我添加了日志语句来显示检查结果isPaired和isWatchAppInstalled移动应用程序中的会话)
我的 …
我正在尝试将手表扩展添加到我现有的应用程序中。我的申请必须登录。如果用户登录与否,我如何从手表应用程序检查......并且当用户登录时,我想将该登录数据从应用程序传递给手表应用程序。我不知道如何将登录数据传递给观看应用程序。
我正在开发一个必须使用 WCSession 向 Apple Watch 应用程序发送更新的 iOS 应用程序。它在 iOS/Watch 模拟器中完美运行,但在真实设备中却无法运行。
当我尝试使用sendMessage:replyHandler:errorHandler:方法发送消息时,如果 Apple Watch 应用程序在后台,我会收到以下错误:
[WCSession _onqueue_notifyOfMessageError:messageID:withErrorHandler:] B322D88E-8F50-4BAB-86FF-AFD3B851E1CC errorHandler: NO with WCErrorCodeMessageReplyFailed -> WCErrorCodeNotReachable
但在我的代码中,我添加了各种检查:
if (_session &&
_session.isPaired &&
_session.isWatchAppInstalled &&
_session.isReachable &&
_session.activationState == WCSessionActivationStateActivated)
{
[_session sendMessage:dictionary
replyHandler:nil
errorHandler:^(NSError * _Nonnull error) {
NSLog(@"%@",error);
}
];
}
else
{
[_session transferUserInfo:dictionary];
}
Run Code Online (Sandbox Code Playgroud)
是否有任何原因可以在发送消息时收到“无法访问”错误消息,但session.isReachable返回true?
我还处理了无法访问会话的情况,并且我正在将消息排入队列transferUserInfo:,但由于会话被检测为可访问,因此消息会立即发送,因此它丢失了。
我正在构建一个 watchOS 应用程序,它需要定期从配套的 iPhone 应用程序请求信息以刷新复杂功能。
为了实现这一点,我有一个WKApplicationRefreshBackgroundTask定期运行的。它使用sendMessage(_:replyHandler:errorHandler:)fromWatchConnectivity从 iPhone 应用程序请求信息、处理回复并更新复杂功能。
大多数情况下,这对许多用户来说都是可靠的,但是,我在 Xcode 中看到 Apple Watch 崩溃sendMessage(_:replyHandler:errorHandler:),我担心这会导致用户错过复杂功能更新。一些用户一直在抱怨复杂功能没有更新,因此我试图确定是否存在复杂功能在 watchOS 中刷新频率的常规限制之外的问题。
有没有人对我如何解决这个问题有任何建议?或者,您对我如何更好地解决导致崩溃的问题并找出预防方法有什么建议吗?
我在底部包含了一个崩溃的完整示例,以及处理后台任务的代码和处理从配对 iPhone 发送和接收值的代码。
我从不发送没有replyHandler 的消息,所以虽然其他人看到了问题,因为没有处理程序的消息的委托方法没有在 iPhone 上实现,但我认为这不是这里的问题。为了安全起见,我在 iPhone 上将委托方法实现为一个什么都不做的空方法。
2020 年 1 月 30 日更新:一位朋友建议,问题可能是该任务在仍在进行中时被 10 秒计时器标记为完成,从而在未完成的事情完成时导致内存问题,但不确定可以做什么关于它。也许这是这里问题的核心?
这是我的后台刷新代码ExtensionDelegate:
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
for task in backgroundTasks {
switch task {
case let backgroundTask as WKApplicationRefreshBackgroundTask:
// set a timer in case it doesn't complete
// the …Run Code Online (Sandbox Code Playgroud) 我正在制作一个独立的 Apple Watch 应用程序(但有一个配套的 iPhone 应用程序,它不是手表应用程序运行所必需的。)
如果安装了 iPhone 配套应用程序,该应用程序使用WatchConnectivity在设备之间同步数据。我可以在 iOS 应用程序上调用session.updateApplicationContext()并在 Watch 应用程序上接收session(didReceiveApplicationContext)。但走另一条路是不可能的。我总是收到 7018 的 NSError 代码,这意味着未安装 iOS 配套应用程序。
我已经确保 watchOS 和 iOS 应用程序都安装在模拟器中(并在我的实际设备 iPhone 11 和 Watch series 5 上进行了测试。)但是从 watchOS -> iOS 得到相同的失败结果。
我注意到有一个新的WCSession实例变量可用于 watchOS 6.0+ isCompanionAppInstalled。当我在手表应用程序上激活 WCSession 后读取此变量时,它总是返回 false。
还有什么我需要注意的吗?我想也许我在所有不同的 info.plist 中做错了什么。但我已经检查了很多次。
我的 info.plist 文件:
在我的手表应用中:
WKWatchKitApp is YES
WKCompanionAppBundleIdentifier is com.abc.myapp
Run Code Online (Sandbox Code Playgroud)
在我的手表扩展中:
App can run independently of companion iPhone app is YES
NSExtension
WKAppBundleIdentifier is com.abc.myapp.watchkitapp
NSExtensionPointIdentifier …Run Code Online (Sandbox Code Playgroud) 我知道如何使用Watch Connectivity在 iOS 应用程序和 watchOS 应用程序之间进行通信。我发现它适用于 Mac Catalyst,但不适用于普通的 MacOS 应用程序。
是否有类似的方式可以在 macOS 应用程序和 watchOS 应用程序之间进行通信(使用 Swift)?我还没找到任何东西...请帮忙!
ios ×8
swift ×6
watchkit ×4
objective-c ×3
watchos ×3
healthkit ×2
wcsession ×2
apple-watch ×1
core-motion ×1
iphone ×1
macos ×1
watchapp ×1
watchos-2 ×1
xcode ×1