iOS如何在不JB情況下得知App有沒有安裝

Apple並沒有真正讓開發者透過Native API得知一個App到底有沒有安裝, 所以不透過Private API/Jailbreak來達到安裝檢查的方法, 是一個非常重要的技巧. 目前可行的方法中, 第一種是透過URL scheme來達成, 但是如果目的App沒有定義Url Scheme就會無法使用. 第二種方法是透過sysctl來取得BSD系統的process struct, 但是由於是低階的System Call, Apple可能在系統升級的時候把API封鎖.

 

1. 使用canOpenURL判斷
NSURL *myappURL = [NSURL URLWithString:@"myapp://myhost.mydomain/mypath/myquerystring?mykey=myvalue"];  
BOOL hasMyapp = [[UIApplication sharedApplication]myappURL];  
此方法必須定義URL Scheme.
2. UIDevice Category For Processes
// .h

@interface UIDevice (ProcessesAdditions)
– (NSArray *)runningProcesses;
@end

// .m
#import <sys/sysctl.h>

@implementation UIDevice (ProcessesAdditions)

– (NSArray *)runningProcesses {

int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
size_t miblen = 4;

size_t size;
int st = sysctl(mib, miblen, NULL, &size, NULL, 0);

struct kinfo_proc * process = NULL;
struct kinfo_proc * newprocess = NULL;

do {

size += size / 10;
newprocess = realloc(process, size);

if (!newprocess){

if (process){
free(process);
}

return nil;
}

process = newprocess;
st = sysctl(mib, miblen, process, &size, NULL, 0);

} while (st == -1 && errno == ENOMEM);

if (st == 0){

if (size % sizeof(struct kinfo_proc) == 0){
int nprocess = size / sizeof(struct kinfo_proc);

if (nprocess){

NSMutableArray * array = [[NSMutableArray alloc] init];

for (int i = nprocess – 1; i >= 0; i–){

NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid];
NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm];hn

NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, nil]
forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName", nil]];
[processID release];
[processName release];
[array addObject:dict];
[dict release];
}

free(process);
return [array autorelease];
}
}
}

return nil;
}

@end

// Example usage.
NSArray * processes = [[UIDevice currentDevice] runningProcesses];
for (NSDictionary * dict in processes){
NSLog(@"%@ – %@", [dict objectForKey:@"ProcessID"], [dict objectForKey:@"ProcessName"]);
}

廣告
本篇發表於 未分類。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s