检测是否已在越狱的iDevice中安装/卸载了其他应用程序

时间:2014-08-11 07:14:51

标签: ios objective-c background jailbreak

我想检测何时安装/卸载了另一个应用程序,并在执行时将时间保存到数据库中。

我知道在Android中使用broadcastreceiver这是可能的,我想知道这是否可以在iOS中使用jailBroken设备完成,因为我相信这在非jailBroken设备中是不可能的。

我希望有人可以帮助我。谢谢。

2 个答案:

答案 0 :(得分:2)

最近遇到了同样的问题。

您需要编写SpringBoard调整。您可以在其中观察来自本地通知中心(SBInstalledApplicationsDidChangeNotificationCFNotificationCenterGetLocalCenter)的通知[NSNotificationCenter defaultCenter]。用户信息字典将包含:

  • SBInstalledApplicationsRemovedBundleIDs密钥包含已卸载应用程序的软件包ID数组。
  • SBInstalledApplicationsModifiedBundleIDs键包含已更新应用程序的包ID数组。
  • SBInstalledApplicationsAddedBundleIDs密钥包含已安装应用程序的软件包ID数组。

显然,每次安装/卸载/更新应用程序时都可以记录。

答案 1 :(得分:1)

您可以使用其包ID

检查是否安装了应用程序
BOOL isInstalled = [[LSApplicationWorkspace defaultWorkspace] applicationIsInstalled:@"com.app.identifier"];

if (isInstalled) {
    // app is installed }
else {
    // app is not installed
}

修改

如果您想检查某个应用程序是否已安装,您可以计算user com.apple.mobile.installation.plist内的项目,它包含有关已安装应用程序的所有信息。

您可以在plist中写下应用程序的数量,然后再检查并比较结果吗?

// get apps count
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Caches/com.apple.mobile.installation.plist"];
int numberOfApps = [[dict objectForKey: @"User"] count];
NSLog(@"Count: %i",numberOfApps);

// Save apps count inside a plist
NSString *path = @"/var/mobile/AppsCount.plist"; 
NSFileManager *fm = [NSFileManager defaultManager];
NSMutableDictionary *data;
 if ([fm fileExistsAtPath:path]) {
     data = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
}
else {
    // If the file doesn’t exist, create an empty dictionary
    data = [[NSMutableDictionary alloc] init];
}
[data setObject:[NSNumber numberWithInt:numberOfApps] forKey:@"savedAppsCount"];
[data writeToFile:path atomically:YES];
[data release];

然后将旧计数与新应用计数进行比较:

// get current number of apps
NSString *path = @"/var/mobile/AppsCount.plist";
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Caches/com.apple.mobile.installation.plist"];
int numberOfApps = [[dict objectForKey: @"User"] count];

// retrieve old app count and compare to new ones
NSMutableDictionary *retrieveCounts = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
int oldAppCount = [[retrieveCounts objectForKey:@"savedAppsCount"] intValue];
if (oldAppCount < numberOfApps) { 
    NSLog(@"NEW APP GOT INSTALLED");
     }
else if (oldAppCount > numberOfApps) {
    NSLog(@"AN APP GOT UNINSTALLED");
}
else {
    NSLog(@"NOTHING GOT INSTALLED OR UNINSTALLED");
}
[retrieveCounts release];

但是这并没有给你时间,只是检查是否安装了新的应用程序

可能有更好的方法可以做到这一点,但这就是我想到的。 希望它有所帮助。