2015-07-10 17 views
8

Tôi đang gặp phải một lỗi thực sự lạ khi làm việc với iOS và iBeacon. Tôi có một đơn giản thực sự đơn giản BeaconManager phạm vi đèn hiệu với UUID cụ thể, giá trị lớn và nhỏ và thực hiện một số hành động khi nó tìm thấy chúng. Ứng dụng của tôi có vẻ hoạt động bình thường cho đến khi ứng dụng liên tục chuyển đổi trạng thái Bluetooth và ngừng thực hiện công việc của ứng dụng. Kết quả hiển thị duy nhất là biểu tượng Bluetooth trên thanh trạng thái bắt đầu nhấp nháy do Bluetooth dừng và khởi động lại.Tại sao đèn hiệu khiến Bluetooth liên tục chuyển đổi?

Nơi tập trung sự chú ý?

Đây là định nghĩa lớp của tôi:

#import "BeaconManager.h" 

@implementation BeaconManager 

- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     NSURL *beep = [[NSBundle mainBundle] URLForResource:@"beep" withExtension:@"aiff"]; 
     soundFileURLRef = (CFURLRef) CFBridgingRetain(beep); 
     AudioServicesCreateSystemSoundID(soundFileURLRef, &soundFileObject); 

     // Initializes properties 
     beacon = [CLBeacon new]; 
     foundBeacons = [NSMutableArray new]; 
     _lastBeaconActionTimes = [[NSMutableDictionary alloc] init]; 
    } 
    return self; 
} 

- (void)initRegion { 
    // Initializes the beacon region by giving it an UUID and an identifier 
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:BEACON]; 
    beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"beacon.region"]; 
    // Starts looking for beacon within the region 
    [self.locationManager startMonitoringForRegion:beaconRegion]; 
} 

- (void)checkBeacon { 
    if (!self.locationManager) { 
     self.locationManager = [[CLLocationManager alloc] init]; 
     self.locationManager.delegate = self; 

     if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) 
      [self.locationManager requestWhenInUseAuthorization]; 
    } 
    [self initRegion]; 
    [self locationManager:self.locationManager didStartMonitoringForRegion:beaconRegion]; 
} 

#pragma mark - CLLocationManagerDelegate 

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { 
    [self.locationManager startMonitoringForRegion:beaconRegion]; 
    [self.locationManager startRangingBeaconsInRegion:beaconRegion]; 
} 

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { 
    [self.locationManager startRangingBeaconsInRegion:beaconRegion]; 
} 

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
    [self.locationManager stopRangingBeaconsInRegion:beaconRegion]; 
} 

- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error { 
    NSLog(@"Failed monitoring region: %@", error); 
} 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
    NSLog(@"Location manager failed: %@", error); 
} 

- (void)locationManager:(CLLocationManager *)manager 
     didRangeBeacons:(NSArray *)beacons 
       inRegion:(CLBeaconRegion *)region { 

    if (foundBeacons.count == 0) { 
     for (CLBeacon *filterBeacon in beacons) { 
      // If a beacon is located near the device and its major value is equal to 1000 (MAJOR constant) 
      if (((filterBeacon.proximity == CLProximityImmediate) || (filterBeacon.proximity == CLProximityNear))) 
       // Registers the beacon to the list of found beacons 
       [foundBeacons addObject:filterBeacon]; 
     } 
    } 
    // Did some beacon get found? 
    if (foundBeacons.count > 0) { 
     // Takes first beacon of the list 
     beacon = [foundBeacons firstObject]; 

     if (([beacon.major isEqualToNumber:[NSNumber numberWithInt:MAJOR]]) && ([beacon.minor isEqualToNumber:[NSNumber numberWithInt:MINOR]])) { 
      // Takes the actual date and time 
      NSDate *now = [[NSDate alloc] init]; 
      NSString *key = [NSString stringWithFormat:@"%@ %@ %@", [beacon.proximityUUID UUIDString], beacon.major, beacon.minor]; 
      NSDate *lastBeaconActionTime = [_lastBeaconActionTimes objectForKey:key]; 
      if ((lastBeaconActionTime == nil) || ([now timeIntervalSinceDate:lastBeaconActionTime] > MINIMUM_ACTION_INTERVAL_SECONDS)) { 
       [_lastBeaconActionTimes setObject:now forKey:key]; 
       // Plays beep sound 
       AudioServicesPlaySystemSound(soundFileObject); 

       if (self.delegate) { 
        // Performs actions related to the beacon (i.e. delivers a coupon) 
        [self.delegate didFoundBeacon:self]; 
       } 
       self.locationManager = nil; 
      } 
      // else [self.locationManager stopMonitoringForRegion:region]; 
     } 
     [foundBeacons removeObjectAtIndex:0]; 
     beacon = nil; 
    } 
} 
@end 
+0

Thiết bị đó là gì? Bạn có kết nối với bất kỳ thiết bị ngoại vi Bluetooth nào không (ví dụ: đồng hồ thông minh hoặc tai nghe Bluetooth)? Khi bạn nói biểu tượng nhấp nháy, bạn có nghĩa là nó đang thay đổi màu sắc, hoặc nó vẫn xuất hiện và biến mất? – heypiotr

+0

@heypiotr Đây là iPhone 6 có iOS 8.3 và không được kết nối với bất kỳ thiết bị Bluetooth nào khác. Tôi cũng xây dựng một ứng dụng sạch sẽ để tránh nhiễu. Biểu tượng Bluetooth tiếp tục xuất hiện và biến mất rất nhanh. – Dree

+0

Bất kỳ cơ hội nào bạn có thể thử nghiệm ứng dụng của mình trên một thiết bị khác và xem liệu nó có giống nhau không? Điều này trông hơi giống như một vấn đề phần cứng có thể xảy ra. Bạn đang sử dụng Vị trí chính hoặc một số đèn hiệu SDK khác? – heypiotr

Trả lời

1

Không thể nói chắc chắn đây là lý do tại sao Bluetooth giữ Toggling, nhưng phần này chắc chắn là đáng ngờ:

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { 
    [self.locationManager startMonitoringForRegion:beaconRegion]; 
    [self.locationManager startRangingBeaconsInRegion:beaconRegion]; 
} 

này về cơ bản một là vòng lặp vô hạn. Sau khi bắt đầu theo dõi, iOS sẽ gọi phương thức didStartMonitoring… bắt đầu theo dõi cho cùng một vùng, làm cho iOS gọi lại phương thức didStartMonitoring,…

Tôi bắt đầu xóa dòng startMonitoringForRegion khỏi phần này của mã của bạn .

+0

OK, có vẻ như hiện tại có hành vi đâm. Dù sao, Bluetooth vẫn nhanh chóng bật tắt chỉ một lần nếu tôi không loại bỏ ngay lập tức bộ điều khiển xem được kết hợp với phương thức 'didFoundBeacon:'. Trình điều khiển chế độ xem chỉ hiển thị nhãn có phân đoạn phương thức và nút loại bỏ trình điều khiển chế độ xem. Đối với mục đích thử nghiệm, cảnh báo được hiển thị sau mỗi 60 giây, vì vậy nếu tôi không loại bỏ nó trước khi hết giờ, bộ điều khiển chế độ xem chồng lên nhau. Để sử dụng thực sự, thời gian hẹn giờ nên lớn hơn (khoảng 30 phút). Nó có thể là một vấn đề liên quan? – Dree

+0

Cảm ơn sự giúp đỡ của bạn, tôi đánh giá cao nó. – Dree

Các vấn đề liên quan