3

네트워크 활동이 없음에서 위로 (및 다른 방향으로) 이동하면 내 IOS 응용 프로그램에 대한 이벤트/콜백이 필요합니다. onDataActivity()에서 Android가하는 일과 유사합니다. Reachability에 대해 말하는 것이 아니라 데이터가 실제로 전송을 시작하거나 중지 할 때입니다.네트워크 활동 위/아래/꺼짐에 대한 iOS 이벤트/알림

앱은 앱 스토어 용이 아니며 탈옥 (jailbreak)을위한 것이 아닙니다. 화면은 이제 데이터가있는 경우에 대한 이벤트가 있는지 궁금

com.apple.springboard.hasBlankedScreen 
com.apple.springboard.lockstate 

같은 다른 이벤트와 함께

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center 
     NULL, // observer 
     displayStatusChanged, // callback 
     CFSTR("com.apple.iokit.hid.displayStatus"), // event name 
     NULL, // object 
     CFNotificationSuspensionBehaviorDeliverImmediately); 

를 사용하여 온/오프 작업에 갈 때 나는 검출하는 비슷한 기능을 가지고있다 전송을 시작했거나 중단 했습니까? 또는 누군가 위의 방법으로 모니터링 할 수있는 모든 이벤트의 전체 목록의 방향을 지적 할 수 있다면.

답변

3

실제로 시스템 알림이 없습니다.

당신이 당신의 자신의 응용 프로그램에서, 당신은 분명 그 제어 할 수 있습니다, 당신은 네트워크에 액세스 알고 어떤 통화를 브래킷 할 수 있어야합니다 /로 모니터링 활동에 대해 얘기하는 경우 ...

당신이 모니터링에 대해 이야기하는 경우 활동에/다른 모든 응용 프로그램에서, 당신은 그들이 애플의 가이드 라인을 엄격하게 준수하는지 추정 및 상태 표시 줄에/오프 네트워크 활동 상태 표시등을 켜하고자하는, 당신은 호출 할 수

[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]; 

하지만, 이 작업은 폴링 방식으로 수행해야합니다. 아마도 백그라운드 스레드/GCD 큐에서 수행하는 것이 가장 좋습니다. . 그러면 앱 내 다른 곳에서 볼 수 있도록 자신의 알림을 게시 할 수 있습니다.

+0

덕분에 무엇을 부분적으로 만 여전히, 그것은 항상 작은 스피너 상단 우측 회전 경우에도 false를 반환 아마도 응용 프로그램이 백그라운드에서 실행되고 있기 때문일 수 있습니다. 둘째, 네트워크 활동 표시기가이 방법을 확인하면 개발자가 바로 호출 할 수 있습니다. 그렇다면 네트워크가 사용 중이지만 앱 개발자가 회 전자를 시작하지 않으면 여전히 불행히도 John과 내 솔루션 모두 다른 개발자에게이 선택적 API를 사용해야합니다. Apple의 소프트웨어 자체는 사용하기에 꽤 좋지만 다른 타사와도 호환됩니다 (Nate의 옵저버를 사용하여 알림을 얻지는 않습니까?) – Sunkas

+0

@Sunkas, 맞습니다. 개발자는 네트워크 활동을 100 % 알려주지 않습니다. 예. – Nate

+0

@ john.k.doe 귀하의 답변을 주셔서 감사합니다, 나는 모든 네트워크 활동을 모니터하려고했는데, 나는 내 모니터 만해야합니다 ... –

5

jailbroken 된 iOS 5 iPhone에서 표준 Darwin 알림과 코어 텔리 노티 알림을 모두 모니터링했습니다.

알림을 보지 못했습니다.은 정말로 원하는 것을 수행합니다.

발신 전화가 시작되지만 끝날 때마다 발신 전화 알림이 몇 가지 있습니다. 그것은 약간의 통지가있을 수 있습니다, 데이터 서비스가 연결될 때처럼 보이지만 다시, 그들은 정말 당신이 무엇을 요구 정확히되지 않습니다

kCTIndicatorRadioTransmitNotification 
kCTRegistrationDataStatusChangedNotification 

은 당신이 모든 코어 전화 알림을 모니터링하려고 할 경우 자신, 당신은 코어 전화 프레임 워크 및 CT 알림 센터를 사용할 수 있습니다 : 위의 호출에

-(void) registerCallback { 
    id ct = CTTelephonyCenterGetDefault(); 
    CTTelephonyCenterAddObserver(ct, // center 
           NULL, // observer 
           telephonyEventCallback, // callback 
           NULL,     // event name (or all) 
           NULL,     // object 
           CFNotificationSuspensionBehaviorDeliverImmediately); 
}  

static void telephonyEventCallback(CFNotificationCenterRef center, void* observer, CFStringRef name, const void* object, CFDictionaryRef userInfo) 
{ 
    //NSLog(@"telephonyEventCallback()"); 

    NSString* notifyName = (__bridge NSString*)name; 
    if ([notifyName isEqualToString:@"kCTMessageReceivedNotification"]) { // received SMS 

    } /* look for other notification names here */ 
} 

을, 나는 모든 알림을 등록하는 CTTelephonyCenterAddObserver() 전화에 NULL를 전달합니다. com.apple.iokit.hid.displayStatus에 게시 한 예와 같이 원하는 것을 알고있는 경우 특정 알림의 이름을 전달할 수 있습니다.이 변경 될 때 john.k.doe's option에 대해서는

이, 당신이 해당 속성에 관찰 키 값을 사용하려고 통지를 얻을 수 있습니다

UIApplication* app = [UIApplication sharedApplication]; 
[app addObserver: self forKeyPath: @"networkActivityIndicatorVisible" options: NSKeyValueObservingOptionNew context: nil]; 

당신의 관찰자 콜백입니다 :

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([keyPath isEqualToString:@"networkActivityIndicatorVisible"]) { 
     // process here 
     NSLog(@"network activity indicator change!"); 
     BOOL active = [UIApplication sharedApplication].networkActivityIndicatorVisible; 
    } 
} 

잘 모르겠어요 KVO가 백그라운드에서 계속 작동한다면 앱이 배경을 관리하는 방법에 달려 있습니다.

하지만 물론, 앱이 네트워크에 액세스 할 때 실제로 그 속성을 사용하도록 요구합니다. Apple이 제 3 자 개발자가 제어해야하는 지표를 만들었던 것은 불행한 일입니다. Android 및 BlackBerry에서 OS는 전송/수신 시점을 알기에 충분히 똑똑합니다.

그래서, 이것은 당신이 먼저,이 방법은 동작하지 않습니다! :(필요가 답장을 보내

+0

나는 지금까지 코드/제안의 첫 부분을 시도했습니다. RTLD_LAZY가 선언되지 않았다는 오류 메시지가 나타납니다. 또한 "C99에서"dlsym '함수의 암시 적 선언에 대한 아래의 두 행에 대한 일부 경고가 유효하지 않습니다. " 이 장치는 실제로 jailbreaked가 아닌 장치에서 작동합니까? http://cutnpaste.org/blog/ios-listen-incoming-sms/에서 비슷한 코드를 찾으십시오.하지만이 코드가 작동하려면 탈옥이 필요하다고 언급되어 있습니다. – Sunkas

+0

'RTLD_LAZY'와 나머지 동적 라이브러리 함수로 컴파일해야하는'#include '를 추가하기 위해 제 대답을 편집했습니다. 응답에서 말했듯이 내가 게시 한 코드는 코어 텔레포니 프레임 워크를 동적으로로드하고 CTTelephonyCenterAddObserver() 함수를 동적으로 찾습니다. 당신은 ** 그렇게 할 수있는 방법이 없다 ** 동적로드를 원했던 코드가 생겼다. Core Telephony 프레임 워크를 프로젝트에 일반적인 방법으로 포함시킬 수 있으며'CTTelephonyCenterAddObserver()'함수를 직접 호출하면됩니다. – Nate

+0

@Sunkas, 이것은 jailbroken되지 않은 장치에서 작동합니다. 나는 감옥에있는 iOS 6 iPhone 5에서 그것을 시도하고 CT 알림을 받았다. 링크 된 예는 단순히 알림을 듣는 것 이상의 일을하기위한 것입니다. 들어오는 SMS를 읽으려면 해당 알림을 듣고 sqlite로 sms.db 파일을 열어 SMS 내용을 가져와야합니다. 두 번째 부분에는 jailbroken 전화가 필요합니다. 하지만 문제를 해결하기 위해 알림을 구독하는 것이 좋습니다. – Nate