trạng:Cách khởi động ứng dụng iOS chính từ ứng dụng đồng hồ đồng hồ ở chế độ nền?
Vì người dùng của chúng tôi đã cập nhật iOS của mình lên 11 và/hoặc watchos đến 4, ứng dụng iOS của chúng tôi dường như không sa thải bất kỳ giờ theo lịch trình khi ứng dụng được bắt đầu bởi ứng dụng watchos của chúng tôi. Có lẽ chúng tôi đang làm điều gì đó sai khi bắt đầu ứng dụng chính của chúng tôi từ ứng dụng WatchOS.
Context & mã:
watchos của chúng tôi ứng dụng là một ứng dụng cho phép bạn đồng hành khi bắt đầu sử dụng/dừng ứng dụng iPhone của chúng tôi trong nền bằng cách nhấn một nút. Chúng tôi làm điều này bằng cách sử dụng:
func startMainApp() {
guard WCSession.default().isReachable == true else {
print("Watch is not reachable")
return
}
var data = [String : AnyObject]()
data[WatchActions.actionKey()] = NSNumber.init(value: WatchActions.startApp.rawValue as Int)
WCSession.default().sendMessage(data, replyHandler: { (result: [String : Any]) in
let resultNumber = result[WatchActions.resultKey()] as? NSNumber
let resultBool = resultNumber!.boolValue
if resultBool == true {
self.setModeActivated()
} else {
self.setModeActivationFailed()
}
}) { (error: Error) in
if (error as NSError).code != 7012 {
print("start app error: \(error.localizedDescription)")
self.setModeActivationFailed()
}
}
}
Sau đó trong ứng dụng chính của chúng tôi, chúng tôi nhận được thông báo và bắt đầu điều khiển cơ sở của chúng tôi:
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
if let actionNumber : NSNumber = message[WatchActions.actionKey()] as? NSNumber {
if let watchAction : WatchActions = WatchActions(rawValue: actionNumber.intValue) {
switch(watchAction) {
case .isAppActive:
let result = BaseController.sharedInstance.sleepAndWakeUpController.isAwake()
replyHandler([WatchActions.resultKey() : NSNumber.init(value: result as Bool)])
return
case .startApp:
AudioController.sharedInstance().playActivatedSound()
let isRunningOnForeground = ApplicationStateHelper.isActive()
if isRunningOnForeground == false {
BaseController.sharedInstance.start(inBackground: true)
}
let result = true
replyHandler([WatchActions.resultKey() : NSNumber.init(value: result as Bool)])
DDLogInfo("[APPLE WATCH] [didReceiveMessage] [.startApp]")
return
}
}
}
replyHandler([WatchActions.resultKey() : NSNumber.init(value: false as Bool)])
return
}
Tất cả mọi thứ dường như làm việc như trước đây, chúng tôi một cách chính xác được vị trí GPS, tất cả tuy nhiên, các quy trình của chúng tôi bắt đầu, Timer
các đối tượng bắt đầu, không kích hoạt.
Điều này hoạt động hoàn hảo trước trên iOS 10, vì vậy tôi nghi ngờ điều này có liên quan đến các trạng thái nền iOS 11 hoạt động khác nhau. Tuy nhiên, tôi không thể tìm thấy bất kỳ tài liệu nào về điều này.
thêm thông tin:
- Trên iOS 10, khi chúng tôi bắt đầu ứng dụng chính của chúng tôi theo cách này, các ứng dụng có thể nhìn thấy trong giao diện đa nhiệm trên iPhone. Bây giờ trên iOS 11, nó không hiển thị trong chế độ xem đa nhiệm, tuy nhiên nó chạy trên nền. Tôi thấy thành công các thông báo cục bộ mà tôi lên lịch ở chế độ nền, tôi có thể gỡ lỗi thông qua mã đang hoạt động và khi nhấn vào biểu tượng ứng dụng, ứng dụng sẽ có sẵn ngay lập tức.
- Ứng dụng WatchOS của chúng tôi có mục tiêu triển khai là 2.0
- Gỡ lỗi qua XCode với thiết bị được kết nối, sử dụng Gỡ lỗi -> Đính kèm với PID hoặc Tên -> Tên ứng dụng đã nhập. Sau đó, bắt đầu ứng dụng của chúng tôi từ Apple Watch và gỡ lỗi.
- reproducable trên iOS 11.0.3 với watchos 4.0 trên iPhone 6
Câu hỏi: cách tốt nhất để bắt đầu ứng dụng chính của chúng tôi từ các ứng dụng đồng hồ là gì? Có điều gì đó đã thay đổi trong iOS 11/WatchOS 4 về trạng thái nền không? Tôi có thể tìm tài liệu về điều này không? Đây có phải là lỗi iOS không?
Bạn đề cập đến bộ hẹn giờ không hoạt động nhưng mã bạn chia sẻ không có ví dụ về bộ hẹn giờ không kích hoạt. –