iBeacon-App:从锁屏启动时的自定义代码

Posted

技术标签:

【中文标题】iBeacon-App:从锁屏启动时的自定义代码【英文标题】:iBeacon-App: Custom code when launched from lockscreen 【发布时间】:2015-02-27 10:08:52 【问题描述】:

ios 8 开始,操作系统会指示一个启用 iBeacon 的应用程序,该应用程序位于定义的区域内,并在锁屏的左下角带有一个图标(请参阅http://appleinsider.com/articles/14/06/03/apples-ios-8-uses-ibeacon-tech-brings-location-aware-app-access-to-lock-screen 以供参考)。

如果应用是从锁屏启动的(例如切换到特定视图),我想通过运行自定义代码在我的应用中使用此功能。

如果应用程序是从锁屏启动的,如何检查应用程序委托?我找不到任何关于此的文档。

【问题讨论】:

【参考方案1】:

AFAIK,无法通过“建议的应用程序”功能(Apple 将其称为锁定屏幕上的图标)或任何其他方式(应用程序切换器、应用程序图标打开)检测您的应用程序是否已进入前台主屏幕)。

您可以做一些启发式方法。如果应用程序进入前台并且范围内没有信标(您可以通过测距检查),那么它不可能通过锁屏图标。

【讨论】:

【参考方案2】:

Matt Coneybeare有一篇关于这个主题的优秀文章

下面我指出了那篇文章中的一些要点,有关更多信息,请查看那篇文章。

来自 Matt Coneybeare 的文章

iOS 6 及更低版本上,可以使用applicationWillEnterForeground 中的当前UIApplicationState 检测到它

UIApplicationState state = [[UIApplication sharedApplication] ApplicationState];
if (UIApplicationStateInactive == state)
    // Coming from locked screen (iOS 6)
else
    // Coming from Springboard, another App, etc...

但是从 iOS 7 开始,两种情况下的状态值都是UIApplicationStateBackground

似乎没有办法检测在 iOS 7 上从何处启动应用程序,但有一种方法可以检测您是进入锁屏还是主屏幕(或其他否则)。

诀窍是在applicationDidEnterBackground 中读取屏幕亮度。

当应用因按下锁定按钮或自动锁定超时而进入后台时,iOS 7 上的亮度将为 0.0。

否则,当按下home键或从多任务选择器或通知中心启动另一个应用程序时,它将> 0。

【讨论】:

感谢您的链接和摘要。如果我做对了,iOS7 方法只会产生正确的结果,如果用户在应用程序运行时按下锁定按钮并在解锁后立即返回应用程序。不幸的是,这在我的情况下不是很有用,因为主要用例是应用程序尚未启动,但最初是从锁屏启动的。错误检测也会对用户体验产生很大的负面影响。还是谢谢!【参考方案3】:

当应用程序通过信标检测启动时,您的 AppDelegate 的(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region 方法将被调用。

您可以在该方法中放入任何自定义代码,或许可以设置一个标志来指示应用的启动方式。

【讨论】:

这将在后台唤醒应用程序,而如果我理解正确的问题,它是关于应用程序如何进入前台的。例如,@toffifee 谈到切换到特定视图。【参考方案4】:

以下代码显示了如何检测点击本地通知从锁定屏幕启动应用程序。详情见:https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/IPhoneOSClientImp.html

  - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
      UILocalNotification *localNotif =
          [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
      if (localNotif) 
          // do something
      
      ...
      return YES;
  

这与通过点击锁定屏幕底部的图标启动应用程序不同,但类似。如果您提供有关信标检测的本地通知,则如果被点击,它将按上述方式工作。

我相信只有当您的应用通过信标检测启动到后台并且不显示本地通知时,应用图标才会显示在锁定屏幕的底部。如果您正在寻找这种情况,您可以检查上面的launchOptions 并查看在这种情况下是否存在不同的密钥。

【讨论】:

如您所说,这不是一回事,但感谢您的提示!不幸的是,launchOptions 为零。

以上是关于iBeacon-App:从锁屏启动时的自定义代码的主要内容,如果未能解决你的问题,请参考以下文章

单击 UITabBarController 时的自定义操作

自定义锁屏实现技术

请求用户对联系人的权限时的自定义消息[重复]

播放音频时设置自定义元数据(控制中心、锁屏...)

方向更改时的自定义 TableViewCell 自动布局问题

触发本地通知时的自定义视图