programing

앱이 실행되고 있지 않을 때 iBeacon 알림

nasanasas 2020. 12. 24. 23:48
반응형

앱이 실행되고 있지 않을 때 iBeacon 알림


비콘이 범위 내에있을 때 내 iPhone에서 로컬 푸시 알림을 트리거하는 iBeacon을 만들었습니다. 앱이 백그라운드 모드 일 때 완벽하게 작동합니다.

내 질문은 : 앱이 실행 중이 아니더라도 백그라운드에서도 알림을 트리거 할 수 있습니까?

이것이 가능하다고 생각했지만 확실하지 않습니다. 그렇다면 어떻게해야합니까?

감사!


예, 가능하며 자동이어야합니다.

CLBeaconRegion을 생성하고 모니터링을 시작하면 위치 서비스는 앱이 실행되지 않는 경우에도 휴대 전화가 해당 지역에 있는지 여부를 추적합니다. 전환 중에 앱이 실행되지 않는 경우 iOS는 적절한 CLLocationManagerDelegate 메서드를 호출하기 위해 몇 초 동안 앱을 백그라운드로 시작합니다.

나는 내 앱으로 실험을 통해 위의 동작을 발견했지만 Apple의 AirLocate 샘플 프로그램에서도 목격했습니다. AirLocate를 사용하면 모니터링 지역을 설정 한 다음 전화기를 재부팅하면 전화기가 지역에 들어 오자마자 AirLocate가 여전히 로컬 알림을 제공합니다.

iOS가 지역 상태 전환을 인식하기 전에 iBeacon을 켜고 끈 후 최대 4 분이 걸리기 때문에 테스트 할 때주의하십시오. 편집 : iPhone 5부터 앱은 일반적으로 하드웨어 가속을 사용하여 몇 초 내에 비콘을 감지하며 하드웨어 가속을 사용할 수없는 경우 최대 15 분이 걸릴 수 있습니다.

편집 : 아이폰 OS 8로, 당신은 당신이 전화하고 성공적으로 획득해야 locationManager.requestAlwaysAuthorization()으로 locationManager.requestWhenInUseAuthorization()만 비콘이 포 그라운드에서 검출 될 수 있습니다.

이 블로그 게시물 에서이 모든 것이 어떻게 작동하는지에 대한 자세한 토론을 게시했습니다.


좋아, 나는 이것을 올바르게 작동하고 실험 해 보았으므로 여기에 답이 있습니다. 다음은 앱이 종료 된 후 비콘 영역 경계를 넘을 때 앱이 호출되도록하기 위해 수행해야하는 작업입니다 (포 그라운드에서 앱이 제대로 작동한다고 가정).

  1. 모듈 내부CLLocation델리게이트 를 구현해야합니다 . 이 델리게이트는 iOS에서 호출되는 것이므로에서 델리게이트 코드 가 없으면 앱이 종료되었을 때 iOS에 응답 할 수 없습니다. 이것이 Apple의 AirLocate 샘플 앱이하는 일입니다.AppDelegate.mCLLocationAppDelegate.m

따라서 내부 AppDelegate.m에 다음이 필요합니다 (에서 링크해야 함 CoreLocation.h).

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.

// This location manager will be used to notify the user of region state transitions when the app has been previously terminated.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
return YES;
}
  1. 내부 AppDelegate.m에서 다음 과 같이 locationManager didDetermineState 메소드 를 구현해야합니다 .

    -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{
    
      UILocalNotification *notification = [[UILocalNotification alloc] init];
    
      if(state == CLRegionStateInside)
      {
        notification.alertBody = [NSString stringWithFormat:@"You are inside region %@", region.identifier];
      }
      else if(state == CLRegionStateOutside)
      {
        notification.alertBody = [NSString stringWithFormat:@"You are outside region %@", region.identifier];
      }
     else
     {
       return;
     }
    
      [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
     }
    

-> 따라서 앱이 종료 된 경우 (최소한 한 번 실행해야 함) 모니터링중인 비콘 경계를 넘어 기기가 전환 될 때 iOS는 앱을 호출하고 locationManager:didDetermineStateAppDelegate.m 모듈에서 메서드를 호출합니다 . 이 메서드 내에서 presentLocalNotificationNow를 설정하고 호출 할 수 있습니다. 이 경우 앱이 포 그라운드에 있지 않으면 iOS는 잠겨 있어도 화면에 알림을 표시합니다. 사용자는 추가 정보를 위해 앱을 호출해야합니다.

I'm pretty sure that memory pressure has nothing to do with this. Also, the setting notifyEntryStateOnDisplay has nothing to do this this issue either. Setting notifyEntryStateOnDisplay is only used when the user turns on the iOS device display (ie hits "home" or top left button). If the user does this and notifyEntryStateOnDisplay is TRUE, AND the device is INSIDE the beacon region you are monitoring for, THEN you get a notification on the display at that time. If this property is set to FALSE, you don't.

Of course, you need to be running iOS 7.1 in order for this stuff to work correctly.

For more details, visit Apple's documentation


You need to switch notifyEntryStateOnDisplay=YES for CLBeaconRegion for the system to wake your app for iBeacon entry/exit event.

But there is one tricky part. If your app is not running the system will only wake your app for beacon entry/exit handling if your app was terminated previously due to system memory pressure. If the user kills the app by swiping it up in the task view, the system will not wake your app. To verify this behaviour, launch you app, put it to background, then consecutively launch several memory consuming apps. I launched several 3D games before my app gets terminated by the system due to memory pressure.


Just upgrade your iOS version to 7.1 and set "notifyEntryStateOnDisplay=YES" and it should work like a charm even when your app is not running. I was having this problem earlier but it got fixed once I did this upgrade! Enjoy..


The only way I have been able to make this work is by monitoring for major location changes which seem to do the trick. Be warned I have not tested this for all of the device or use case scenarios.


Yes, we can present the local notification in kill state or in the background state, just follow the steps,

1) Start location manager using CLLocationManager class.

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy=kCLLocationAccuracyBest;
locationManager.distanceFilter=kCLDistanceFilterNone;

2) Create CLBeaconRegion like,

CLBeaconRegion *beacon_Region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:mjorVa minor:minorVa identifier:identifier];
beacon_Region.notifyEntryStateOnDisplay = YES;
beacon_Region.notifyOnEntry=YES;
beacon_Region.notifyOnExit=YES;

3) Implement two location manager delegate method like,

-didEnterRegion
-didExitRegion

The above two location manager method will work even your app is kill or in background. The system will keep track of your beacon and when it goes out of the range the system will fire the didExitRegion method and when comes in the system will fire the didEnterRegion method.

ReferenceURL : https://stackoverflow.com/questions/19127282/ibeacon-notification-when-the-app-is-not-running

반응형