1

私の電話:iOS5.1.1Absynth2を使用して脱獄

私がやろうとしていること: 着信コールを検出するか、コールがダイヤルされているとき...

AppDelegateさて、これが私が下に置いた私のコードでdidEnterBackground、これも試してみましたdidResignActive-エラーは発生しませんが、結果も得られません。

callCenter = [[CTCallCenter alloc] init];   
[callCenter setCallEventHandler:^(CTCall *call) {
    NSDictionary *dict = [NSDictionary dictionaryWithObject:call.callState forKey:@"callState"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"CTCallStateDidChange" object:nil userInfo:dict];
    NSLog(@"state changed on call: %@", call);
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callReceived:) name:CTCallStateIncoming object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callEnded:) name:CTCallStateDisconnected object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callConnected:) name:CTCallStateConnected object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callDial:) name:CTCallStateDialing object:nil];

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

5

問題は、iOSがバックグラウンドでUIApplicationsに通知を配信しないことです。CTCallCenterのiOSドキュメントから:

呼び出しイベントが発生したときにアプリケーションがアクティブである場合、システムはイベントをハンドラーにすぐにディスパッチします。ただし、アプリケーションが一時停止されているときにもコールイベントが発生する可能性があります。一時停止中は、アプリケーションはコールイベントを受信しません。

あなたは脱獄しているので、あなたの「アプリ」を起動デーモンにしてみませんか?そうすれば、サービスとして常に実行できます。これを行うと、次のコードが通知を受け取るはずです(私はこれをジェイルブレイクされたiOS 5.0.1 iPhone 4でテストしました):

@property (nonatomic, strong) CTCallCenter* callCenter;

次の方法で通知を登録します。

- (void) registerForCalls {

    self.callCenter = [[CTCallCenter alloc] init];
    NSLog(@"registering for call center events");
    [callCenter setCallEventHandler: ^(CTCall* call) {
        if ([call.callState isEqualToString: CTCallStateConnected]) {

        } else if ([call.callState isEqualToString: CTCallStateDialing]) {

        } else if ([call.callState isEqualToString: CTCallStateDisconnected]) {

        } else if ([call.callState isEqualToString: CTCallStateIncoming]) {

        }
        NSLog(@"\n\n callEventHandler: %@ \n\n", call.callState);
    }];
}

これまでに起動デーモンを作成したことがない場合は、起動デーモンを作成する方法に関する優れたチュートリアルがあります。

アプリにグラフィカルコンポーネントもある場合は、常に実行する起動デーモンと、ユーザーが起動したときに実行されるUIアプリの2つの部分を構築できます。必要に応じて、通知を使用して相互に通信できます。

于 2012-06-28T00:11:19.313 に答える
0

アプリを常にバックグラウンドで実行する場合は、アプリをVoipアプリにする必要があります。また、ちょっとしたトリックを行うこともできます。これにより、アプリがバックグラウンドになったときに無限のサイレント音楽を再生できます。

于 2013-05-26T01:08:11.463 に答える