Уведомление о внешних аксессуарах:

Разрабатываю приложение, оно получает данные от аксессуара через порт UART. У меня проблема, когда мое приложение работает в течение длительного времени, оно использует гораздо больше памяти, после того, как iPhone перешел в спящий режим и снова проснулся, мое приложение не может открыть сеанс с аксессуаром после того, как аксессуар был полностью аутентифицирован. После отладки класса EAAccessoryManager я вижу два одинаковых устройства, все они мои аксессуары. Зайдите в Настройки / Общие / О программе, я обнаружил, что iphone показывает там два одинаковых устройства. Но моя проблема возникает только на iPhone 3G (версия iOS 4.1), у iPhone 3GS (iOS 4.1) этой проблемы нет. Я предполагаю, потому что моя программа использует слишком много памяти, поэтому я не могу получить события accessoryDidDisconnect. Пожалуйста, дайте мне несколько советов. спасибо за ваш ответ.

-(EASession*) openSessionForProtocol: (NSString*)protocolString
{
     NSArray* accessories = [[EAAccessoryManager sharedAccessoryManager] connectedAccessories];

     EAAccessory* accessory = nil;
     EASession *session = nil;
     for(EAAccessory* obj in accessories){
          if([[obj protocolStrings] containsObject:protocolString]){
               accessory = obj;
               break;
          }
     }
     if(accessory){
          [accessory setDelegate:self];
          session = [[EASession alloc] initWithAccessory:accessory forProtocol:protocolString];
          if(session){
               NSString *msg = @"";
               for(EAAccessory* obj in accessories){
                    msg = [msg stringByAppendingFormat:@"\n%@",[obj name]];
               }
               NSString *openSession = [NSString stringWithFormat:@"The number of devices is: %d.%@",[accessories count],msg];

               UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"OpenSession" message:openSession delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
               [alert show];
               [alert release];
               [[session inputStream] setDelegate:self];
               [[session inputStream] scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
               [[session inputStream] open];
               [[session outputStream] setDelegate:self];
               [[session outputStream] scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
               [[session outputStream] open];
               [session autorelease];
               iRemoteAppDelegate *appDelegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate];
               [appDelegate SetApplicationRotation:TRUE];
          }
     }
     return session;
}

- (void)accessoryDidDisconnect:(EAAccessory *)accessory
{
     //[HardwareController performSelectorOnMainThread:@selector(UpdateStringOnMessage:) withObject:@"Can not connect hardware module.\nPlease check hardware again." waitUntilDone:YES];
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message" message:@"Accessory is unpluged!" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
     [alert show];
     [alert release];
     [[serialSession inputStream] removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
     [[serialSession outputStream] removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];

     [serialSession release];
      self.serialSession = nil;
     iRemoteAppDelegate *delegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate];
     [delegate setUserCancel:NO];
     AllowedEmitSignal = TRUE;

     [delegate UpdateAboutHardwareDisconnect];
     [delegate SetApplicationRotation:FALSE];
}

- (void)accessoryDidConnect:(NSNotification *) notification
{
     iRemoteAppDelegate *appDelegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate];
     [appDelegate setUserCancel:NO];
     [self OpenPort];
     AllowedEmitSignal = TRUE;
     [appDelegate UpdateAboutHardwareDisconnect];
     appDelegate.CallNumber = appDelegate.CallNumber+1;
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message" message:[NSString stringWithFormat:@"Accessory is attached!%d",appDelegate.CallNumber] delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
     [alert show];
     [alert release];
}

-(void)OpenPort
{
     int i =0;
     [self initAllVariable];
     iRemoteAppDelegate *delegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate];

     for (;self.serialSession==nil && i<2; i++) {
          self.serialSession = [self openSessionForProtocol:PROTOCOLSTRING];
     }
}

person user462506    schedule 30.09.2010    source источник


Ответы (1)


Если «Настройки» / «Основные» / «О программе» отображаются два идентичных устройства для iPhone 3G, это означает, что iPhone 3G не смог определить «выключенное» состояние аксессуара, когда он спит. Вы должны убедиться, что аксессуар также перешел в спящий режим (состояние низкого энергопотребления), когда iPhone 3G спит, в течение определенных миллисекунд после того, как ваш аксессуар получит байты от 3G, сообщающие об изменении состояния питания.

Не могу сказать здесь слишком много секретов. Но по моему опыту, поведение электрического сигнала iPhone 3G сильно отличается от поведения 3GS. Ваша проблема не связана с кодом приложения iOS. Я настоятельно рекомендую вам использовать CRO / Logic Analyzer для отладки состояния обнаружения контактов и команд, отправленных с iPhone 3G непосредственно перед его переходом в спящий режим.

person XMLSDK    schedule 01.09.2011