【问题标题】:Detecting phone calls when the app is asleep当应用程序处于睡眠状态时检测电话
【发布时间】:2015-02-12 13:21:31
【问题描述】:

我正在尝试做的是一个在来电时运行代码的应用程序。我知道我无法获得来电者的任何详细信息,这很好。

到目前为止,我的问题是它仅在应用程序处于前台时才有效。

这是我的代码:

#import <CoreTelephony/CoreTelephonyDefines.h>
#import <CoreTelephony/CTCallCenter.h>
#import <CoreTelephony/CTCall.h>

CTCallCenter *callCenter = [[CTCallCenter alloc] init];

[callCenter setCallEventHandler:^(CTCall *call) {
    ONLog(@"Event handler called");
    if ([call.callState isEqualToString: CTCallStateConnected]) {
        ONLog(@"Connected");
    } else if ([call.callState isEqualToString: CTCallStateDialing]) {
        ONLog(@"Dialing");
    } else if ([call.callState isEqualToString: CTCallStateDisconnected]) {
        ONLog(@"Disconnected");
    } else if ([call.callState isEqualToString: CTCallStateIncoming]) {
        ONLog(@"Incomming");
    }
}];

有人可以帮我把它作为后台任务运行吗?

编辑:

我这样使用 Richas 的代码:

    __block UIBackgroundTaskIdentifier yourBackgroundTaskName;
    yourBackgroundTaskName = [application beginBackgroundTaskWithExpirationHandler:^{

        // CODE FOR EXPIRATION HANDLER BLOCK
        [application endBackgroundTask: yourBackgroundTaskName];
        yourBackgroundTaskName = UIBackgroundTaskInvalid;

    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // DO YOUR STUFF HERE. START OF BACKGROUND TASK.
        NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);

        self.callCenter = [[CTCallCenter alloc] init];

        [self.callCenter setCallEventHandler:^(CTCall *call) {
            ONLog(@"Event handler called");
            if ([call.callState isEqualToString: CTCallStateConnected]) {
                ONLog(@"Connected");
            } else if ([call.callState isEqualToString: CTCallStateDialing]) {
                ONLog(@"Dialing");
            } else if ([call.callState isEqualToString: CTCallStateDisconnected]) {
                ONLog(@"Disconnected");
            } else if ([call.callState isEqualToString: CTCallStateIncoming]) {
                ONLog(@"Incomming");
            }
        }];


        //WHEN YOU ARE DONE WITH YOUR TASK, TELL THAT TO SYSTEM
        [application endBackgroundTask: yourBackgroundTaskName];
        yourBackgroundTaskName = UIBackgroundTaskInvalid;
    });
  1. 它只为我买了 180 秒的后台运行...
  2. 它不工作 :) 未检测到呼叫

【问题讨论】:

  • 你能确保它不会落入最后一个没有写的else。只是一个想法。
  • 您打算在 Appstore 中发布您的应用吗?有一个简单的解决方案 - 不要让您的应用程序被暂停。为此,您可以使用非常流行的技巧 - 在后台播放静音音频文件,这将使设备和您的应用程序不会进入睡眠状态。但这意味着您必须有正当理由这样做,否则您的应用将被拒绝。

标签: objective-c core-telephony


【解决方案1】:

您应该检查以下两种方法来解决您的问题:

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(NSString *)taskName expirationHandler:(void (^)(void))handler`

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler

您可以在applicationDidEnterBackground 中实施其中的任何一个,这可以为您争取一些时间(5-10 分钟)。代码可能如下所示:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIBackgroundTaskIdentifier yourBackgroundTaskName;
    yourBackgroundTaskName = [application beginBackgroundTaskWithExpirationHandler:^{

          // CODE FOR EXPIRATION HANDLER BLOCK
          [application endBackgroundTask: yourBackgroundTaskName];
          yourBackgroundTaskName = UIBackgroundTaskInvalid;

    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

         // DO YOUR STUFF HERE. START OF BACKGROUND TASK.

         //WHEN YOU ARE DONE WITH YOUR TASK, TELL THAT TO SYSTEM
         [application endBackgroundTask: yourBackgroundTaskName];
         yourBackgroundTaskName = UIBackgroundTaskInvalid;
    });
}

希望,这至少可以帮助您入门。

【讨论】:

  • 我的回答假设您的应用程序进入后台而不是从后台杀死。
  • 谢谢,我会调查并通知您
猜你喜欢
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多