watchOS 中的扩展运行时会话在首次运行后停止工作

Posted

技术标签:

【中文标题】watchOS 中的扩展运行时会话在首次运行后停止工作【英文标题】:Extended Runtime Sessions in watchOS stops working after first run 【发布时间】:2020-05-07 09:32:01 【问题描述】:

我在使用 WKExtendedRuntimeSession 时遇到了一些问题。

    我在我的 ExtensionDelegate 中设置了WKExtendedRuntimeSessionDelegate 当应用程序处于活动状态时,我使用.start() 启动会话 我使用session.invalidate() 停止会话

当我再次启动它时,我收到以下错误:

-[WKExtendedRuntimeSession _start]:308: Unable to start sessions because state == WKExtendedRuntimeSessionStateInvalid. notifying delegate <MYAPP_Extension.ExtensionDelegate: 0x17e663d0>. Error is (null)

代码

我的扩展代理

var session = WKExtendedRuntimeSession()

class ExtensionDelegate: NSObject, WKExtensionDelegate, WKExtendedRuntimeSessionDelegate 

    func extendedRuntimeSession(_ extendedRuntimeSession: WKExtendedRuntimeSession, didInvalidateWith reason: WKExtendedRuntimeSessionInvalidationReason, error: Error?) 
        print("Session stopped at", Date())
    

    func extendedRuntimeSessionDidStart(_ extendedRuntimeSession: WKExtendedRuntimeSession) 
        print("Session started at", Date())
    

    func extendedRuntimeSessionWillExpire(_ extendedRuntimeSession: WKExtendedRuntimeSession) 

    

    func applicationDidBecomeActive() 

        session.delegate = self
    

我的开始发生在.onAppear(perform: session.start() )

取消:

func cancelNow() 
        self.timer.connect().cancel()
        session.invalidate()
        return
    

【问题讨论】:

【参考方案1】:

根据 Apple 文档:

调用 invalidate() 后,您无法再运行会话。而是创建并开始一个新会话。

https://developer.apple.com/documentation/watchkit/wkextendedruntimesession/3131065-invalidate

这样做:

var session: WKExtendedRuntimeSession!

private func startSession() 
    session = WKExtendedRuntimeSession()
    session.delegate = self
    session.start()

【讨论】:

以上是关于watchOS 中的扩展运行时会话在首次运行后停止工作的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow:GPU 加速仅在首次运行后发生

Visual Studio 2017在首次运行时未显示编译异常

Swift Scene Delegate 在首次启动时不运行代码

调用 `FIRApp.configure()` 时应用程序在首次运行时崩溃

为啥我的 iOS 应用程序仅在首次运行时正确检测到当前语言?

如何在首次运行时填充 Android Room 数据库表?