我正在尝试构建一个支持OS2上的多个复杂系列的应用程序,如模块化大型,实用大型,圆形小型等,每个都显示来自应用程序的各种有意义的信息.我知道并发症与我们在用户交互方面的OS1之后的一瞥略有相似之处,即它在用户点击它时打开应用程序而在那里没有特殊的交互.
乍一看,我能够根据当前的浏览内容对应用程序进行深层链接,但我正在寻找一种方法来解决复杂问题.
所以我的问题是,当用户点击我的应用程序的复杂功能时,我会得到任何类型的上下文信息,说明这个复杂功能被点击等等.我在想,如果我可以在上下文中获得一个CLKComplication对象.
任何帮助表示赞赏.
我正在WatchOS上构建一个非常简单的锻炼应用程序:其中一个功能是在训练期间提供音频反馈.我可以在显示器打开时播放文件,但是当显示器很暗时,手表不会播放我的文件.
有人可以查看我的快速代码并帮助我弄清楚我错过了什么吗?
这是我的extensionDelegate.swift:
var audioPlayer = AVAudioPlayer()
class ExtensionDelegate: NSObject, WKExtensionDelegate {
func applicationDidFinishLaunching() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryAmbient, with: .duckOthers)
} catch {
print("audiosession cannot be set")
}
do { try audioSession.setActive(true) }
catch {
print ("audiosession cannot be activated")
}
let test = URL(fileURLWithPath: Bundle.main.path(forResource: "1", ofType: "m4a")!)
try! audioPlayer = AVAudioPlayer(contentsOf: test)
audioPlayer.prepareToPlay()
audioPlayer.play()
}
func applicationDidBecomeActive() {
// Restart any tasks that were paused (or not yet started) while the application was …Run Code Online (Sandbox Code Playgroud) 当应用程序在后台触发任务时更新位置.但无法使用后台模式执行任务.我的scheduleBackgroundRefreshWithPreferredDate示例代码如下所示
[WKExtension.sharedExtension scheduleBackgroundRefreshWithPreferredDate:[NSDate dateWithTimeIntervalSinceNow:60] userInfo:nil scheduledCompletion:^(NSError * _Nullable error) {
if(error == nil) {
NSLog(@"background refresh task re-scheduling successfuly ");
} else{
NSLog(@"Error occurred while re-scheduling background refresh: %@",error.localizedDescription);
}
}];
Run Code Online (Sandbox Code Playgroud)
计划任务重新安排后 handleBackgroundTasks:
- (void)handleBackgroundTasks:(NSSet<WKRefreshBackgroundTask *> *)backgroundTasks
{
for (WKRefreshBackgroundTask * task in backgroundTasks) {
if ([task isKindOfClass:[WKApplicationRefreshBackgroundTask class]]) {
WKApplicationRefreshBackgroundTask *backgroundTask = (WKApplicationRefreshBackgroundTask*)task;
// location update methods schedule as background task
[self startLocationUpdate];
[backgroundTask setTaskCompleted];
} else if ([task isKindOfClass:[WKSnapshotRefreshBackgroundTask class]]) {
WKSnapshotRefreshBackgroundTask *snapshotTask = (WKSnapshotRefreshBackgroundTask*)task;
[snapshotTask …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 WatchKit 中实现登录方案(这里不应该关心用户是否在手表中输入数据),这意味着登录后,用户应该看到一个不允许他查看的视图返回登录屏幕(<左上角没有)
如果用户被踢出会话(例如,未支付订阅费用时),我希望应用程序返回到登录屏幕。
从登录屏幕重定向到主屏幕可以正常使用
DispatchQueue.main.async() { [weak self] in
WKInterfaceController.reloadRootControllers(
withNames: ["mainController"], contexts: [values]
)
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在主控制器中使用相同的方法时
DispatchQueue.main.async() { [weak self] in
WKInterfaceController.reloadRootControllers(
withNames: ["loginController"], contexts: [message]
)
}
Run Code Online (Sandbox Code Playgroud)
登录屏幕显示,但主屏幕中的视图控制器保持活动状态,不断接收来自其他对象的通知并不断生成新的登录控制器。我已经尝试过了
self?.pop()
self?.dismiss()
self?.popToRootController()
self?.presentController(withName:
Run Code Online (Sandbox Code Playgroud)
这些似乎都没有停用主控制器。在这种情况下我能做什么?
我不需要主控制器中的任何内容,因为我将在成功登录后创建一个新控制器,那么如何确保完全销毁该对象?我不想处理 mainController 中的所有引用、侦听器、计时器……这就是为什么我完全可以销毁它。
我尝试导入 watchOS 的 SpeechKit 框架并收到错误。有什么办法可以和手表一起使用吗?当我导入 Speechkit 框架时出现错误,提示“没有这样的模块语音”
import WatchKit
import Foundation
import Speech
class SpeechInterfaceController: WKInterfaceController, SFSpeechRecognizerDelegate {
override func awake(withContext context: Any?) {
super.awake(withContext: context)
// Configure interface objects here.
}
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
}
override func didDeactivate() {
// This method is called when watch view controller is no longer visible
super.didDeactivate()
}
Run Code Online (Sandbox Code Playgroud)
}
在testflight审核期间,我遇到了以下问题:
来自Apple2。3性能:准确的元数据性能-2.3
我们无法在运行OS3的Apple Watch上安装应用程序扩展。设置Info.plist中的UIRequiredDeviceCapabilities键的方式是,该应用程序不会安装在运行OS3的Apple Watch上。
下一步
请检查UIRequiredDeviceCapabilities密钥以验证其仅包含应用程序功能所需的属性或设备上不得存在的属性。如果需要,由字典指定的属性应设置为true,如果设备上不存在这些属性,则应设置为false。
现在,我的应用程序几乎是Watch OS3的Xcode示例项目,我没有以任何方式干预UIRequiredDeviceCapabilities。
实际上,“ Watch App”目标和“ Watch App Extension”目标都没有“ UIRequiredDeviceCapabilities”条目,只有iOS主要目标具有:
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
Run Code Online (Sandbox Code Playgroud)
直接通过Xcode将其提供给设备时,该应用也可以在带有Watch OS3的手表上很好地安装。
我想为watchOS 3创建一个复杂功能,只需启动我的应用程序.我用XCode创建了ComplicationController:
class ComplicationController: NSObject, CLKComplicationDataSource
{
// MARK: - Timeline Configuration
func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) {
handler([.forward, .backward])
}
func getTimelineStartDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) {
handler(nil)
}
func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) {
handler(nil)
}
func getPrivacyBehavior(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationPrivacyBehavior) -> Void) {
handler(.showOnLockScreen)
}
// MARK: - Timeline Population
func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) …Run Code Online (Sandbox Code Playgroud) 根据watchOS的《应用程序编程指南》,可以将数据存储在watch应用程序的“文档”文件夹中。我的代码似乎也成功完成了此操作,因为没有错误。
但是,要真正调试它,我想知道是否有某种方法可以通过GUI来访问设备上的数据进行调试(例如,使用UIFileSharingEnabled下载iTunes进行iTunesFilesharing )。
在watchOS 3中使用SpriteKit时,如何处理触摸事件?我正在从iOS移植SpriteKit游戏,并且下面的代码无法正常工作。还是必须以某种方式控制WKInterfaceController?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {}
Run Code Online (Sandbox Code Playgroud) 我正在处理一个应该在几分钟内提供倒计时的并发症?假设用户将其指定为 25 分钟,因此复杂功能应每分钟更新一次计数,直到达到 0。
根据我的研究,应该使用scheduleBackgroundRefreshAPI 调用更新复杂性。但是,看起来苹果并不能保证 watchOS 唤醒应用程序的准确时间。此外,每分钟安排一次刷新似乎是一种错误的方法。
我还考虑getTimelineEntries在我的CLKComplicationDataSource. 然而,这也没有奏效。
有没有合适可靠的方法来制作这种类似秒表的复杂功能?
watchos-3 ×10
watchkit ×7
ios ×5
swift ×5
apple-watch ×1
launch ×1
objective-c ×1
speechkit ×1
sprite-kit ×1
watch ×1
watchos-2 ×1
watchos-4 ×1