Một cách để thực hiện điều này là lắng nghe sự kiện com.apple.system.config.network_change
từ trung tâm thông báo của Core Foundation Darwin.
Đăng ký cho sự kiện:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
NULL, // observer
onNotifyCallback, // callback
CFSTR("com.apple.system.config.network_change"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
Dưới đây là một callback mẫu:
static void onNotifyCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
NSString* notifyName = (NSString*)name;
// this check should really only be necessary if you reuse this one callback method
// for multiple Darwin notification events
if ([notifyName isEqualToString:@"com.apple.system.config.network_change"]) {
// use the Captive Network API to get more information at this point
// https://stackoverflow.com/a/4714842/119114
} else {
NSLog(@"intercepted %@", notifyName);
}
}
Xem my link to another answer về cách sử dụng API Captive Mạng để có được SSID hiện tại, ví dụ.
Lưu ý rằng mặc dù điện thoại tôi đã thử nghiệm này được jailbroken (iOS 6.1), tôi không nghĩ rằng điều này đòi hỏi phải jailbreaking để hoạt động chính xác. Nó chắc chắn không yêu cầu ứng dụng đang được cài đặt bên ngoài khu vực hộp cát thông thường (/var/mobile/Applications/*
).
P.S. Tôi chưa thử nghiệm đầy đủ điều này để biết liệu sự kiện này có mang lại bất kỳ dương tính giả nào (dựa trên định nghĩa của bạn về thay đổi mạng) hay không. Tuy nhiên, nó đủ đơn giản để lưu trữ một số biến trạng thái, bằng SSID của mạng cuối cùng và so sánh với biến hiện tại, bất cứ khi nào sự kiện này xuất hiện.
+1 để viết một chỉnh sửa jailbreak! – Anil