2013-12-18 17 views
5

Wiem, że możesz korzystać z tej usługi, aby urządzenia takie jak inteligentne zegarki przechwytywały powiadomienia z urządzeń z systemem iOS. Ale czy możesz otrzymywać powiadomienia na iOS na Macu przez OS X?Usługa Centrum powiadomień Apple za pośrednictwem OS X

Chcę, aby mój program OS X mógł wykryć określony typ powiadomienia otrzymany w iOS. Próbowałem przeglądania urządzenia ANCS na moim Macu, ale nie pokazało się. Wiem, że nie możesz tego zrobić między urządzeniami z iOS, więc zastanawiałem się, czy może to samo dotyczy systemu iOS i OS X, czy nie? Dzięki!

Odpowiedz

9

Jest to zdecydowanie możliwe!

Oto co trzeba:

  1. Aplikacja na urządzenia z iOS, która importuje CoreBluetooth i używa CBPeripheralManager reklamować obojętne usługi jakimś niestandardowym UUID (nie w ANCS UUID, to nie będzie działać). Ta sztuczna usługa jest wymagana, aby komputer Mac mógł "widzieć" usługę ANCS. *
  2. Aplikacja na komputerze Mac, która importuje IOBluetooth, inicjuje obiekt CBCentralManager i rozpoczyna skanowanie. Można to zrobić tak jak:

    [self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:YOUR_CUSTOM_SERVICE_UUID]] options:@{CBCentralManagerScanOptionSolicitedServiceUUIDsKey:@[[CBUUID UUIDWithString:ANCS_SERVICE_UUID]]]; 
    

    Upewnij się, ustawić się jako delegat do CBCentralManager otrzymywać zwrotnych delegata.

  3. Gdy Mac odkrywa swoje urządzenie w didDiscoverPeripheral, podłącz do niego: [self.centralManager connectPeripheral:peripheral options:nil];

    1 bardzo ważną rzeczą, aby pamiętać o to trzeba zachować obwodowych do nieruchomości, jeśli chcesz połączyć się z nim, inaczej zostanie dealloc'ed. Aby uzyskać bardziej szczegółową dyskusję, zobacz this answer.

  4. W didConnectPeripheral, trzeba ustawić się jako delegat do CBPeripheral jesteś podłączony do następnie rozpocząć odkrywanie usługi:

    [peripheral discoverServices:nil];

    (wszystkie wywołania zwrotne od tego momentu są na CBPeripheral)

  5. W didDiscoverServices należy uzyskać listę dostępnych usług.Pętla przez nich tak i odkryć cechy każdej usługi jest:

    for (CBService *service in peripheral.services) { 
        if ([service.UUID isEqual:[CBUUID UUIDWithString:YOUR_CUSTOM_SERVICE_UUID]]) { 
         NSLog(@"Found your Custom Service"); 
        } 
        if ([service.UUID isEqual:[CBUUID UUIDWithString:ANCS_UUID]]) { 
         NSLog(@"Found ANCS Service"); 
        } 
    
        [peripheral discoverCharacteristics:nil forService:service]; 
    } 
    
  6. W didDiscoverCharacteristicsForService, chcesz wyglądać na 3 cech:

    • ANCS Powiadomienie Źródło: UUID 9FBF120D-6301-42D9-8C58-25E699A21DBD (zgłoszenia)
    • ANCS Kontroli Punkt: UUID 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9 (do zapisu z odpowiedzią)
    • ANCS Źródło danych: UUID 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB (podlegający notyfikacji)

    Dla tych zgłaszania cech, zapisz się do nich aktualizacje:

    if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:ANCS_CHARACTERISTIC_UUID]]) { 
        [peripheral setNotifyValue:YES forCharacteristic:characteristic]; 
    } 
    
  7. Jeśli chcesz sprawdzić, czy cechy te są zaczęli powiadamiania, zrobić if(characteristic.isNotifying) w didUpdateNotificationStateForCharacteristic.

  8. Otrzymasz aktualne aktualizacje NSData w didUpdateValueForCharacteristic z characteristic.value. Ważne jest, aby pamiętać, że informacje o powiadomieniu będą dostarczane przez zdarzenia według właściwości źródła powiadomień, ale nie będą zawierały tak wielu informacji. Jeśli chcesz, aby Twój Mac odtwarzał dźwięk lub migał jakieś światełka Hue lub coś takiego dla każdego powiadomienia iOS, to wystarczy. Jednak w przypadku rzeczywistego powiadomienia szczegóły, będzie ono musiało pochodzić z charakterystyki źródła danych, ale trzeba o nie poprosić, wykonując bardzo konkretne wywołania charakterystyki punktu kontrolnego. Staje się to bardzo skomplikowane, a będziesz mógł uzyskać więcej informacji na oficjalnej stronie ANCS Specification document.

  9. Jeśli chcesz skrót lub przyjrzeć się, jak inni zrobili to, sprawdź te repo GitHub:

    Wystarczy być ostrożnym ponieważ można znaleźć błędy w niektórych z tych implementacji, głównie w przetwarzaniu danych wysyłanych przez źródło danych ANCS (musiałem et creative z własną obsługą błędów).

*** Niektórzy mogą twierdzić, że można użyć "Service Solicitation" narażać ANCS bez aplikacji uruchomionych na urządzeniu z iOS i/lub bez reklamy obojętne Service (patrz options parametr w kroku 2), ale haven Odniosło to tak wiele sukcesów, więc być może jest coś, czego mi brakuje.

Powiązane problemy