IOS 10中的灯塔崩溃

时间:2016-09-22 13:40:09

标签: ios objective-c ibeacon

任何人都可以帮助我们解决“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?提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

有许多关于iOS 10上信标检测问题的轶事报道,有些用户报告将XCode中的应用部署目标设置为9.x将解决此问题。请参阅此处了解详情:

https://stackoverflow.com/a/39641127/1461050