2017-11-27 19 views
11

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?

+0

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. –

Trả lời

3

Tất cả tôi có thể cung cấp cho bạn là một xác nhận rằng hành vi này đã làm thay đổi trong thực tế từ iOS 10 đến iOS 11. Đó là sự nghi ngờ của tôi rằng hành vi trên iOS 10 (trở về trước?) đã sai. Apple không có bất kỳ cảm giác nào về việc thay đổi hành vi vô ý/những gì họ cho là không chính xác ngay cả khi nhà phát triển dựa vào hành vi (tôi khá chắc chắn tôi đã sử dụng hành vi này trên dự án đồng hồ cuối cùng).

Thực tế là trạng thái của UIApplication khi được khởi chạy bằng tin nhắn từ đồng hồ là background. Timer không được phép chạy khi ứng dụng ở chế độ nền trừ khi sử dụng tác vụ nền/chế độ thực thi nền cụ thể. Thực tế đó khá nổi tiếng và thường gặp khá sớm trong sự nghiệp của nhà phát triển iOS. Thực tế là bộ định thời sẽ chạy ở chế độ nền khi khởi chạy từ đồng hồ, tôi có thể phỏng đoán, một sai lầm.

Tôi không biết trường hợp sử dụng của bạn, tức là lý do bạn dựa vào những giờ đó, nhưng một điều bạn có thể làm là khá đơn giản là tạo một tác vụ nền trống sẽ giúp bạn có thêm chút thời gian khi ứng dụng được khởi chạy.

var backgroundTask: UIBackgroundTaskIdentifier? 
backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "app Start Task", expirationHandler: { 
    guard let task = backgroundTask else { return } 
    UIApplication.shared.endBackgroundTask(task) 
}) 

let timer = Timer(timeInterval: 1, repeats: true) { (timer) in 
    print("Running") 
} 

Nếu bạn cần một giải pháp còn chạy ổn định hơn, bạn có thể cần phải tận dụng cập nhật vị trí của bạn như một cơ hội để làm bất cứ điều gì công việc hẹn giờ hiện đang cho. Có rất nhiều chế độ nền khác để theo đuổi là tốt.

Tóm tắt câu hỏi của bạn:

Hỏi: Cách tốt nhất để bắt đầu ứng dụng chính của chúng tôi từ ứng dụng đồng hồ là gì?
A: Mã được đề xuất của bạn là một cách tuyệt vời để khởi chạy ứng dụng đi kèm.

Q: Có điều gì đó đã thay đổi trong iOS 11/WatchOS 4 liên quan đến trạng thái nền?
A: Không, đặc biệt là liên quan đến bộ hẹn giờ. Các hành vi khác nhau có thể là một sự điều chỉnh.

Hỏi: Tôi có thể tìm tài liệu về điều này không?
A: Tôi không thể. Đôi khi bạn có thể ép thông tin này ra khỏi các kỹ sư táo trên diễn đàn hoặc thông qua các câu hỏi hỗ trợ cấp mã thông qua tài khoản nhà phát triển của bạn hoặc truy cập WWDC.

H: Đây có phải là lỗi iOS không?
A: Hành vi trước đó có thể là lỗi.

1

Khi ứng dụng bị đóng và không chạy ở chế độ nền thì vị trí không bao giờ theo dõi trong iOS 11, đó không phải lỗi iWatchOS 4 và iOS 11.

Thay đổi để theo dõi vị trí trong iOS 11

theo liên kết tài liệu này: Changes to location tracking in iOS 11 iOS 11 cũng làm cho một số thay đổi lớn đối với API hiện có. Một trong những khu vực bị ảnh hưởng là theo dõi vị trí.

Nếu ứng dụng của bạn chỉ sử dụng vị trí trong khi ứng dụng ở phía trước, như hầu hết các ứng dụng, bạn có thể không phải thay đổi gì cả; tuy nhiên, nếu đó là một trong những ứng dụng liên tục theo dõi vị trí của người dùng suốt cả ngày, có thể bạn nên đặt một số thời gian trong mùa hè này để thực hiện một số thay đổi về cách theo dõi và thử nghiệm các tình huống sử dụng có thể.

Ví dụ: hãy xem xét hai ứng dụng đó một lần nữa; vị trí nền liên tục và ứng dụng giám sát thay đổi vị trí quan trọng. Giả sử người dùng chạy một lần với ứng dụng vị trí nền liên tục. Họ sẽ tiếp tục chạy, họ sẽ quay lại, họ sẽ thấy mũi tên rắn toàn bộ thời gian, và khi họ nhìn vào bản đồ của họ, họ sẽ thấy mọi sự vặn vẹo và biến mất. Khi họ cài đặt ứng dụng sử dụng theo dõi thay đổi vị trí quan trọng, họ sẽ thấy cùng một điều, một mũi tên rắn. Theo như người dùng biết, ứng dụng này có thể nhận được cùng một lượng thông tin như ứng dụng theo dõi chạy của họ. Vì vậy, nếu người dùng hiểu sai các tín hiệu của chúng tôi, chúng tôi đã quyết định cách tốt nhất để khắc phục điều này là điều chỉnh cách chúng tôi chỉ ra việc sử dụng vị trí.

watchOS có quyền truy cập vào nhiều công nghệ tương tự được tìm thấy trong ứng dụng iOS; tuy nhiên, ngay cả khi một công nghệ có sẵn, bạn có thể không sử dụng được nó theo cách tương tự như trên iPhone.

Không sử dụng chế độ thực thi nền cho công nghệ. Nói chung, ứng dụng Đồng hồ được coi là ứng dụng tiền cảnh; chúng chỉ chạy trong khi người dùng tương tác với một trong các giao diện của họ. Do đó, phần mở rộng WatchKit tương ứng không thể tận dụng tối đa các chế độ thực thi nền để thực hiện các tác vụ. có thể giúp tài liệu này: Leveraging iOS Technologies for watch

+0

Tôi hiểu các thay đổi về quyền trong iOS 11. Chúng tôi theo dõi vị trí của người dùng dựa trên tùy chọn của người dùng, 'luôn luôn' hoặc 'đang sử dụng'. Tuy nhiên, tôi không nghĩ rằng điều này có liên quan đến vấn đề của chúng tôi ở đây. Ứng dụng WatchOS của chúng tôi là một ứng dụng chỉ dành cho nền trước, nó chỉ là một công tắc để 'bật' ứng dụng của chúng tôi ở chế độ nền, khi bạn đã cho phép vị trí. Thay đổi duy nhất tôi thấy kể từ iOS 11, là 'Timer's không hoạt động. Cập nhật vị trí dường như giống như bình thường. – Thermometer

Các vấn đề liên quan