主要思路就是 ,在要被識別的應用程式B的XCode的info.plist中
如果是Xcode 4.2 ,那麼
1. 在info.plist 中 增加 一個 URL Schemes: XXX
添加的具體細節是:
1.1 開啟 info.plist ,在 Information Property List的下面增加一項:URL types
1.2 然後在 URL Types 下面增加一項 Item 0 ,這是個Dictionary
1.3 在 Item0 下面增加一個 URL Schemes 類型的 Array
1.4 然後在URL Schemes 的下面增加一個 URL identifier ,String值可以不填
在 Item0 的下面增加一個 Item0, String值就是 XXX 就可以了。
開始在網上 看到說添加 URL Schemes ,以為直接添加到 Information Property List 下面的一項,key為 URL Schemes ,值為 XXX就ok了,後面發現不起作用。這個裡面只能添加指定的類型,會自動提示相關的類型,正確的方法是上面的過程。
如果是Xcode 4.6 ,那麼按照下面的方法添加:
解決方案:
從91SDK3.2.5開始要求接入方需要設定一個URL Scheme,設定方法如下:選中工程中的Target,選中Info標籤頁,找到底下的URL
Types,展開,點擊加號,建立一個新的URL Scheme。
點擊後,Identifier欄位填入你的軟體標識符,URL Schemes欄位填入格式為:91-xxxxx,其中xxxx為你的軟體標識符。Role欄位可以設定為None,Icon欄位可以不填。樣本如下:
2. 然後 在主動裝置的應用程式A中,通過 這個方法判斷手機中是否存在這個應用B
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"XXX://"]];
如果返回YES則表示此應用在手機中安裝過,反之則沒有安裝過.
具體代碼如下:
-(BOOL) APCheckIfAppInstalled2:(NSString *)urlSchemes{ if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlSchemes]]) { NSLog(@" installed"); return YES; } else { return NO; }}
調用 APCheckIfAppInstalled2:XXX 就可以判斷 是否安裝了應用程式B 了。
這個方法不管對越獄過的iOS裝置還是沒有越獄過的裝置都生效。
還有另外一個 查看
com.apple.mobile.installation.plist 系統檔案的方法,通過 bundle identifier 來判斷,但是只能判斷越獄機,因為越獄機才能訪問到這個檔案,在非越獄的機器中,因為不允許應用程式訪問沙箱環境以外的目錄,所以不能讀取這個檔案,甚至判斷這個檔案是否存在都會失敗。
代碼如下:
-(BOOL) APCheckIfAppInstalled:(NSString *)bundleIdentifier{ static NSString *const cacheFileName = @"com.apple.mobile.installation.plist"; NSString *relativeCachePath = [[@"Library" stringByAppendingPathComponent: @"Caches"] stringByAppendingPathComponent: cacheFileName]; NSDictionary *cacheDict = nil; NSString *path = nil; // Loop through all possible paths the cache could be in for (short i = 0; 1; i++) { switch (i) { case 0: // Jailbroken apps will find the cache here; their home directory is /var/mobile path = [NSHomeDirectory() stringByAppendingPathComponent: relativeCachePath]; break; case 1: // App Store apps and Simulator will find the cache here; home (/var/mobile/) is 2 directories above sandbox folder path = [[NSHomeDirectory() stringByAppendingPathComponent: @"../.."] stringByAppendingPathComponent: relativeCachePath]; break; case 2: // If the app is anywhere else, default to hardcoded /var/mobile/ path = [@"/var/mobile" stringByAppendingPathComponent: relativeCachePath]; break; default: // Cache not found (loop not broken) return NO; break; } BOOL isDir = NO; if ([[NSFileManager defaultManager] fileExistsAtPath: path isDirectory: &isDir] ) // Ensure that file exists { if (isDir == YES) { NSLog(@"Dir"); } else { cacheDict = [NSDictionary dictionaryWithContentsOfFile: path]; } } if (cacheDict) // If cache is loaded, then break the loop. If the loop is not "broken," it will return NO later (default: case) break; } NSDictionary *system = [cacheDict objectForKey: @"System"]; // First check all system (jailbroken) apps if ([system objectForKey: bundleIdentifier]) return YES; NSDictionary *user = [cacheDict objectForKey: @"User"]; // Then all the user (App Store /var/mobile/Applications) apps if ([user objectForKey: bundleIdentifier]) return YES; // If nothing returned YES already, we'll return NO now return NO;}