为什么Xcode模拟器会通过didEnterRegion调用来启动应用程序,而iPhone却不能呢?

时间:2019-03-06 19:49:48

标签: xcode debugging logging

我正在对基于位置的应用启动周期进行故障排除,该启动周期在iOS模拟器上可以正常运行,但显然无法在实际设备上启动该应用。

我已经为进入和退出事件设置了UNNotifications。模拟器和设备都会注册并显示这些通知。

接下来应该发生的事情是应用程序经历了启动过程,以这样一种方式设置应用程序的状态:我在不连接调试器的情况下就可以知道该应用程序是否在我打开时是否已启动在主屏幕上。

在模拟器上,didEnterRegion代码被调用,我可以使用调试器逐步调试后续启动代码-

但是,当我将设备拿出(散步)时,得到的只是UNNotifications,并且没有启动应用程序(我可以从真实设备上的应用程序中的UI得知)

我确定我需要改善测试策略(欢迎提出建议!),但是在这一点上,我应该能够期望该应用在模拟器和实际设备上的行为相同-事实并非如此。

为什么预期的结果在模拟器上而不在设备上发生?

LocationService.swift

func handleRegionEnterEvent (for region: CLRegion) {
    ApplicationController.sharedInstance.didEnterRegion(region)
}

func handleRegionExitEvent (for region: CLRegion) {
    ApplicationController.sharedInstance.didExitRegion(region)
}

ApplicationController.swift

func didEnterRegion (_ region: CLRegion) {
    // Present Alert
    delegate?.handleUNEvent(note: "ENTER: \(region.identifier)")

    // Start launch cycle

}

AppDelegate.swift

extension AppDelegate: AppControllerDelegate {
    func handleUNEvent(note: String?) {
        // Show an alert if application is active
        if UIApplication.shared.applicationState == .active {
            guard let message = note else { return }
            Alert().showAlert(withMessage: "Application received UN while active: \(message)", title: "UNNotification")
        } else {
            // Otherwise present a local notification
            guard let body = note else { return }
            let notificationContent = UNMutableNotificationContent()
            notificationContent.body = body
            notificationContent.sound = UNNotificationSound.default
            notificationContent.badge = UIApplication.shared.applicationIconBadgeNumber + 1 as NSNumber
            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
            let request = UNNotificationRequest(identifier: "location_change",
                content: notificationContent,
                trigger: trigger)
            UNUserNotificationCenter.current().add(request) { error in
                if let error = error {
                    print("Error: \(error)")
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

可悲的是,模拟器在报告数据(例如您无法获得速度)方面与设备有很多差异,而且您看到呼叫流可能有所不同...

要检查的一件事是确保您具有与位置设置有关的特定位置权限的描述。要输入区域,您可能要确保您具有“始终”访问权限。

启用无线调试可能也是值得的,并与捆绑到设备的笔记本电脑一起走动以与调试器进行确认,didEnterRegion的确未被调用,并且代码中有一个错误应该显示您的用户界面期待。至少可以使您更好地记录各种位置回调的状态。

答案 1 :(得分:0)

发生了什么:在模拟器上执行的代码确实在设备上崩溃了,我没有查看设备上的崩溃日志。这个问题源于既不是ios也不是特定于核心位置的问题。

在得出可能为时过早的结论之前,它与选择适当的测试策略并使用所有可用信息有关。

  

但是,当我将设备拿出(散步)时,得到的只是UNNotifications,并且没有启动应用程序(我可以从真实设备上的应用程序中的UI得知)

我误以为a)当应用未运行时出现的用户通知是由系统呈现的(作为横幅),b)该应用在另一个进程中启动。实际上,我自己的代码专门执行使这些通知出现的代码。面对面:我想从教程中复制代码以获得快速的测试结果,甚至不试图理解代码的作用。

在Xcode中,插入设备并按Command-shift-2打开“设备和模拟器”窗口。在左侧选择您的设备,然后点击“查看日志”按钮以显示您的崩溃日志。