4

ネットワーク アクティビティがなしからアップ (およびその逆) になったときに、iOS アプリのイベント/コールバックが必要です。Android が onDataActivity() を使用する方法と同様です。到達可能性について話しているのではなく、データが実際に送信を開始または停止したときです。

このアプリは App Store 向けではなく、脱獄向けでもありません。を使用して、画面がオン/オフになったときに検出する同様の機能を持っています

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

などのイベントと共に

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

データの送信を開始または停止したときのイベントがあるのだろうか?または、誰かが上記の方法で監視できるすべてのイベントの完全なリストの方向性を教えてくれたら.

4

2 に答える 2

5

ジェイルブレイクされたiOS5iPhoneで、標準のダーウィン通知とコアテルフォニー通知の両方を監視しました。

私はあなたが本当に望んでいることをする通知を見ませんでした。

送信されるコアテレフォニー通知がいくつかありますが、すべての送信の開始と終了にあるわけではありません。データサービスが接続すると、いくつかの通知があるように見えますが、繰り返しになりますが、それらは実際にはあなたが要求したものではありません。

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 */
}

上記の呼び出しでは、すべての通知を登録NULLする呼び出しに渡します。もちろん、投稿した例のように、探しているものがわかっている場合は、特定の通知の名前を渡すことができます。CTTelephonyCenterAddObserver()com.apple.iokit.hid.displayStatus

john.k.doeのオプションに関しては、そのプロパティでKey Value Observingを使用して、変更されたときに通知を受け取ることができます。

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がその指標をサードパーティの開発者が制御する必要のあるものにさえしたのは残念なことです。AndroidとBlackBerryでは、OSは送信/受信のタイミングを知るのに十分スマートです。

だから、これはまだあなたが必要とするものの一部にすぎません:(

于 2013-01-27T11:23:30.067 に答える
3

これに対するシステム通知は実際にはありません。

自分のアプリとの間のアクティビティを監視することについて話している場合、明らかにそれを制御でき、ネットワークにアクセスするために知っている呼び出しをすべてまとめることができるはずです…</p>

他のすべてのアプリとの間のアクティビティを監視することについて話している場合で、それらが Apple のガイドラインに厳密に準拠していると仮定して、ステータス バーのネットワーク アクティビティ ステータス インジケータをオン/オフにする場合は、次のように呼び出すことができます。

[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible];

ただし、これには明らかにポーリング方式で行う必要があり、おそらくバックグラウンド スレッド/GCD キューで行うのが最適です。その後、独自の通知を投稿して、アプリ内の他の場所で表示できます。

于 2013-01-27T07:08:22.047 に答える