Вопрос по objective-c – NSNotification проблемы

4

Когда мой класс инициализируется, он добавляет себя в качестве наблюдателя для множества различных уведомлений Wi-Fi. По какой-то причине селектор не работает, когда происходит что-либо из этого. Есть идеи? Спасибо заранее

-(id) init
{
    if (self)
    {
        sself = self;
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWModeDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWSSIDDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWBSSIDDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWCountryCodeDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWLinkDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWPowerDidChangeNotification object:nil];

ОБНОВИТЬ: Вот метод handleNotification:

-(void) handleNotification:(NSNotification*) notification
{
    NSLog(@"Notification Received");
}

Я включил инфраструктуру CoreWLAN в свой проект: enter image description here

Я загрузил CoreWLANWirelessManager.app, и это то, что я использую для справки. Как ни странно, код Apple использует устаревшие уведомления, и он все еще работает. Я пытался использовать новые API и устаревшие API, но безуспешно. Я не уверен, что смогу опубликовать здесь их код, но разницы буквально нет. Селектор даже имеет то же имя.

Пожалуйста, не стесняйтесь спрашивать о дальнейшей разработке.

ОБНОВЛЕНИЕ (после ответа Дастина): Я создал новый проект в надежде изолировать проблему. Я настроил свои файлы .h и .m так же, как вы описали. К сожалению, я до сих пор не получаю никаких уведомлений. Чтобы показать вам, что я не вру (или сумасшедший), я включил два (довольно многолюдных) скриншота, которые были сделаны во время одной и той же среды выполнения. Обратите внимание: (1. У меня есть точка останова в методе handleNotification: приложение никогда не останавливается. (2. Я включил окно сети, чтобы показать мой Machas действительно изменил Wi-Fi сети в течение этого времени выполнения. (3. Ничего не забито

Сеть 1: enter image description here

Сеть 2: enter image description here

ОБНОВЛЕНИЕ 17 мая 2012 г .: ответ Дастина был верным, но имя интерфейса Wi-Fi зависит от оборудования, на котором работает приложение. В моем случае (MacBook Air; нет Ethernet), мой Wi-Fi - это en0 вместо en1. Мне удалось извлечь файл конфигурации системы plst из моей мамочки iMac, и Wi-Fi называется en1. Ethernet это en0. Спасибо за вашу помощь.

Я использую OS X 10.7 Tanner Silva
Да. Если бы я мог опубликовать фотографии, я бы включил это: / Tanner Silva
Как ни странно, это точно такой же код, который Apple использует в своем примере, и он отлично работает. Tanner Silva
на какую версию MacOS вы ориентируетесь? MacOS 10,5, 10,6 или 10,7? Michael Dautermann
и включаете ли вы CoreWLAN.framework в список фреймворков в вашем проекте? Michael Dautermann

Ваш Ответ

1   ответ
3

Чтобы получить эти уведомления, вам нужно держаться за экземпляр CWInterface. Ваш .h будет выглядеть так

#import <Cocoa/Cocoa.h>
@class CWInterface;

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (retain) CWInterface *wirelessInterface;

@end

Тогда в вашем .m файле будет выглядеть так

#import "AppDelegate.h"
#import <CoreWLAN/CoreWLAN.h>

@implementation AppDelegate

@synthesize window = _window;
@synthesize wirelessInterface;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWModeDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWSSIDDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWBSSIDDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWCountryCodeDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWLinkDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWPowerDidChangeNotification object:nil];

    self.wirelessInterface = [CWInterface interfaceWithName:@"en1"];
}


-(void) handleNotification:(NSNotification*) notification
{
    NSLog(@"Notification Received");
}

@end

Обратите внимание на свойство CWInterface, это важный бит

Error: User Rate Limit Exceeded Tanner Silva
Error: User Rate Limit Exceeded Tanner Silva
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Tanner Silva
Error: User Rate Limit Exceeded

Похожие вопросы