任何人都可以帮助我们解决“Beacon在IOS10崩溃”的问题。 didRangeBeacons委托方法总是将beacons数组返回为nil,代码如下
-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
@try {
CLBeacon *beacon = [[CLBeacon alloc] init];
NSLog(@"beacons Count %lu", (unsigned long)beacons.count);
if(beacons != nil && beacons != Nil && beacons != NULL && beacons.count > 0) {
beacon = [beacons firstObject];
self.currentMajor = beacon.major;
self.currentMinor = beacon.minor;
NSArray *majorMinorIDs = [[NSArray alloc]initWithObjects:self.currentMajor,self.currentMinor, nil];
self.ComaSeparatedIDS = [majorMinorIDs componentsJoinedByString:@","];
/* Log */
[self printLog:[NSString stringWithFormat:@"Current Major Id: %@, Previous Major Id: %@, Current Minor Id: %@, Previous Minor Id %@", self.currentMajor, self.prevMajor, self.currentMinor, self.prevMinor]];
// Make a web service request only if new beacon is detected
if((([self.prevMajor intValue]!=[self.currentMajor intValue]) || ([self.prevMinor intValue]!=[self.currentMinor intValue])) || (self.enteredRegionNow))
{
NSLog(@"Making url request when new beacon detected");
// Delete all the urls before calling the web service
self.url_immediate = nil;
self.url_near = nil;
self.url_far = nil;
self.url_exit = nil;
// Make a web service request to the server
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ibeacon.bpsqr.me/GetUrls/?UUID=%@&MinorID=%@&MajorID=%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"UUID"], self.currentMinor, self.currentMajor]]];
self.urlsRequestConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
self.prevMajor = self.currentMajor;
self.prevMinor = self.currentMinor;
self.enteredRegionNow = false;
return;
}
// Assigning beacon's current proximity
self.currentProximity = beacon.proximity;
[self printLog:[NSString stringWithFormat:@"Current proximity : %d", self.currentProximity]];
[self printLog:[NSString stringWithFormat:@"Previous proximity : %d", self.prevProximity]];
[self printLog:[NSString stringWithFormat:@"Last visited webpage proximity : %d", self.previousProximityTag]];
// Send notification based on the notification enabled flag, proximity and the url found in the response
if([self.notificationEnabled isEqualToString:@"true"])
{
double days = [self DiffBetweenCurrentAndNotificationDate];
NSLog(@"Days from notification %f",days);
NSNumber *notificationDuration =[[NSUserDefaults standardUserDefaults] objectForKey:@"NotificationDuration"];
NSLog(@"Notification duration from plist %f",[notificationDuration doubleValue]);
if (days >=[notificationDuration doubleValue] || days == 0 ) {
NSLog(@"Hit count become zero in differeneceBetweenCurrentAndNotificationDate");
hitCount = 0 ;
}
switch (beacon.proximity) {
case CLProximityUnknown:
// Do nothing
break;
case CLProximityImmediate:
if(self.url_immediate != nil)
{
[self sendLocalPushNotification];
self.notificationEnabled = false;
}
break;
case CLProximityNear:
if(self.url_near != nil)
{
[self sendLocalPushNotification];
self.notificationEnabled = false;
}
break;
case CLProximityFar:
if(self.url_far != nil)
{
[self sendLocalPushNotification];
self.notificationEnabled = false;
}
break;
default:
break;
}
}
// Open web page based on proximity when general beacons(not notification beacon) detected
if([self.status_code isEqualToString:@"200"])
{
// Do not open web page while app is in background
UIApplicationState appState = [[UIApplication sharedApplication] applicationState];
if((appState != UIApplicationStateBackground) && (appState != UIApplicationStateInactive))
{
if (beacon.proximity == CLProximityUnknown) {
if(self.currentProximity != self.prevProximity)
{
self.prevProximity = self.currentProximity;
}
/* Log */
[self printLog:@"Unknown proximity"];
}
else if (beacon.proximity == CLProximityImmediate) {
if((self.currentProximity != self.prevProximity) && (![self.current_url isEqualToString:self.url_immediate]))
{
if(self.currentProximity == self.previousProximityTag)
{
self.previousProximityTag = self.prevProximity;
if(self.flag_immediate == true)
{
if(navController != NULL)
{
[self stopTimerTask:self.timer_long];
self.timer_long = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(showAlertOnProximityChange:) userInfo:[NSNumber numberWithInt:1] repeats:NO];
}
else
{
[self stopPerformSelectorTask];
[self performSelector:@selector(openWebView:) withObject:self.url_immediate afterDelay:20.0];
}
}
else
{
if(navController != NULL)
{
[self stopTimerTask:self.timer_long];
self.timer_long = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(showAlertOnProximityChange:) userInfo:[NSNumber numberWithInt:1] repeats:NO];
}
else
{
[self stopPerformSelectorTask];
[self performSelector:@selector(openWebView:) withObject:self.url_immediate afterDelay:3.0];
}
}
}
else
{
self.previousProximityTag = self.prevProximity;
if(navController != NULL)
{
[self stopTimerTask:self.timer_short];
self.timer_short = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(showAlertOnProximityChange:) userInfo:[NSNumber numberWithInt:1] repeats:NO];
}
else
{
[self performSelector:@selector(openWebView:) withObject:self.url_immediate afterDelay:0.0];
}
}
self.prevProximity = self.currentProximity;
}
else if ([self.current_url isEqualToString:self.url_immediate])
{
self.prevProximity = self.currentProximity;
}
/* Log */
[self printLog:@"Immediate"];
}
else if (beacon.proximity == CLProximityNear) {
if((self.currentProximity != self.prevProximity) && (![self.current_url isEqualToString:self.url_near]))
{
if(self.currentProximity == self.previousProximityTag)
{
self.previousProximityTag = self.prevProximity;
if(self.flag_near == true)
{
if(navController != NULL)
{
[self stopTimerTask:self.timer_long];
self.timer_long = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(showAlertOnProximityChange:) userInfo:[NSNumber numberWithInt:2] repeats:NO];
}
else
{
[self stopPerformSelectorTask];
[self performSelector:@selector(openWebView:) withObject:self.url_near afterDelay:20.0];
}
}
else
{
if(navController != NULL)
{
[self stopTimerTask:self.timer_long];
self.timer_long = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(showAlertOnProximityChange:) userInfo:[NSNumber numberWithInt:2] repeats:NO];
}
else
{
[self stopPerformSelectorTask];
[self performSelector:@selector(openWebView:) withObject:self.url_near afterDelay:3.0];
}
}
}
else
{
self.previousProximityTag = self.prevProximity;
if(navController != NULL)
{
[self stopTimerTask:self.timer_short];
self.timer_short = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(showAlertOnProximityChange:) userInfo:[NSNumber numberWithInt:2] repeats:NO];
}
else
{
[self performSelector:@selector(openWebView:) withObject:self.url_near afterDelay:0.0];
}
}
self.prevProximity = self.currentProximity;
}
else if ([self.current_url isEqualToString:self.url_near])
{
self.prevProximity = self.currentProximity;
}
/* Log */
[self printLog:@"Near"];
}
else if (beacon.proximity == CLProximityFar) {
if((self.currentProximity != self.prevProximity) && (![self.current_url isEqualToString:self.url_far]))
{
if(self.currentProximity == self.previousProximityTag)
{
self.previousProximityTag = self.prevProximity;
if(self.flag_far == true)
{
if(navController != NULL)
{
[self stopTimerTask:self.timer_long];
self.timer_long = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(showAlertOnProximityChange:) userInfo:[NSNumber numberWithInt:3] repeats:NO];
}
else
{
[self stopPerformSelectorTask];
// [self saveFarBeaconProximityMessage];
[self performSelector:@selector(openWebView:) withObject:self.url_far afterDelay:20.0];
}
}
else
{
if(navController != NULL)
{
[self stopTimerTask:self.timer_long];
self.timer_long = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(x:) userInfo:[NSNumber numberWithInt:3] repeats:NO];
}
else
{
[self stopPerformSelectorTask];
// [self saveFarBeaconProximityMessage];
[self performSelector:@selector(openWebView:) withObject:self.url_far afterDelay:3.0];
}
}
}
else
{
self.previousProximityTag = self.prevProximity;
if(navController != NULL)
{
[self stopTimerTask:self.timer_short];
self.timer_short = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(showAlertOnProximityChange:) userInfo:[NSNumber numberWithInt:3] repeats:NO];
}
else
{
// [self saveFarBeaconProximityMessage];
[self performSelector:@selector(openWebView:) withObject:self.url_far afterDelay:0.0];
}
}
self.prevProximity = self.currentProximity;
}
else if ([self.current_url isEqualToString:self.url_far])
{
self.prevProximity = self.currentProximity;
}
/* Log */
// [self saveFarBeaconProximityMessage];
[self printLog:@"Far"];
}
}
}
} else {
[self printLog:@"Beacon is nil"];
return;
}
}
@catch (NSException *exception) {
// <#Handle an exception thrown in the @try block#>
}
@finally {
// <#Code that gets executed whether or not an exception is thrown#>
}
}
在设备中启用蓝牙,我已尝试通过更改以下链接中指定的部署目标 Ranging Beacons in iOS 10。并检查数组nil条件,整个代码由目标c中的try catch包围,但即使应用程序因为“Beacon数组为零”而崩溃。 IOS10是否支持Beacon?提前感谢您的帮助。
答案 0 :(得分:1)
有许多关于iOS 10上信标检测问题的轶事报道,有些用户报告将XCode中的应用部署目标设置为9.x将解决此问题。请参阅此处了解详情: