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

iBeacon-App: Custom code when launched from lockscreen

自 iOS8 起,操作系统指示启用 iBeacon 的应用程序,它位于定义的区域内,锁屏左下角有一个图标(参见 http://appleinsider.com/articles/14/06/03/apples-ios-8-uses-ibeacon-tech-brings-location-aware-app-access-to-lock-screen参考)。

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

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

Matt Coneybeare

有一篇关于此主题的优秀文章

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

From Article of 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...

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

似乎无法检测应用程序是从 iOS 7 的哪个位置启动的,但是有一种方法可以检测您是否转到锁屏与主屏幕(或其他)。

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

当应用程序由于按下锁定按钮或自动锁定超时而进入后台时,iOS 7 亮度将为 0.0。

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

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

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

AFAIK,无法检测您的应用程序是否通过 "Suggested apps" 功能(Apple 对锁定屏幕上的图标的称呼)或任何其他方式(应用程序切换器,主屏幕上的应用程序图标)。

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

以下代码展示了如何检测点击本地通知是否从锁定屏幕启动了应用程序。详情见: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 并查看在这种情况下是否存在不同的密钥。