有没有办法跟踪iPhone上的手机数据使用情况?有很多应用程序像'Dataman'和'DataUsage'那样做同样的事情
基本上我正在寻找一种编程方式来获取存储在设置 - >常规 - >用法中的信息
任何帮助将不胜感激.
从iOS 5.X开始,我曾经使用这些方法获取无线电信息:在iOS 5.1中获取CellID,MCC,MNC,LAC和网络
但是使用iOS 8.3 beta(和8.3 GM),这个私有API
_CTServerConnectionCellMonitorCopyCellInfo
不再起作用了.
我们有一个产品,用户通过提供他们的电话号码进行注册.
然而,他们注册后,他们可能会改变他们的SIM卡.
是否可以以编程方式确定SIM卡是否已被移除或插入?
(如果你提供它,谢谢,但是首先使用电话号码的任何题外话都与这个讨论无关,我不想讨论事情的这个方面,只讨论sim方面).
如果我从我的应用程序拨打电话,我无法检测到呼叫结束(状态CallStateDisconnected).但如果我的应用程序处于活动状态时接到电话,我可以检测到该状态.当我的应用程序启动呼叫时,我还会收到状态CTCallStateDialing两次或三次.它曾经在iOS5下工作,这个问题出现在iOS6上.
我的app del code;
self.callCenter = [[CTCallCenter alloc] init];
self.callCenter.callEventHandler = ^(CTCall* call) {
// anounce that we've had a state change in our call center
NSDictionary *dict = [NSDictionary dictionaryWithObject:call.callState forKey:@"callState"]; //BREAKPOINT HERE
[[NSNotificationCenter defaultCenter] postNotificationName:@"CTCallStateDidChange" object:self userInfo:dict];
};
Run Code Online (Sandbox Code Playgroud)
奇怪的是它一切正常,如果我在callEventHandler块中放置断点并在调用完成后恢复执行,那么我正确地获得CallStateDisconnected.
然后我在视图控制器中订阅通知,并在收到它时执行此代码:
- (void)ctCallStateDidChange1:(NSNotification *)notification
{
NSString *call = [[notification userInfo] objectForKey:@"callState"];
if ([call isEqualToString:CTCallStateDisconnected])
{
NSLog(@"Call has been disconnected");
}
else if([call isEqualToString:CTCallStateDialing])
{
NSLog(@"Call start");
}
else if ([call isEqualToString:CTCallStateConnected])
{
NSLog(@"Call has just been connected");
}
else …Run Code Online (Sandbox Code Playgroud) CTCallCenter的文档:setCallEventHandler:声明:
但是,在您的应用程序暂停时也可以进行呼叫事件.暂停时,您的应用程序不会收到呼叫事件.当您的应用程序恢复活动状态时,它会为每个更改状态的调用接收单个调用事件
与此问题相关的部分是
当您的应用程序恢复活动状态时,它会为每个更改状态的调用接收单个调用事件
暗示应用程序将在应用程序暂停时收到过去发生的呼叫的呼叫事件.根据这个问题的答案,这是可能的:Navita TEM应用程序如何获取呼叫日志信息?
我的问题是:如果我的应用程序被暂停并且发生了呼叫,那么当我的应用程序恢复活动状态时,它如何检索发生的呼叫的呼叫事件?
我尝试了很多很多代码实验,但是当我的应用程序恢复活动状态时,无法检索任何调用信息.
这是我尝试过的最简单的事情:1)使用Xcode单视图应用程序模板创建一个新项目.2)将下面显示的代码添加到didFinishLaunchingWithOptions 3)启动应用程序4)远离应用程序的任务5)从另一台设备拨打电话,接听电话,从任一设备挂断电话6)将应用程序带回前台从而恢复活跃状态.
注册呼叫事件的代码是:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.callCenter = [[CTCallCenter alloc] init];
[self.callCenter setCallEventHandler:^(CTCall *call)
{
NSLog(@"Event handler called");
if ([call.callState isEqualToString: CTCallStateConnected])
{
NSLog(@"Connected");
}
else if ([call.callState isEqualToString: CTCallStateDialing])
{
NSLog(@"Dialing");
}
else if ([call.callState isEqualToString: CTCallStateDisconnected])
{
NSLog(@"Disconnected");
} else if ([call.callState isEqualToString: CTCallStateIncoming])
{
NSLog(@"Incomming");
}
}];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,如果应用程序在调用发生时处于前台,我可以获取调用事件.但是,如果我在拨打电话之前离开应用程序,那么当我的应用程序下次恢复活动状态时,我无法收到呼叫事件 - 因为它表明它应该在Apple文档中.
我试过的其他事情:
1)文档说明块对象是在默认优先级全局调度队列上调度的,所以我尝试将setCallEventHandler的注册放在其中 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{})
2)在appBecameActive中调用setCallEventHandler而不是didFinishLaunchingWithOptions
3)向应用程序添加背景功能 - 通过beginBackgroundTaskWithExpirationHandler和/或使用startUpdatingLocation或startMonitoringForSignificantLocationChanges进行位置更新.
4)以上的各种组合.
一旦我在我的设备上运行代码就可以获得奖励,该代码能够在应用程序暂停时获得发生的呼叫事件.
这是在iOS …
我需要我的应用程序在有呼叫时发送通知(来电,已连接,呼叫结束)我已通过通知注册了我的viewController.
[[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];
Run Code Online (Sandbox Code Playgroud)
我还提出了一种检查呼叫状态的方法
-(IBAction)checkForCall:(id)sender{
NSLog(@"call state %@ id %@",call.callState,call.callID);
CTCallCenter *callCenter = [[CTCallCenter alloc] init];
callCenter.callEventHandler = ^(CTCall* call){
if (call.callState == CTCallStateDisconnected)
{
NSLog(@"Call has been disconnected");
}
else if (call.callState == CTCallStateConnected)
{
NSLog(@"Call has just been connected");
}
else if(call.callState == CTCallStateIncoming)
{
NSLog(@"Call is incoming");
}
else
{
NSLog(@"None of the conditions");
}
};
}
Run Code Online (Sandbox Code Playgroud)
但这一切都不起作用.请帮我.
哪里出错了?是否有任何代码告诉如何使用核心电话?
CTCarrier的carrierName的文档说明"如果用户正在漫游,则值不会改变;它始终代表用户拥有帐户的提供商."
然而,它并没有对mobileNetworkCode说同样的话.这是基于当前运营商的变化还是保持不变?
我正在尝试查找手机是否在startMonitoringSignificantLocationChanges回调中漫游,以便避免地理定位.
Navita https://itunes.apple.com/us/app/navita-tem-personal/id590228620?mt=8如何 设法显示通话记录?
如果我将应用程序从任务管理器中滑出,那么它会错过调用,这表明它必须使用CTCallCenter的callEventHandler,并通过保存响应callEventHandler回调的时间/持续时间来创建自己的调用日志.
但是,如果是这种情况,那么它如何设法在后台执行此操作?我的印象是callEventHandler只能被前景中的应用程序使用而不能被后台使用?
该应用程序正在使用位置服务,但即使在禁用此功能后,它仍然可以获取有关呼叫的信息(前提是应用程序未被暂停).我虽然可能正在使用后台位置更新来保持自己准备接收callEventHandler回调但显然不是.
Navita应用程序还能够显示通话时间和通话时长.
赏金将被授予一个答案,其中包含足够,准确和详细的信息,使我能够模仿Navita应用程序的行为,特别是我必须能够编写一个应用程序,可以获得发生的电话呼叫的时间和持续时间虽然应用程序不在前台,但设备的位置服务已关闭,并且应用程序在后台运行的时间超过了使用beginBackgroundTaskWithExpirationHandler授予的~3分钟:
Here is what I observe with the Navita app that I want to be able to reproduce:
1) Run app
2) Task away from app
3) Go to device settings, privacy, and turn off Location Services.
4) Go to device settings, privacy, background app refresh and turn off for the app
5) Wait > 10 minutes to make sure the app is not still in the background as a consequence of …Run Code Online (Sandbox Code Playgroud) 我尝试使用此代码获取运营商名称(使用CoreTelephony):
CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = [netinfo subscriberCellularProvider];
NSLog(@"Carrier Name: %@", [carrier carrierName]);
Run Code Online (Sandbox Code Playgroud)
它返回"Carrier".如果我去iPhone设置我的运营商名称是正确的.我手机上的iOS是v4.2.1.
我究竟做错了什么?
我希望能够以编程方式发送iMessage而不做任何其他事情,除了调用一个函数,该函数将文本发送到带有消息的数字,这两个文本框都是文本框.我非常感谢一些示例代码,因为我已经在网上搜索,但我发现的任何内容都没有帮助.这不是一个商业应用程序,只是我,所以它可以使用私有框架,或任何能够完成这项工作的东西.谢谢.