代码之家  ›  专栏  ›  技术社区  ›  elight

为什么Xcode simulator会启动带有didEnterRegion调用的应用程序,而iPhone不会?

  •  0
  • elight  · 技术社区  · 6 年前

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

    我已经设置了进入和退出活动的通知。模拟器和设备都会注册并显示这些通知。

    接下来应该发生的事情是,应用程序经过一个启动过程,设置应用程序的状态,这样我就可以在不连接调试器的情况下判断应用程序是否已启动,当我从主屏幕打开它时。

    在模拟器上,会调用didEnterRegion代码,我可以使用调试器success单步执行后续的启动代码。

    然而,当我把设备拿出来(散步)时,我得到的只是没有通知,也没有应用程序启动(我可以从实际设备上应用程序的UI中看出这一点)

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

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

    定位服务。敏捷的

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

    应用程序控制器。敏捷的

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

    AppDelegate。敏捷的

    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)")
                    }
                }
            }
        }
    }
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Kendall Helmstetter Gelner    6 年前

    不幸的是,模拟器与设备在报告的数据方面(例如,你将无法获得速度)以及正如你所看到的,呼叫流可能会有所不同。。。

    需要检查的是,确保您拥有与位置设置相关的特定位置权限的描述。对于输入区域,您可能希望确保您具有“始终”访问权限。

    还值得启用无线调试,带着连接到设备上的笔记本电脑四处走动,用调试器验证是否真的没有调用didEnterRegion,以及应该显示您期望的UI的代码中是否存在错误。至少,您可以更好地记录各种位置回调的状态。

        2
  •  0
  •   elight    6 年前

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

    这一切都与选择合适的测试策略有关,并在得出可能不成熟的结论之前使用所有可用的信息。

    然而,当我把设备拿出来(散步)时,我得到的只是没有通知,也没有应用程序启动(我可以从实际设备上应用程序的UI中看出这一点)

    我错误地认为a)应用程序未运行时出现的用户通知由系统显示(作为横幅),b)应用程序在另一个进程中启动。事实上,我自己的代码专门执行使这些通知出现的代码。面对面:从教程中复制代码以获得快速测试结果,甚至不试图理解代码的作用,我想这可能会导致这种情况。

    在Xcode中,插入设备并点击command-shift-2打开设备&模拟器窗口。选择左边的设备,点击“查看日志”按钮,调出崩溃日志。

    推荐文章