Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Full source code and dataset - Version 2.1 - Tag: Issue #2

  • Loading branch information...
commit 154afe0b57da0efad75ffce6310bf1d168d1a209 1 parent 3e24573
@danielamitay authored
Showing with 12,591 additions and 52 deletions.
  1. BIN  ...AppExample.xcodeproj/project.xcworkspace/xcuserdata/danielamitay.xcuserdatad/UserInterfaceState.xcuserstate
  2. +1 −1  LICENSE.md
  3. +25 −14 README.md
  4. +0 −1  iHasApp.framework/Headers
  5. +0 −1  iHasApp.framework/Resources
  6. BIN  iHasApp.framework/Versions/A/Resources/Info.plist
  7. BIN  iHasApp.framework/Versions/A/Resources/en.lproj/InfoPlist.strings
  8. BIN  iHasApp.framework/Versions/A/iHasApp
  9. +0 −1  iHasApp.framework/Versions/Current
  10. +0 −1  iHasApp.framework/iHasApp
  11. +2 −1  {iHasApp.framework/Versions/A/Headers → iHasApp}/iHasApp.h
  12. +346 −0 iHasApp/iHasApp.m
  13. +12,186 −0 iHasApp/schemeApps.json
  14. +22 −13 {Example Project → iHasAppExample}/iHasAppExample.xcodeproj/project.pbxproj
  15. 0  {Example Project → iHasAppExample}/iHasAppExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  16. BIN  ...AppExample.xcodeproj/project.xcworkspace/xcuserdata/danielamitay.xcuserdatad/UserInterfaceState.xcuserstate
  17. 0  ...sAppExample}/iHasAppExample.xcodeproj/xcuserdata/danielamitay.xcuserdatad/xcschemes/iHasAppExample.xcscheme
  18. 0  ...AppExample}/iHasAppExample.xcodeproj/xcuserdata/danielamitay.xcuserdatad/xcschemes/xcschememanagement.plist
  19. +1 −1  {Example Project → iHasAppExample}/iHasAppExample/AppDelegate.h
  20. +1 −1  {Example Project → iHasAppExample}/iHasAppExample/AppDelegate.m
  21. 0  {Example Project → iHasAppExample}/iHasAppExample/Default-568h@2x.png
  22. 0  {Example Project → iHasAppExample}/iHasAppExample/Default.png
  23. 0  {Example Project → iHasAppExample}/iHasAppExample/Default@2x.png
  24. +1 −1  {Example Project → iHasAppExample}/iHasAppExample/DetailViewController.h
  25. +1 −6 {Example Project → iHasAppExample}/iHasAppExample/DetailViewController.m
  26. +1 −1  {Example Project → iHasAppExample}/iHasAppExample/MasterViewController.h
  27. +3 −8 {Example Project → iHasAppExample}/iHasAppExample/MasterViewController.m
  28. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDImageCache.h
  29. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDImageCache.m
  30. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDImageCacheDelegate.h
  31. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImageCompat.h
  32. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImageDecoder.h
  33. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImageDecoder.m
  34. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImageDownloader.h
  35. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImageDownloader.m
  36. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImageDownloaderDelegate.h
  37. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImageManager.h
  38. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImageManager.m
  39. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImageManagerDelegate.h
  40. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImagePrefetcher.h
  41. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/SDWebImagePrefetcher.m
  42. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/UIImageView+WebCache.h
  43. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/UIImageView+WebCache.m
  44. 0  {Example Project → iHasAppExample}/iHasAppExample/SDWebImage/placeholder-icon.png
  45. 0  {Example Project → iHasAppExample}/iHasAppExample/en.lproj/InfoPlist.strings
  46. 0  {Example Project → iHasAppExample}/iHasAppExample/iHasAppExample-Info.plist
  47. 0  {Example Project → iHasAppExample}/iHasAppExample/iHasAppExample-Prefix.pch
  48. +1 −1  {Example Project → iHasAppExample}/iHasAppExample/main.m
  49. BIN  screenshot.png
View
BIN  ...Example.xcodeproj/project.xcworkspace/xcuserdata/danielamitay.xcuserdatad/UserInterfaceState.xcuserstate
Binary file not shown
View
2  LICENSE.md
@@ -2,7 +2,7 @@
## MIT License
-Copyright (c) 2012 iHasApp (http://www.iHasApp.com)
+Copyright (c) 2012 Daniel Amitay (http://danielamitay.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
View
39 README.md
@@ -1,28 +1,30 @@
-Notice (Nov 13, 2012):
------------
-
-iHasApp's codebase and dataset will be open sourced within the week. Check back!
-
iHasApp Framework
=========================
The iHasApp iOS Framework allows you to detect installed apps on a user's device.
-Detection results can be in the form of an array of detected appIds, or an array of appDictionaries from the iTunes Search API.
+Detection results can be in the form of an array of detected appIds, or an array of appDictionaries from the [iTunes Search API](http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html).
-Basic Setup
+![Screenshot](https://github.com/danielamitay/iHasApp/raw/master/screenshot.png)
+
+Background
-----------
-1. Add iHasApp.framework to your project and ensure that it is linked to the project target.
+- [How To Detect Installed iOS Apps](http://danielamitay.com/blog/2011/2/16/how-to-detect-installed-ios-apps) - (Feb 2011)
+- [Detailed iPhone App IPA Statistics](http://danielamitay.com/blog/2011/5/9/detailed-iphone-app-ipa-statistics) - (May 2011)
+
-2. Add `#import <iHasApp/iHasApp.h>` to the classes in which you wish to access iHasApp.
+Basic Setup
+-----------
+1. Add the iHasApp subfolder to your project and ensure that it is linked to the project target.
+2. Add `#import "iHasApp.h"` to the classes in which you wish to access iHasApp.
3. Initialize and begin detection methods.
Example code:
```objective-c
-iHasApp *detectionObject = [[iHasApp alloc] init];
+iHasApp *detectionObject = [iHasApp new];
[detectionObject detectAppDictionariesWithIncremental:^(NSArray *appDictionaries) {
NSLog(@"Incremental appDictionaries.count: %i", appDictionaries.count);
} withSuccess:^(NSArray *appDictionaries) {
@@ -36,7 +38,9 @@ Requirements
-----------
- iOS base SDK 5.0+
-- Internet connectivity
+- Internet connectivity (optional if schemeApps.json is included)
+
+*Note*: schemeApps.json only adds ~180kB to your final, compiled IPA
App Store Safe
--------------
@@ -57,9 +61,16 @@ Documentation
The `iHasApp.h` header file is structurally commented. If you would like to see the Appledoc representation, visit the [iHasApp Documentation](http://www.ihasapp.com/documentation).
+To-Do
+--------------
+
+- Comment code where appropriate
+- Provide IPA processing code
+- Informational methods
+
Info & Support
--------------
-Website: [iHasApp](http://www.ihasapp.com)
-Author: [Daniel Amitay](https://github.com/danielamitay)
-Email: daniel@ihasapp.com
+- Website: [iHasApp](http://www.ihasapp.com)
+- Author: [Daniel Amitay](https://github.com/danielamitay)
+- Email: daniel@ihasapp.com
View
1  iHasApp.framework/Headers
View
1  iHasApp.framework/Resources
View
BIN  iHasApp.framework/Versions/A/Resources/Info.plist
Binary file not shown
View
BIN  iHasApp.framework/Versions/A/Resources/en.lproj/InfoPlist.strings
Binary file not shown
View
BIN  iHasApp.framework/Versions/A/iHasApp
Binary file not shown
View
1  iHasApp.framework/Versions/Current
View
1  iHasApp.framework/iHasApp
View
3  iHasApp.framework/Versions/A/Headers/iHasApp.h → iHasApp/iHasApp.h
@@ -1,8 +1,9 @@
//
// iHasApp.h
+// iHasApp
//
// Created by Daniel Amitay on 10/21/12.
-// Copyright (c) 2012 Objective-See. All rights reserved.
+// Copyright (c) 2012 Daniel Amitay. All rights reserved.
//
#import <UIKit/UIKit.h>
View
346 iHasApp/iHasApp.m
@@ -0,0 +1,346 @@
+//
+// iHasApp.m
+// iHasApp
+//
+// Created by Daniel Amitay on 10/21/12.
+// Copyright (c) 2012 Daniel Amitay. All rights reserved.
+//
+
+#import "iHasApp.h"
+
+@implementation iHasApp
+
+@synthesize country = _country;
+
+#pragma mark - Public methods
+
+- (void)detectAppIdsWithIncremental:(void (^)(NSArray *appIds))incrementalBlock
+ withSuccess:(void (^)(NSArray *appIds))successBlock
+ withFailure:(void (^)(NSError *error))failureBlock
+{
+ dispatch_queue_t detection_thread = dispatch_queue_create(NULL, NULL);
+ dispatch_async(detection_thread, ^{
+
+ [self retrieveSchemeAppsDictionaryWithSuccess:^(NSDictionary *schemeAppsDictionary) {
+ NSMutableArray *schemeDictionaries = [NSMutableArray new];
+ for (NSString *scheme in schemeAppsDictionary.allKeys)
+ {
+ NSArray *appIds = [schemeAppsDictionary objectForKey:scheme];
+ NSDictionary *schemeDictionary = @{@"scheme" : scheme, @"ids" : appIds};
+ [schemeDictionaries addObject:schemeDictionary];
+ }
+
+ __block BOOL successBlockExecuted = FALSE;
+ NSMutableSet *successfulAppIds = [NSMutableSet set];
+ NSOperationQueue *operationQueue = [NSOperationQueue new];
+ NSArray *arrayOfArrays = [self subarraysOfArray:schemeDictionaries
+ withCount:1000];
+ for (NSArray *schemeDictionariesArray in arrayOfArrays)
+ {
+ [operationQueue addOperationWithBlock: ^{
+ NSMutableSet *incrementalAppIds = [NSMutableSet set];
+ for (NSDictionary *schemeDictionary in schemeDictionariesArray)
+ {
+ NSString *scheme = [schemeDictionary objectForKey:@"scheme"];
+ NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@://", scheme]];
+ if([[UIApplication sharedApplication] canOpenURL:url])
+ {
+ NSArray *appIds = [schemeDictionary objectForKey:@"ids"];
+ for (NSString *appId in appIds)
+ {
+ if (![successfulAppIds containsObject:appId])
+ {
+ [successfulAppIds addObject:appId];
+ [incrementalAppIds addObject:appId];
+ }
+ }
+ }
+ }
+ dispatch_sync(dispatch_get_main_queue(), ^{
+ if (incrementalBlock && incrementalAppIds.count)
+ {
+ incrementalBlock(incrementalAppIds.allObjects);
+ }
+ });
+ /* Unhappy with this implementation */
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1f * NSEC_PER_SEC),
+ dispatch_get_main_queue(), ^{
+ if (operationQueue.operationCount == 0 && successBlock && !successBlockExecuted)
+ {
+ successBlockExecuted = TRUE;
+ successBlock(successfulAppIds.allObjects);
+ }
+ });
+ }];
+ }
+ } failure:failureBlock];
+
+ });
+ #if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000
+ dispatch_release(detection_thread);
+ #endif
+}
+
+- (void)detectAppDictionariesWithIncremental:(void (^)(NSArray *appDictionaries))incrementalBlock
+ withSuccess:(void (^)(NSArray *appDictionaries))successBlock
+ withFailure:(void (^)(NSError *error))failureBlock
+{
+ __block BOOL successBlockExecuted = FALSE;
+ __block BOOL appIdDetectionComplete = FALSE;
+ __block NSInteger netAppIncrements = 0;
+ NSMutableArray *successfulAppDictionaries = [NSMutableArray new];
+ [self detectAppIdsWithIncremental:^(NSArray *appIds) {
+ netAppIncrements += 1;
+ [self retrieveAppDictionariesForAppIds:appIds
+ withSuccess:^(NSArray *appDictionaries) {
+ [successfulAppDictionaries addObjectsFromArray:appDictionaries];
+ incrementalBlock(appDictionaries);
+ netAppIncrements -= 1;
+ /* Unhappy with this implementation */
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1f * NSEC_PER_SEC),
+ dispatch_get_main_queue(), ^{
+ if (appIdDetectionComplete &&
+ !netAppIncrements &&
+ successBlock &&
+ !successBlockExecuted)
+ {
+ successBlockExecuted = TRUE;
+ successBlock(successfulAppDictionaries);
+ }
+ });
+ } withFailure:^(NSError *error) {
+ netAppIncrements -= 1;
+ /* Unhappy with this implementation */
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1f * NSEC_PER_SEC),
+ dispatch_get_main_queue(), ^{
+ if (appIdDetectionComplete &&
+ !netAppIncrements &&
+ successBlock &&
+ !successBlockExecuted)
+ {
+ successBlockExecuted = TRUE;
+ successBlock(successfulAppDictionaries);
+ }
+ });
+ }];
+ } withSuccess:^(NSArray *appIds) {
+ appIdDetectionComplete = TRUE;
+ } withFailure:failureBlock];
+}
+
+- (void)retrieveAppDictionariesForAppIds:(NSArray *)appIds
+ withSuccess:(void (^)(NSArray *appDictionaries))successBlock
+ withFailure:(void (^)(NSError *error))failureBlock
+{
+ dispatch_queue_t retrieval_thread = dispatch_queue_create(NULL, NULL);
+ dispatch_async(retrieval_thread, ^{
+
+ NSString *appString = [appIds componentsJoinedByString:@","];
+ NSMutableString *requestUrlString = [NSMutableString new];
+ [requestUrlString appendFormat:@"http://itunes.apple.com/lookup"];
+ [requestUrlString appendFormat:@"?id=%@", appString];
+ [requestUrlString appendFormat:@"&country=%@", self.country];
+
+ NSURLResponse *response;
+ NSError *connectionError;
+ NSMutableURLRequest *request = [NSMutableURLRequest new];
+ [request setURL:[NSURL URLWithString:requestUrlString]];
+ [request setTimeoutInterval:20.0f];
+ [request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
+ NSData *result = [NSURLConnection sendSynchronousRequest:request
+ returningResponse:&response
+ error:&connectionError];
+ if (connectionError)
+ {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (failureBlock)
+ {
+ failureBlock(connectionError);
+ }
+ });
+ }
+ else
+ {
+ NSError *jsonError;
+ NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:result
+ options:0
+ error:&jsonError];
+ if (jsonError)
+ {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (failureBlock)
+ {
+ failureBlock(jsonError);
+ }
+ });
+ }
+ else
+ {
+ NSArray *results = [jsonDictionary objectForKey:@"results"];
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (successBlock)
+ {
+ successBlock(results);
+ }
+ });
+ }
+ }
+ });
+ #if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000
+ dispatch_release(retrieval_thread);
+ #endif
+}
+
+#pragma mark - Internal methods
+
+- (void)retrieveSchemeAppsDictionaryWithSuccess:(void (^)(NSDictionary *schemeAppsDictionary))successBlock
+ failure:(void (^)(NSError *error))failureBlock
+{
+ [self retrieveSchemeAppsDictionaryFromLocalWithSuccess:successBlock
+ failure:^(NSError *error) {
+ [self retrieveSchemeAppsDictionaryFromWebWithSuccess:successBlock
+ failure:failureBlock];
+ }];
+}
+
+- (void)retrieveSchemeAppsDictionaryFromLocalWithSuccess:(void (^)(NSDictionary *schemeAppsDictionary))successBlock
+ failure:(void (^)(NSError *error))failureBlock
+{
+ dispatch_queue_t retrieval_thread = dispatch_queue_create(NULL, NULL);
+ dispatch_async(retrieval_thread, ^{
+
+ NSBundle *selfBundle = [NSBundle bundleForClass:[self class]];
+ NSString *appSchemesDictionaryPath = [selfBundle pathForResource:@"schemeApps"
+ ofType:@"json"];
+
+ NSError *dataError;
+ NSData *schemeAppsData = [NSData dataWithContentsOfFile:appSchemesDictionaryPath
+ options:0
+ error:&dataError];
+ if (dataError)
+ {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (failureBlock)
+ {
+ failureBlock(dataError);
+ }
+ });
+ }
+ else
+ {
+ NSError *jsonError;
+ NSDictionary *schemeAppsDictionary = [NSJSONSerialization JSONObjectWithData:schemeAppsData
+ options:0
+ error:&jsonError];
+ if (jsonError)
+ {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (failureBlock)
+ {
+ failureBlock(jsonError);
+ }
+ });
+ }
+ else
+ {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (successBlock)
+ {
+ successBlock(schemeAppsDictionary);
+ }
+ });
+ }
+ }
+ });
+ #if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000
+ dispatch_release(retrieval_thread);
+ #endif
+}
+
+- (void)retrieveSchemeAppsDictionaryFromWebWithSuccess:(void (^)(NSDictionary *schemeAppsDictionary))successBlock
+ failure:(void (^)(NSError *error))failureBlock
+{
+ dispatch_queue_t retrieval_thread = dispatch_queue_create(NULL, NULL);
+ dispatch_async(retrieval_thread, ^{
+
+ NSURLResponse *response;
+ NSError *connectionError;
+ NSMutableURLRequest *request = [NSMutableURLRequest new];
+ [[NSURLCache sharedURLCache] setMemoryCapacity:1024*1024*2];
+ [request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
+ [request setURL:[NSURL URLWithString:@"https://ihasapp.herokuapp.com/api/schemeApps.json"]];
+ [request setTimeoutInterval:30.0f];
+ NSData *result = [NSURLConnection sendSynchronousRequest:request
+ returningResponse:&response
+ error:&connectionError];
+ if (connectionError)
+ {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (failureBlock)
+ {
+ failureBlock(connectionError);
+ }
+ });
+ }
+ else
+ {
+ NSError *jsonError;
+ NSDictionary *schemeAppsDictionary = [NSJSONSerialization JSONObjectWithData:result
+ options:0
+ error:&jsonError];
+ if (jsonError)
+ {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (failureBlock)
+ {
+ failureBlock(jsonError);
+ }
+ });
+ }
+ else
+ {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (successBlock)
+ {
+ successBlock(schemeAppsDictionary);
+ }
+ });
+ }
+ }
+ });
+ #if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000
+ dispatch_release(retrieval_thread);
+ #endif
+}
+
+
+#pragma mark - Helper methods
+
+- (NSArray *)subarraysOfArray:(NSArray *)array withCount:(NSInteger)subarraySize
+{
+ int j = 0;
+ int itemsRemaining = [array count];
+ NSMutableArray *arrayOfArrays = [NSMutableArray new];
+ while(j < [array count])
+ {
+ NSRange range = NSMakeRange(j, MIN(subarraySize, itemsRemaining));
+ NSArray *subarray = [array subarrayWithRange:range];
+ [arrayOfArrays addObject:subarray];
+ itemsRemaining -= range.length;
+ j += range.length;
+ }
+ return arrayOfArrays;
+}
+
+#pragma mark - Property methods
+
+- (NSString *)country
+{
+ if (!_country)
+ {
+ _country = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode];
+ }
+ return _country;
+}
+
+@end
View
12,186 iHasApp/schemeApps.json
12,186 additions, 0 deletions not shown
View
35 ... Project/iHasAppExample.xcodeproj/project.pbxproj → ...pExample/iHasAppExample.xcodeproj/project.pbxproj
@@ -7,6 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
+ 63BE815216531C4D0082D861 /* iHasApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 63BE815016531C4D0082D861 /* iHasApp.m */; };
+ 63BE81571653615E0082D861 /* schemeApps.json in Resources */ = {isa = PBXBuildFile; fileRef = 63BE81561653615E0082D861 /* schemeApps.json */; };
63FF2FD5163485580054D385 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63FF2FD4163485580054D385 /* UIKit.framework */; };
63FF2FD7163485580054D385 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63FF2FD6163485580054D385 /* Foundation.framework */; };
63FF2FD9163485580054D385 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63FF2FD8163485580054D385 /* CoreGraphics.framework */; };
@@ -18,7 +20,6 @@
63FF2FEB163485590054D385 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 63FF2FEA163485590054D385 /* Default-568h@2x.png */; };
63FF2FEE163485590054D385 /* MasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FF2FED163485590054D385 /* MasterViewController.m */; };
63FF2FF1163485590054D385 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FF2FF0163485590054D385 /* DetailViewController.m */; };
- 63FF3005163486B00054D385 /* iHasApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63FF3004163486B00054D385 /* iHasApp.framework */; };
63FF30181634870B0054D385 /* placeholder-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 63FF30071634870B0054D385 /* placeholder-icon.png */; };
63FF30191634870B0054D385 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FF30091634870B0054D385 /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
63FF301A1634870B0054D385 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FF300D1634870B0054D385 /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
@@ -29,6 +30,9 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
+ 63BE814F16531C4D0082D861 /* iHasApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iHasApp.h; sourceTree = "<group>"; };
+ 63BE815016531C4D0082D861 /* iHasApp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iHasApp.m; sourceTree = "<group>"; };
+ 63BE81561653615E0082D861 /* schemeApps.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = schemeApps.json; sourceTree = "<group>"; };
63FF2FD0163485580054D385 /* iHasAppExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iHasAppExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
63FF2FD4163485580054D385 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
63FF2FD6163485580054D385 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -46,7 +50,6 @@
63FF2FED163485590054D385 /* MasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MasterViewController.m; sourceTree = "<group>"; };
63FF2FEF163485590054D385 /* DetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = "<group>"; };
63FF2FF0163485590054D385 /* DetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = "<group>"; };
- 63FF3004163486B00054D385 /* iHasApp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iHasApp.framework; path = ../iHasApp.framework; sourceTree = "<group>"; };
63FF30071634870B0054D385 /* placeholder-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "placeholder-icon.png"; sourceTree = "<group>"; };
63FF30081634870B0054D385 /* SDImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCache.h; sourceTree = "<group>"; };
63FF30091634870B0054D385 /* SDImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCache.m; sourceTree = "<group>"; };
@@ -74,16 +77,27 @@
63FF2FD5163485580054D385 /* UIKit.framework in Frameworks */,
63FF2FD7163485580054D385 /* Foundation.framework in Frameworks */,
63FF2FD9163485580054D385 /* CoreGraphics.framework in Frameworks */,
- 63FF3005163486B00054D385 /* iHasApp.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ 63BE814E16531C4D0082D861 /* iHasApp */ = {
+ isa = PBXGroup;
+ children = (
+ 63BE814F16531C4D0082D861 /* iHasApp.h */,
+ 63BE815016531C4D0082D861 /* iHasApp.m */,
+ 63BE81561653615E0082D861 /* schemeApps.json */,
+ );
+ name = iHasApp;
+ path = ../iHasApp;
+ sourceTree = "<group>";
+ };
63FF2FC5163485580054D385 = {
isa = PBXGroup;
children = (
+ 63BE814E16531C4D0082D861 /* iHasApp */,
63FF2FDA163485590054D385 /* iHasAppExample */,
63FF2FD3163485580054D385 /* Frameworks */,
63FF2FD1163485580054D385 /* Products */,
@@ -111,7 +125,6 @@
63FF2FDA163485590054D385 /* iHasAppExample */ = {
isa = PBXGroup;
children = (
- 63FF30031634869E0054D385 /* iHasApp */,
63FF30061634870B0054D385 /* SDWebImage */,
63FF2FE3163485590054D385 /* AppDelegate.h */,
63FF2FE4163485590054D385 /* AppDelegate.m */,
@@ -138,15 +151,6 @@
name = "Supporting Files";
sourceTree = "<group>";
};
- 63FF30031634869E0054D385 /* iHasApp */ = {
- isa = PBXGroup;
- children = (
- 63FF3004163486B00054D385 /* iHasApp.framework */,
- );
- name = iHasApp;
- path = ..;
- sourceTree = "<group>";
- };
63FF30061634870B0054D385 /* SDWebImage */ = {
isa = PBXGroup;
children = (
@@ -227,6 +231,7 @@
63FF2FE9163485590054D385 /* Default@2x.png in Resources */,
63FF2FEB163485590054D385 /* Default-568h@2x.png in Resources */,
63FF30181634870B0054D385 /* placeholder-icon.png in Resources */,
+ 63BE81571653615E0082D861 /* schemeApps.json in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -247,6 +252,7 @@
63FF301C1634870B0054D385 /* SDWebImageManager.m in Sources */,
63FF301D1634870B0054D385 /* SDWebImagePrefetcher.m in Sources */,
63FF301E1634870B0054D385 /* UIImageView+WebCache.m in Sources */,
+ 63BE815216531C4D0082D861 /* iHasApp.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -325,6 +331,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "iHasAppExample/iHasAppExample-Prefix.pch";
INFOPLIST_FILE = "iHasAppExample/iHasAppExample-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 5.0;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
@@ -340,6 +347,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "iHasAppExample/iHasAppExample-Prefix.pch";
INFOPLIST_FILE = "iHasAppExample/iHasAppExample-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 5.0;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
@@ -364,6 +372,7 @@
63FF3002163485590054D385 /* Release */,
);
defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
View
0  ...proj/project.xcworkspace/contents.xcworkspacedata → ...proj/project.xcworkspace/contents.xcworkspacedata
File renamed without changes
View
BIN  ...Example.xcodeproj/project.xcworkspace/xcuserdata/danielamitay.xcuserdatad/UserInterfaceState.xcuserstate
Binary file not shown
View
0  ...tay.xcuserdatad/xcschemes/iHasAppExample.xcscheme → ...tay.xcuserdatad/xcschemes/iHasAppExample.xcscheme
File renamed without changes
View
0  ...ay.xcuserdatad/xcschemes/xcschememanagement.plist → ...ay.xcuserdatad/xcschemes/xcschememanagement.plist
File renamed without changes
View
2  Example Project/iHasAppExample/AppDelegate.h → iHasAppExample/iHasAppExample/AppDelegate.h
@@ -3,7 +3,7 @@
// iHasAppExample
//
// Created by Daniel Amitay on 10/21/12.
-// Copyright (c) 2012 Objective-See. All rights reserved.
+// Copyright (c) 2012 Daniel Amitay. All rights reserved.
//
#import <UIKit/UIKit.h>
View
2  Example Project/iHasAppExample/AppDelegate.m → iHasAppExample/iHasAppExample/AppDelegate.m
@@ -3,7 +3,7 @@
// iHasAppExample
//
// Created by Daniel Amitay on 10/21/12.
-// Copyright (c) 2012 Objective-See. All rights reserved.
+// Copyright (c) 2012 Daniel Amitay. All rights reserved.
//
#import "AppDelegate.h"
View
0  Example Project/iHasAppExample/Default-568h@2x.png → iHasAppExample/iHasAppExample/Default-568h@2x.png
File renamed without changes
View
0  Example Project/iHasAppExample/Default.png → iHasAppExample/iHasAppExample/Default.png
File renamed without changes
View
0  Example Project/iHasAppExample/Default@2x.png → iHasAppExample/iHasAppExample/Default@2x.png
File renamed without changes
View
2  ...ple Project/iHasAppExample/DetailViewController.h → iHasAppExample/iHasAppExample/DetailViewController.h
@@ -3,7 +3,7 @@
// iHasAppExample
//
// Created by Daniel Amitay on 10/21/12.
-// Copyright (c) 2012 Objective-See. All rights reserved.
+// Copyright (c) 2012 Daniel Amitay. All rights reserved.
//
#import <UIKit/UIKit.h>
View
7 ...ple Project/iHasAppExample/DetailViewController.m → iHasAppExample/iHasAppExample/DetailViewController.m
@@ -3,7 +3,7 @@
// iHasAppExample
//
// Created by Daniel Amitay on 10/21/12.
-// Copyright (c) 2012 Objective-See. All rights reserved.
+// Copyright (c) 2012 Daniel Amitay. All rights reserved.
//
#import "DetailViewController.h"
@@ -87,11 +87,6 @@ - (void)splitViewController:(UISplitViewController *)splitController willShowVie
#pragma mark - Table View
-- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
-{
- return 1;
-}
-
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if(self.appDictionary)
View
2  ...ple Project/iHasAppExample/MasterViewController.h → iHasAppExample/iHasAppExample/MasterViewController.h
@@ -3,7 +3,7 @@
// iHasAppExample
//
// Created by Daniel Amitay on 10/21/12.
-// Copyright (c) 2012 Objective-See. All rights reserved.
+// Copyright (c) 2012 Daniel Amitay. All rights reserved.
//
#import <UIKit/UIKit.h>
View
11 ...ple Project/iHasAppExample/MasterViewController.m → iHasAppExample/iHasAppExample/MasterViewController.m
@@ -3,7 +3,7 @@
// iHasAppExample
//
// Created by Daniel Amitay on 10/21/12.
-// Copyright (c) 2012 Objective-See. All rights reserved.
+// Copyright (c) 2012 Daniel Amitay. All rights reserved.
//
#import "MasterViewController.h"
@@ -12,7 +12,7 @@
#import "UIImageView+WebCache.h"
-#import <iHasApp/iHasApp.h>
+#import "iHasApp.h"
@interface MasterViewController ()
@@ -41,7 +41,7 @@ - (void)viewDidLoad
action:@selector(detectApps)];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;
- self.detectionObject = [[iHasApp alloc] init];
+ self.detectionObject = [iHasApp new];
[self detectApps];
}
@@ -99,11 +99,6 @@ - (void)detectApps
#pragma mark - Table View
-- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
-{
- return 1;
-}
-
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if(self.detectedApps)
View
0  ... Project/iHasAppExample/SDWebImage/SDImageCache.h → ...pExample/iHasAppExample/SDWebImage/SDImageCache.h
File renamed without changes
View
0  ... Project/iHasAppExample/SDWebImage/SDImageCache.m → ...pExample/iHasAppExample/SDWebImage/SDImageCache.m
File renamed without changes
View
0  .../iHasAppExample/SDWebImage/SDImageCacheDelegate.h → .../iHasAppExample/SDWebImage/SDImageCacheDelegate.h
File renamed without changes
View
0  ...ject/iHasAppExample/SDWebImage/SDWebImageCompat.h → ...mple/iHasAppExample/SDWebImage/SDWebImageCompat.h
File renamed without changes
View
0  ...ect/iHasAppExample/SDWebImage/SDWebImageDecoder.h → ...ple/iHasAppExample/SDWebImage/SDWebImageDecoder.h
File renamed without changes
View
0  ...ect/iHasAppExample/SDWebImage/SDWebImageDecoder.m → ...ple/iHasAppExample/SDWebImage/SDWebImageDecoder.m
File renamed without changes
View
0  .../iHasAppExample/SDWebImage/SDWebImageDownloader.h → .../iHasAppExample/SDWebImage/SDWebImageDownloader.h
File renamed without changes
View
0  .../iHasAppExample/SDWebImage/SDWebImageDownloader.m → .../iHasAppExample/SDWebImage/SDWebImageDownloader.m
File renamed without changes
View
0  ...Example/SDWebImage/SDWebImageDownloaderDelegate.h → ...Example/SDWebImage/SDWebImageDownloaderDelegate.h
File renamed without changes
View
0  ...ect/iHasAppExample/SDWebImage/SDWebImageManager.h → ...ple/iHasAppExample/SDWebImage/SDWebImageManager.h
File renamed without changes
View
0  ...ect/iHasAppExample/SDWebImage/SDWebImageManager.m → ...ple/iHasAppExample/SDWebImage/SDWebImageManager.m
File renamed without changes
View
0  ...AppExample/SDWebImage/SDWebImageManagerDelegate.h → ...AppExample/SDWebImage/SDWebImageManagerDelegate.h
File renamed without changes
View
0  .../iHasAppExample/SDWebImage/SDWebImagePrefetcher.h → .../iHasAppExample/SDWebImage/SDWebImagePrefetcher.h
File renamed without changes
View
0  .../iHasAppExample/SDWebImage/SDWebImagePrefetcher.m → .../iHasAppExample/SDWebImage/SDWebImagePrefetcher.m
File renamed without changes
View
0  .../iHasAppExample/SDWebImage/UIImageView+WebCache.h → .../iHasAppExample/SDWebImage/UIImageView+WebCache.h
File renamed without changes
View
0  .../iHasAppExample/SDWebImage/UIImageView+WebCache.m → .../iHasAppExample/SDWebImage/UIImageView+WebCache.m
File renamed without changes
View
0  ...ct/iHasAppExample/SDWebImage/placeholder-icon.png → ...le/iHasAppExample/SDWebImage/placeholder-icon.png
File renamed without changes
View
0  ...Project/iHasAppExample/en.lproj/InfoPlist.strings → ...Example/iHasAppExample/en.lproj/InfoPlist.strings
File renamed without changes
View
0  ... Project/iHasAppExample/iHasAppExample-Info.plist → ...pExample/iHasAppExample/iHasAppExample-Info.plist
File renamed without changes
View
0  ... Project/iHasAppExample/iHasAppExample-Prefix.pch → ...pExample/iHasAppExample/iHasAppExample-Prefix.pch
File renamed without changes
View
2  Example Project/iHasAppExample/main.m → iHasAppExample/iHasAppExample/main.m
@@ -3,7 +3,7 @@
// iHasAppExample
//
// Created by Daniel Amitay on 10/21/12.
-// Copyright (c) 2012 Objective-See. All rights reserved.
+// Copyright (c) 2012 Daniel Amitay. All rights reserved.
//
#import <UIKit/UIKit.h>
View
BIN  screenshot.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Please sign in to comment.
Something went wrong with that request. Please try again.