0
任何人都請幫助我們修復「信標在IOS10中崩潰」。 didRangeBeacons委託方法總是返回信標數組作爲零和代碼如下IOS中的信標崩潰10
-(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指定。並檢查數組零條件,整個代碼被目標c中的try catch包圍,但即使應用程序崩潰說「Beacon array is nil」。 IOS10支持Beacon嗎?預先感謝您的幫助。
嗨,感謝您的答覆。我們會檢查並通知您 – Sakthimuthiah
通過更改部署目標嘗試。不幸的是,它不起作用 – Sakthimuthiah
你有沒有找到一個解決方案 - 我有相同的概率 – vivianaranha