2015-10-14 15 views
13

Sto provando a attivare azioni diverse all'interno della mia app utilizzando i pulsanti dell'auricolare collegato (qualcosa di simile a ciò che fa pressione). Tuttavia, ho notato che non importa se utilizzo MPRemoteCommandCenter o remoteControlReceivedWithEvent delegato, ricevo eventi con un ritardo notevole. Ciò che peggiora è che se provo a premere due volte il tasto veloce, otterrò solo uno UIEventTypeRemoteControl.latenza quando si preme il pulsante dell'auricolare nell'iPhone

Qualcuno ha riscontrato problemi simili, conoscerne il motivo o, ancora meglio, conoscere qualche soluzione? Testato in ios8 e ios9.

+0

Le azioni di doppia pressione su molte piattaforme vengono gestite come un singolo evento utente. UIEventTypeRemoteControl contiene proprietà che indicano quante volte è stato premuto il pulsante? –

+0

Che tipo di ritardo "ritardo" stai ottenendo? Tra mezzo secondo e un secondo? Pochi secondi? Potete fornire un progetto di esempio o un caso di test riproducibile? – JAL

risposta

1

Una doppia pressione rapida è in effetti un'azione dell'utente singolo, poiché questo è il comportamento desiderato in quasi tutte le applicazioni che utilizzano il controllo dell'auricolare per l'input. Salva gli sviluppatori che devono rimbalzare, accodare e analizzare manualmente gli eventi di controllo in ingresso ed è una buona cosa (tm)!

Per far funzionare questo sistema, il sistema introdurrà una piccola quantità di ritardo mentre attende ulteriori input da parte dell'utente. Ci vorranno solo poche centinaia di millisecondi per completarlo, dopodiché riceverai l'evento nel tuo codice.

Un lungo, doloroso, ma si spera utile esempio di premere due volte il rilevamento:

  1. utente preme verso il basso sul controllo auricolare
  2. avvisi di sistema stampa, attende il rilascio
  3. di controllo utente rilascia auricolare
  4. Avvisi di sistema, rileva la pressione del pulsante (pressione prolungata vs pressione breve) e mette in coda l'evento a pressione singola
  5. Il sistema attende 200 ms nel caso si tratti di una doppia pressione
  6. Lo è! Utente preme sul controllo auricolare
  7. comunicazioni di sistema pressa, attende rilascio
  8. controllo stampa auricolare utente
  9. sistema converte coda singolo evento stampa in doppio-press evento
  10. sistema attende 200ms nel caso è una tripla -premere
  11. Nessun input dell'utente all'interno di 200ms
  12. sistema spara doppio stampa evento e cancella la coda

vedere come il ritardo è necessario per il rilevamento di singola/doppia/tripla pressione.

Quando l'evento raggiunge l'applicazione avrà un sottotipo che descrive il tipo di selezionare l'utente ha fatto:

let rc = event!.subtype 
print("received remote control \(rc.rawValue)") // 101 = pause, 100 = play 

switch rc { 
    case .RemoteControlTogglePlayPause: 
     // .. 
    case .RemoteControlPlay: 
     // .. 
    case .RemoteControlPause: 
     // .. 
    default:break 
} 

una risposta su un similar question rilevare questi numeri interi codice evento sarà qualcosa di simile;

100 = play 
101 = pause 
103 = single mic click 
104 = double mic click 
105 = triple mic click 
etc ... 
Problemi correlati