├── Example ├── Default.png ├── en.lproj │ └── InfoPlist.strings ├── Default@2x.png ├── Default-568h@2x.png ├── Antenna Example.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── project.pbxproj ├── Prefix.pch ├── Info.plist ├── ViewController.h ├── main.m ├── AppDelegate.h ├── ViewController.m ├── AppDelegate.m └── Base.lproj │ └── ViewController.xib ├── .gitmodules ├── Antenna.xcworkspace └── contents.xcworkspacedata ├── Antenna.podspec ├── LICENSE ├── README.md └── Antenna ├── Antenna.h └── Antenna.m /Example/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattt/Antenna/HEAD/Example/Default.png -------------------------------------------------------------------------------- /Example/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Example/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattt/Antenna/HEAD/Example/Default@2x.png -------------------------------------------------------------------------------- /Example/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattt/Antenna/HEAD/Example/Default-568h@2x.png -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "AFNetworking"] 2 | path = AFNetworking 3 | url = https://github.com/AFNetworking/AFNetworking.git 4 | -------------------------------------------------------------------------------- /Example/Antenna Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Prefix.pch: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #ifndef __IPHONE_4_0 4 | #warning "This project uses features only available in iOS SDK 4.0 and later." 5 | #endif 6 | 7 | #ifdef __OBJC__ 8 | #import 9 | #import 10 | #import 11 | #import 12 | #endif 13 | -------------------------------------------------------------------------------- /Antenna.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 9 | 10 | 12 | 13 | 14 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Antenna.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'Antenna' 3 | s.version = '2.1.0' 4 | s.license = 'MIT' 5 | s.summary = 'Extensible Remote Logging for iOS.' 6 | s.homepage = 'https://github.com/mattt/Antenna' 7 | s.social_media_url = 'https://twitter.com/mattt' 8 | s.authors = { 'Mattt' => 'mattt@me.com' } 9 | s.source = { :git => 'https://github.com/mattt/Antenna.git', :tag => '2.1.0' } 10 | s.source_files = 'Antenna' 11 | s.requires_arc = true 12 | 13 | s.platform = :ios, '6.0' 14 | 15 | s.dependency 'AFNetworking', '~> 2.4' 16 | end 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 – 2020 Mattt (https://mat.tt) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /Example/ViewController.h: -------------------------------------------------------------------------------- 1 | // ViewController.h 2 | // 3 | // Copyright (c) 2013 – 2020 Mattt (https://mat.tt) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #import 24 | 25 | extern NSString * const AntennaExampleNotification; 26 | 27 | @interface ViewController : UIViewController 28 | 29 | - (IBAction)triggerNotification:(id)sender; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Example/main.m: -------------------------------------------------------------------------------- 1 | // main.m 2 | // 3 | // Copyright (c) 2013 – 2020 Mattt (https://mat.tt) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #import 24 | 25 | #import "AppDelegate.h" 26 | 27 | int main(int argc, char *argv[]) { 28 | @autoreleasepool { 29 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Example/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // AppDelegate.h 2 | // 3 | // Copyright (c) 2013 – 2020 Mattt (https://mat.tt) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #import 24 | 25 | @class ViewController; 26 | 27 | @interface AppDelegate : UIResponder 28 | 29 | @property (strong, nonatomic) UIWindow *window; 30 | 31 | @property (strong, nonatomic) ViewController *viewController; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /Example/ViewController.m: -------------------------------------------------------------------------------- 1 | // ViewController.m 2 | // 3 | // Copyright (c) 2013 – 2020 Mattt (https://mat.tt) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #import "ViewController.h" 24 | 25 | NSString * const AntennaExampleNotification = @"AntennaExampleNotification"; 26 | 27 | @implementation ViewController 28 | 29 | #pragma mark - IBAction 30 | 31 | - (IBAction)triggerNotification:(id)__unused sender { 32 | [[NSNotificationCenter defaultCenter] postNotificationName:AntennaExampleNotification object:nil]; 33 | } 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > This library is no longer being maintained. 2 | > You can continue to use Antenna in your projects, 3 | > but we recommend switching to the 4 | > [unified logging system](https://developer.apple.com/documentation/os/logging) 5 | > or another telemetry solution whenever you have the opportunity. 6 | 7 | * * * 8 | 9 | # Antenna 10 | 11 | Visibility into how users interact with your app is invaluable. 12 | This information can go a long way to inform user interaction design, 13 | and improve business conversion rates. 14 | 15 | Antenna provides this crucial level of visibility 16 | in a way that captures majority usage information by default, 17 | but also allows you to tune everything according to your app's particular needs. 18 | 19 | Antenna asynchronously logs notifications to any number of 20 | web services, files, or Core Data entities. 21 | Each logging message comes with global state information, 22 | including a unique identifier for the device, 23 | along with any additional data from the notification itself. 24 | 25 | When paired with [rack-http-logger](https://github.com/mattt/rack-http-logger), 26 | iOS system events can be streamed directly into your web application logs 27 | for integrated analysis. 28 | 29 | ## Usage 30 | 31 | ### AppDelegate.m 32 | 33 | ```objective-c 34 | - (BOOL)application:(UIApplication *)application 35 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 36 | { 37 | [[Antenna sharedLogger] addChannelWithURL:[NSURL URLWithString:@"http://example.com"] method:@"LOG"]; 38 | [[Antenna sharedLogger] startLoggingApplicationLifecycleNotifications]; 39 | [[Antenna sharedLogger] startLoggingNotificationName:AntennaExampleNotification]; 40 | 41 | // ... 42 | } 43 | ``` 44 | 45 | ## Contact 46 | 47 | Mattt ([@mattt](https://twitter.com/mattt)) 48 | 49 | ## License 50 | 51 | Antenna is available under the MIT license. See the LICENSE file for more info. 52 | -------------------------------------------------------------------------------- /Example/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // AppDelegate.m 2 | // 3 | // Copyright (c) 2013 – 2020 Mattt (https://mat.tt) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #import "AppDelegate.h" 24 | 25 | #import "ViewController.h" 26 | 27 | #import "Antenna.h" 28 | 29 | @implementation AppDelegate 30 | 31 | - (BOOL)application:(__unused UIApplication *)application 32 | didFinishLaunchingWithOptions:(__unused NSDictionary *)launchOptions 33 | { 34 | [[Antenna sharedLogger] addChannelWithURL:[NSURL URLWithString:@"http://localhost:5000"] method:@"LOG"]; 35 | [[Antenna sharedLogger] startLoggingApplicationLifecycleNotifications]; 36 | [[Antenna sharedLogger] startLoggingNotificationName:AntennaExampleNotification]; 37 | 38 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 39 | self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 40 | self.window.rootViewController = self.viewController; 41 | [self.window makeKeyAndVisible]; 42 | 43 | return YES; 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /Antenna/Antenna.h: -------------------------------------------------------------------------------- 1 | // Antenna.h 2 | // 3 | // Copyright (c) 2013 – 2020 Mattt (https://mat.tt) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #import 24 | 25 | NS_ASSUME_NONNULL_BEGIN 26 | 27 | @protocol AntennaChannel; 28 | 29 | /** 30 | Antenna objects asynchronously log notifications to subscribed channels, such as web services, files, or Core Data entities. Each logging message comes with global state information, including a unique identifier for the device, along with any additional data from the notification itself. 31 | */ 32 | @interface Antenna : NSObject 33 | 34 | /** 35 | The currently active channels. 36 | */ 37 | @property (readonly, nonatomic, strong) NSArray *channels; 38 | 39 | /** 40 | The default payload to include in each logged message. 41 | */ 42 | @property (readonly, nonatomic, strong) NSMutableDictionary *defaultPayload; 43 | 44 | /** 45 | The notification center on which to observe notifications. 46 | */ 47 | @property (nonatomic, strong) NSNotificationCenter *notificationCenter; 48 | 49 | /** 50 | The operation queoe onto which notifications are posted. 51 | */ 52 | @property (readonly, nonatomic, strong) NSOperationQueue *operationQueue; 53 | 54 | /** 55 | The shared Antenna instance. 56 | */ 57 | + (instancetype)sharedLogger; 58 | 59 | ///====================== 60 | /// @name Adding Channels 61 | ///====================== 62 | 63 | /** 64 | Adds a new channel that logs messages to a file at the specified path. 65 | */ 66 | - (void)addChannelWithFilePath:(NSString *)path; 67 | 68 | /** 69 | Adds a new channel that logs messages to the specified output stream. 70 | */ 71 | - (void)addChannelWithOutputStream:(NSOutputStream *)outputStream; 72 | 73 | /** 74 | Adds a new channel that logs to the specified URL with a given HTTP method. 75 | */ 76 | - (void)addChannelWithURL:(NSURL *)URL 77 | method:(NSString *)method; 78 | 79 | /** 80 | Adds a new channel that logs messages by inserting managed objects of a particular entity into a given managed object context using the specified attributes for the message and timestamp properties. 81 | 82 | @param entity The entity used to model log messages 83 | @param messageAttribute The attribute used to store the log message 84 | @param timestampAttribute The attribute used to store the log timestamp 85 | @param context The managed object context 86 | 87 | @warning Requires that Core Data is linked and imported in the target's precompiled header. 88 | */ 89 | #ifdef _COREDATADEFINES_H 90 | - (void)addChannelWithEntity:(NSEntityDescription *)entity 91 | messageAttribute:(NSAttributeDescription *)messageAttribute 92 | timestampAttribute:(NSAttributeDescription *)timestampAttribute 93 | inManagedObjectContext:(NSManagedObjectContext *)context; 94 | #endif 95 | 96 | /** 97 | Adds the specified channel. 98 | 99 | @param channel The channel to add. 100 | */ 101 | - (void)addChannel:(id )channel; 102 | 103 | /** 104 | Removes the specified channel, if present. 105 | 106 | @param channel The channel to remove. 107 | */ 108 | - (void)removeChannel:(id )channel; 109 | 110 | /** 111 | Removes all channels. 112 | */ 113 | - (void)removeAllChannels; 114 | 115 | ///============== 116 | /// @name Logging 117 | ///============== 118 | 119 | /** 120 | Logs the specified message or payload to each channel. 121 | 122 | @param messageOrPayload An `NSString` or `NSDictionary` object to log. 123 | */ 124 | - (void)log:(id)messageOrPayload; 125 | 126 | ///=========================== 127 | /// @name Notification Logging 128 | ///=========================== 129 | 130 | /** 131 | Start listening for and logging UIApplicationDelegate application lifecycle notifications. 132 | */ 133 | - (void)startLoggingApplicationLifecycleNotifications; 134 | 135 | /** 136 | Start listening for and logging notifications with the specified name. 137 | 138 | @param name The notification name. 139 | */ 140 | - (void)startLoggingNotificationName:(NSString *)name; 141 | 142 | /** 143 | Start listening for and logging notifications with the specified name and object. 144 | 145 | @param name The notification name. 146 | @param object The notification object. 147 | */ 148 | - (void)startLoggingNotificationName:(NSString *)name 149 | object:(_Nullable id)object; 150 | 151 | /** 152 | Start listening for and logging notifications with a name and object, constructing the payload for the log message from the notification using the specified block. 153 | 154 | @param name The notification name. 155 | @param object The notification object. 156 | @param block A block used to construct the payload to log from a given notification. The returns the payload and takes a single argument: the received notification to log. 157 | */ 158 | - (void)startLoggingNotificationName:(NSString *)name 159 | object:(_Nullable id)object 160 | constructingPayLoadFromBlock:(NSDictionary * _Nullable (^)(NSNotification *notification))block; 161 | 162 | /** 163 | Stop listening for and logging all notifications with the specified name. 164 | 165 | @param name The notification name. 166 | */ 167 | - (void)stopLoggingNotificationName:(NSString *)name; 168 | 169 | /** 170 | Stop listening for and logging notifications with the specified name and object. 171 | 172 | @param name The notification name. 173 | @param object The notification object. 174 | */ 175 | - (void)stopLoggingNotificationName:(NSString *)name 176 | object:(_Nullable id)object; 177 | 178 | /** 179 | Stop listening for and logging all notifications. 180 | */ 181 | - (void)stopLoggingAllNotifications; 182 | 183 | @end 184 | 185 | #pragma mark - 186 | 187 | /** 188 | The AntennaChannel protocol defines the required methods for objects that can be added as channels by Antenna. 189 | */ 190 | @protocol AntennaChannel 191 | 192 | @required 193 | 194 | /** 195 | Log the specified payload. 196 | */ 197 | - (void)log:(NSDictionary *)payload; 198 | 199 | @optional 200 | 201 | /** 202 | Called before a channel is removed. 203 | 204 | @warning This method should never be called directly. 205 | */ 206 | - (void)prepareForRemoval; 207 | 208 | @end 209 | 210 | NS_ASSUME_NONNULL_END 211 | -------------------------------------------------------------------------------- /Example/Base.lproj/ViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1552 5 | 12D78 6 | 3084 7 | 1187.37 8 | 626.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 2083 12 | 13 | 14 | IBNSLayoutConstraint 15 | IBProxyObject 16 | IBUIButton 17 | IBUIView 18 | 19 | 20 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 21 | 22 | 23 | PluginDependencyRecalculationVersion 24 | 25 | 26 | 27 | 28 | IBFilesOwner 29 | IBCocoaTouchFramework 30 | 31 | 32 | IBFirstResponder 33 | IBCocoaTouchFramework 34 | 35 | 36 | 37 | 274 38 | 39 | 40 | 41 | 292 42 | {{20, 203}, {280, 44}} 43 | 44 | 45 | _NS:9 46 | NO 47 | IBCocoaTouchFramework 48 | 0 49 | 0 50 | 1 51 | Trigger Notification 52 | 53 | 3 54 | MQA 55 | 56 | 57 | 1 58 | MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 59 | 60 | 61 | 3 62 | MC41AA 63 | 64 | 65 | 2 66 | 15 67 | 68 | 69 | Helvetica-Bold 70 | 15 71 | 16 72 | 73 | 74 | 75 | {{0, 20}, {320, 548}} 76 | 77 | 78 | 79 | 80 | 3 81 | MC43NQA 82 | 83 | 2 84 | 85 | 86 | NO 87 | 88 | 89 | IBUIScreenMetrics 90 | 91 | YES 92 | 93 | 94 | 95 | 96 | 97 | {320, 568} 98 | {568, 320} 99 | 100 | 101 | IBCocoaTouchFramework 102 | Retina 4 Full Screen 103 | 2 104 | 105 | IBCocoaTouchFramework 106 | 107 | 108 | 109 | 110 | 111 | 112 | view 113 | 114 | 115 | 116 | 7 117 | 118 | 119 | 120 | triggerNotification: 121 | 122 | 123 | 7 124 | 125 | 16 126 | 127 | 128 | 129 | 130 | 131 | 0 132 | 133 | 134 | 135 | 136 | 137 | -1 138 | 139 | 140 | File's Owner 141 | 142 | 143 | -2 144 | 145 | 146 | 147 | 148 | 6 149 | 150 | 151 | 152 | 153 | 3 154 | 0 155 | 156 | 3 157 | 1 158 | 159 | 203 160 | 161 | 1000 162 | 163 | 3 164 | 9 165 | 3 166 | 167 | 168 | 169 | 5 170 | 0 171 | 172 | 5 173 | 1 174 | 175 | 20 176 | 177 | 1000 178 | 179 | 8 180 | 29 181 | 3 182 | 183 | 184 | 185 | 6 186 | 0 187 | 188 | 6 189 | 1 190 | 191 | 20 192 | 193 | 1000 194 | 195 | 8 196 | 29 197 | 3 198 | 199 | 200 | 201 | 202 | 203 | 204 | 8 205 | 206 | 207 | 208 | 209 | 210 | 13 211 | 212 | 213 | 214 | 215 | 15 216 | 217 | 218 | 219 | 220 | 19 221 | 222 | 223 | 224 | 225 | 226 | 227 | ViewController 228 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 229 | UIResponder 230 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 231 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 232 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 233 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 234 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 235 | 236 | 237 | 238 | 239 | 240 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 241 | 242 | 243 | 244 | 245 | 246 | 247 | 19 248 | 249 | 250 | 251 | 252 | NSLayoutConstraint 253 | NSObject 254 | 255 | IBProjectSource 256 | ./Classes/NSLayoutConstraint.h 257 | 258 | 259 | 260 | ViewController 261 | UIViewController 262 | 263 | triggerNotification: 264 | id 265 | 266 | 267 | triggerNotification: 268 | 269 | triggerNotification: 270 | id 271 | 272 | 273 | 274 | IBProjectSource 275 | ./Classes/ViewController.h 276 | 277 | 278 | 279 | 280 | 0 281 | IBCocoaTouchFramework 282 | YES 283 | 3 284 | YES 285 | 2083 286 | 287 | 288 | -------------------------------------------------------------------------------- /Antenna/Antenna.m: -------------------------------------------------------------------------------- 1 | // Antenna.m 2 | // 3 | // Copyright (c) 2013 – 2020 Mattt (https://mat.tt) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #import "Antenna.h" 24 | 25 | #import "AFURLRequestSerialization.h" 26 | 27 | #import 28 | 29 | NS_ASSUME_NONNULL_BEGIN 30 | 31 | static NSString * AntennaLogLineFromPayload(NSDictionary *payload) { 32 | NSMutableArray *mutableComponents = [NSMutableArray arrayWithCapacity:[payload count]]; 33 | [payload enumerateKeysAndObjectsUsingBlock:^(id key, id obj, __unused BOOL *stop) { 34 | [mutableComponents addObject:[NSString stringWithFormat:@"\"%@\"=\"%@\"", key, obj]]; 35 | }]; 36 | 37 | return [mutableComponents componentsJoinedByString:@" "]; 38 | } 39 | 40 | @interface AntennaStreamChannel : NSObject 41 | - (id)initWithOutputStream:(NSOutputStream *)outputStream; 42 | @end 43 | 44 | @interface AntennaHTTPChannel : NSObject 45 | - (id)initWithURL:(NSURL *)url 46 | method:(NSString *)method 47 | requestSerializer:(AFHTTPRequestSerializer *)requestSerializer; 48 | @end 49 | 50 | #ifdef _COREDATADEFINES_H 51 | @interface AntennaCoreDataChannel : NSObject 52 | - (id)initWithEntity:(NSEntityDescription *)entity 53 | messageAttribute:(NSAttributeDescription *)messageAttribute 54 | timestampAttribute:(NSAttributeDescription *)timestampAttribute 55 | inManagedObjectContext:(NSManagedObjectContext *)context; 56 | @end 57 | #endif 58 | 59 | #pragma mark - 60 | 61 | @interface Antenna () 62 | @property (readwrite, nonatomic, strong) NSArray *channels; 63 | @property (readwrite, nonatomic, strong) NSMutableDictionary *defaultPayload; 64 | @property (readwrite, nonatomic, strong) NSOperationQueue *operationQueue; 65 | @end 66 | 67 | @implementation Antenna 68 | 69 | + (instancetype)sharedLogger { 70 | static id _sharedAntenna = nil; 71 | static dispatch_once_t onceToken; 72 | dispatch_once(&onceToken, ^{ 73 | _sharedAntenna = [[self alloc] init]; 74 | }); 75 | 76 | return _sharedAntenna; 77 | } 78 | 79 | - (id)init { 80 | self = [super init]; 81 | if (!self) { 82 | return nil; 83 | } 84 | 85 | self.channels = [NSArray array]; 86 | 87 | self.defaultPayload = [NSMutableDictionary dictionary]; 88 | 89 | if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { 90 | [self.defaultPayload setValue:[[[UIDevice currentDevice] identifierForVendor] UUIDString] forKey:@"uuid"]; 91 | } 92 | [self.defaultPayload setValue:[[NSLocale currentLocale] localeIdentifier] forKey:@"locale"]; 93 | 94 | self.notificationCenter = [NSNotificationCenter defaultCenter]; 95 | self.operationQueue = [[NSOperationQueue alloc] init]; 96 | 97 | return self; 98 | } 99 | 100 | #pragma mark - 101 | 102 | - (void)addChannelWithFilePath:(NSString *)path { 103 | [self addChannelWithOutputStream:[NSOutputStream outputStreamToFileAtPath:path append:YES]]; 104 | } 105 | 106 | - (void)addChannelWithOutputStream:(NSOutputStream *)outputStream { 107 | AntennaStreamChannel *channel = [[AntennaStreamChannel alloc] initWithOutputStream:outputStream]; 108 | [self addChannel:channel]; 109 | } 110 | 111 | - (void)addChannelWithURL:(NSURL *)URL 112 | method:(NSString *)method 113 | { 114 | AntennaHTTPChannel *channel = [[AntennaHTTPChannel alloc] initWithURL:URL method:method requestSerializer:[AFHTTPRequestSerializer serializer]]; 115 | [self addChannel:channel]; 116 | } 117 | 118 | #ifdef _COREDATADEFINES_H 119 | - (void)addChannelWithEntity:(NSEntityDescription *)entity 120 | messageAttribute:(NSAttributeDescription *)messageAttribute 121 | timestampAttribute:(NSAttributeDescription *)timestampAttribute 122 | inManagedObjectContext:(NSManagedObjectContext *)context 123 | { 124 | AntennaCoreDataChannel *channel = [[AntennaCoreDataChannel alloc] initWithEntity:entity messageAttribute:messageAttribute timestampAttribute:timestampAttribute inManagedObjectContext:context]; 125 | [self addChannel:channel]; 126 | } 127 | #endif 128 | 129 | - (void)addChannel:(id )channel { 130 | self.channels = [self.channels arrayByAddingObject:channel]; 131 | } 132 | 133 | - (void)removeChannel:(id )channel { 134 | NSMutableArray *mutableChannels = [NSMutableArray arrayWithArray:self.channels]; 135 | if ([channel respondsToSelector:@selector(prepareForRemoval)]) { 136 | [channel prepareForRemoval]; 137 | } 138 | [mutableChannels removeObject:channel]; 139 | self.channels = [NSArray arrayWithArray:mutableChannels]; 140 | } 141 | 142 | - (void)removeAllChannels { 143 | [self.channels enumerateObjectsUsingBlock:^(id channel, __unused NSUInteger idx, __unused BOOL *stop) { 144 | if ([channel respondsToSelector:@selector(prepareForRemoval)]) { 145 | [channel prepareForRemoval]; 146 | } 147 | }]; 148 | 149 | self.channels = [NSArray array]; 150 | } 151 | 152 | #pragma mark - 153 | 154 | - (void)log:(id)messageOrPayload { 155 | NSMutableDictionary *mutablePayload = nil; 156 | if ([messageOrPayload isKindOfClass:[NSDictionary class]]) { 157 | mutablePayload = [messageOrPayload mutableCopy]; 158 | } else if (messageOrPayload) { 159 | mutablePayload = [NSMutableDictionary dictionaryWithObject:messageOrPayload forKey:@"message"]; 160 | } 161 | 162 | [self.defaultPayload enumerateKeysAndObjectsUsingBlock:^(id key, id obj, __unused BOOL *stop) { 163 | if (obj && ![mutablePayload valueForKey:key]) { 164 | [mutablePayload setObject:obj forKey:key]; 165 | } 166 | }]; 167 | 168 | [self.channels enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id channel, __unused NSUInteger idx, __unused BOOL *stop) { 169 | #pragma clang diagnostic push 170 | #pragma clang diagnostic ignored "-Wstrict-selector-match" 171 | [channel log:mutablePayload]; 172 | #pragma clang diagnostic pop 173 | }]; 174 | } 175 | 176 | - (void)prepareForRemoval { 177 | [self stopLoggingAllNotifications]; 178 | } 179 | 180 | #pragma mark - 181 | 182 | - (void)startLoggingApplicationLifecycleNotifications { 183 | NSArray *names = [NSArray arrayWithObjects:UIApplicationDidFinishLaunchingNotification, UIApplicationDidEnterBackgroundNotification, UIApplicationDidBecomeActiveNotification, UIApplicationDidReceiveMemoryWarningNotification, nil]; 184 | for (NSString *name in names) { 185 | [self startLoggingNotificationName:name]; 186 | } 187 | } 188 | 189 | - (void)startLoggingNotificationName:(NSString *)name { 190 | [self startLoggingNotificationName:name object:nil]; 191 | } 192 | 193 | - (void)startLoggingNotificationName:(NSString *)name 194 | object:(_Nullable id)object 195 | { 196 | __weak __typeof(self)weakSelf = self; 197 | [self startLoggingNotificationName:name object:object constructingPayLoadFromBlock:^NSDictionary *(NSNotification *notification) { 198 | __strong __typeof(weakSelf)strongSelf = weakSelf; 199 | 200 | NSMutableDictionary *mutablePayload = [strongSelf.defaultPayload mutableCopy]; 201 | if (notification.userInfo) { 202 | [notification.userInfo enumerateKeysAndObjectsUsingBlock:^(id key, id obj, __unused BOOL *stop) { 203 | if (obj && key) { 204 | [mutablePayload setObject:obj forKey:key]; 205 | } 206 | }]; 207 | } 208 | [mutablePayload setObject:name forKey:@"notification"]; 209 | 210 | return mutablePayload; 211 | }]; 212 | } 213 | 214 | - (void)startLoggingNotificationName:(NSString *)name 215 | object:(_Nullable id)object 216 | constructingPayLoadFromBlock:(NSDictionary * _Nullable (^)(NSNotification *notification))block 217 | { 218 | __weak __typeof(self)weakSelf = self; 219 | [self.notificationCenter addObserverForName:name object:object queue:self.operationQueue usingBlock:^(NSNotification *notification) { 220 | __strong __typeof(weakSelf)strongSelf = weakSelf; 221 | NSDictionary *payload = nil; 222 | if (block) { 223 | payload = block(notification); 224 | } 225 | 226 | [strongSelf log:payload]; 227 | }]; 228 | } 229 | 230 | - (void)stopLoggingNotificationName:(NSString *)name { 231 | [self.notificationCenter removeObserver:self name:name object:nil]; 232 | } 233 | 234 | - (void)stopLoggingNotificationName:(NSString *)name 235 | object:(_Nullable id)object 236 | { 237 | [self.notificationCenter removeObserver:self name:name object:object]; 238 | } 239 | 240 | - (void)stopLoggingAllNotifications { 241 | [self.notificationCenter removeObserver:self]; 242 | } 243 | 244 | @end 245 | 246 | #pragma mark - 247 | 248 | @interface AntennaStreamChannel () 249 | @property (readwrite, nonatomic, strong) NSOutputStream *outputStream; 250 | @end 251 | 252 | @implementation AntennaStreamChannel 253 | 254 | - (id)initWithOutputStream:(NSOutputStream *)outputStream { 255 | self = [super init]; 256 | if (!self) { 257 | return nil; 258 | } 259 | 260 | self.outputStream = outputStream; 261 | [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 262 | [self.outputStream open]; 263 | 264 | return self; 265 | } 266 | 267 | #pragma mark - AntennaChannel 268 | 269 | - (void)log:(NSDictionary *)payload { 270 | NSData *data = [AntennaLogLineFromPayload(payload) dataUsingEncoding:NSUTF8StringEncoding]; 271 | [self.outputStream write:[data bytes] maxLength:[data length]]; 272 | } 273 | 274 | - (void)prepareForRemoval { 275 | [self.outputStream close]; 276 | } 277 | 278 | @end 279 | 280 | #pragma mark - 281 | 282 | @interface AntennaHTTPChannel () 283 | @property (readwrite, nonatomic, strong) NSURL *URL; 284 | @property (readwrite, nonatomic, copy) NSString *method; 285 | @property (readwrite, nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; 286 | @property (readwrite, nonatomic, strong) NSOperationQueue *operationQueue; 287 | @end 288 | 289 | @implementation AntennaHTTPChannel 290 | 291 | - (id)initWithURL:(NSURL *)url 292 | method:(NSString *)method 293 | requestSerializer:(AFHTTPRequestSerializer *)requestSerializer 294 | { 295 | self = [super init]; 296 | if (!self) { 297 | return nil; 298 | } 299 | 300 | self.method = method; 301 | self.URL = url; 302 | self.operationQueue = [[NSOperationQueue alloc] init]; 303 | self.requestSerializer = requestSerializer; 304 | 305 | return self; 306 | } 307 | 308 | #pragma mark - AntennaChannel 309 | 310 | - (void)log:(NSDictionary *)payload { 311 | NSURLRequest *request = [self.requestSerializer requestWithMethod:self.method URLString:[self.URL absoluteString] parameters:payload error:nil]; 312 | [[[NSURLSession sharedSession] dataTaskWithRequest:request] resume]; 313 | } 314 | 315 | @end 316 | 317 | #ifdef _COREDATADEFINES_H 318 | @interface AntennaCoreDataChannel () 319 | @property (readwrite, nonatomic, strong) NSEntityDescription *entity; 320 | @property (readwrite, nonatomic, strong) NSManagedObjectContext *context; 321 | @property (readwrite, nonatomic, strong) NSAttributeDescription *messageAttribute; 322 | @property (readwrite, nonatomic, strong) NSAttributeDescription *timestampAttribute; 323 | @end 324 | 325 | @implementation AntennaCoreDataChannel 326 | 327 | - (id)initWithEntity:(NSEntityDescription *)entity 328 | messageAttribute:(NSAttributeDescription *)messageAttribute 329 | timestampAttribute:(NSAttributeDescription *)timestampAttribute 330 | inManagedObjectContext:(NSManagedObjectContext *)context 331 | { 332 | self = [super init]; 333 | if (!self) { 334 | return nil; 335 | } 336 | 337 | self.entity = entity; 338 | self.context = context; 339 | self.messageAttribute = messageAttribute; 340 | self.timestampAttribute = timestampAttribute; 341 | 342 | return self; 343 | } 344 | 345 | #pragma mark - AntennaChannel 346 | 347 | - (void)log:(NSDictionary *)payload { 348 | [self.context performBlock:^{ 349 | NSManagedObject *entry = [NSEntityDescription insertNewObjectForEntityForName:self.entity.name inManagedObjectContext:self.context]; 350 | [entry setValue:AntennaLogLineFromPayload(payload) forKey:self.messageAttribute.name]; 351 | [entry setValue:[NSDate date] forKey:self.timestampAttribute.name]; 352 | 353 | NSError *error = nil; 354 | if (![self.context save:&error]) { 355 | NSLog(@"Logging Error: %@", error); 356 | } 357 | }]; 358 | } 359 | 360 | @end 361 | 362 | #endif 363 | 364 | NS_ASSUME_NONNULL_END 365 | -------------------------------------------------------------------------------- /Example/Antenna Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | F83F36DA172863E000FB13E3 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F83F36D9172863E000FB13E3 /* CoreData.framework */; }; 11 | F85D33D817429D6E00B446F5 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F85D33D717429D6E00B446F5 /* SystemConfiguration.framework */; }; 12 | F8B5ECBB16CA75EB00CB3328 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8B5ECBA16CA75EB00CB3328 /* UIKit.framework */; }; 13 | F8B5ECBD16CA75EB00CB3328 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8B5ECBC16CA75EB00CB3328 /* Foundation.framework */; }; 14 | F8B5ECBF16CA75EB00CB3328 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8B5ECBE16CA75EB00CB3328 /* CoreGraphics.framework */; }; 15 | F8B5ECC516CA75EB00CB3328 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F8B5ECC316CA75EB00CB3328 /* InfoPlist.strings */; }; 16 | F8B5ECCD16CA75EB00CB3328 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = F8B5ECCC16CA75EB00CB3328 /* Default.png */; }; 17 | F8B5ECCF16CA75EB00CB3328 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F8B5ECCE16CA75EB00CB3328 /* Default@2x.png */; }; 18 | F8B5ECD116CA75EB00CB3328 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F8B5ECD016CA75EB00CB3328 /* Default-568h@2x.png */; }; 19 | F8B5ECD716CA75EB00CB3328 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F8B5ECD516CA75EB00CB3328 /* ViewController.xib */; }; 20 | F8B5ECDD16CA766E00CB3328 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F8B5ECCA16CA75EB00CB3328 /* AppDelegate.m */; }; 21 | F8B5ECDE16CA766F00CB3328 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F8B5ECC616CA75EB00CB3328 /* main.m */; }; 22 | F8B5ECDF16CA767100CB3328 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F8B5ECD316CA75EB00CB3328 /* ViewController.m */; }; 23 | F8B5ECE216CA76B800CB3328 /* Antenna.m in Sources */ = {isa = PBXBuildFile; fileRef = F8B5ECE116CA76B800CB3328 /* Antenna.m */; }; 24 | F8C09A9D245B32CA004B29B1 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8C09A9C245B32CA004B29B1 /* CoreServices.framework */; }; 25 | F8FAF8F8186118470028D799 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAF8E6186118470028D799 /* AFHTTPRequestOperation.m */; }; 26 | F8FAF8F9186118470028D799 /* AFHTTPRequestOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAF8E8186118470028D799 /* AFHTTPRequestOperationManager.m */; }; 27 | F8FAF8FA186118470028D799 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAF8EA186118470028D799 /* AFHTTPSessionManager.m */; }; 28 | F8FAF8FB186118470028D799 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAF8ED186118470028D799 /* AFNetworkReachabilityManager.m */; }; 29 | F8FAF8FC186118470028D799 /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAF8EF186118470028D799 /* AFSecurityPolicy.m */; }; 30 | F8FAF8FD186118470028D799 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAF8F1186118470028D799 /* AFURLConnectionOperation.m */; }; 31 | F8FAF8FE186118470028D799 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAF8F3186118470028D799 /* AFURLRequestSerialization.m */; }; 32 | F8FAF8FF186118470028D799 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAF8F5186118470028D799 /* AFURLResponseSerialization.m */; }; 33 | F8FAF900186118470028D799 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAF8F7186118470028D799 /* AFURLSessionManager.m */; }; 34 | F8FAF902186118580028D799 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8FAF901186118580028D799 /* Security.framework */; }; 35 | /* End PBXBuildFile section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | F83F36D9172863E000FB13E3 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 39 | F85D33D517429D6900B446F5 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; 40 | F85D33D717429D6E00B446F5 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; 41 | F8B5ECB716CA75EB00CB3328 /* Antenna.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Antenna.app; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | F8B5ECBA16CA75EB00CB3328 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 43 | F8B5ECBC16CA75EB00CB3328 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 44 | F8B5ECBE16CA75EB00CB3328 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 45 | F8B5ECC216CA75EB00CB3328 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 46 | F8B5ECC416CA75EB00CB3328 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 47 | F8B5ECC616CA75EB00CB3328 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 48 | F8B5ECC816CA75EB00CB3328 /* Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; 49 | F8B5ECC916CA75EB00CB3328 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 50 | F8B5ECCA16CA75EB00CB3328 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 51 | F8B5ECCC16CA75EB00CB3328 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 52 | F8B5ECCE16CA75EB00CB3328 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 53 | F8B5ECD016CA75EB00CB3328 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 54 | F8B5ECD216CA75EB00CB3328 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 55 | F8B5ECD316CA75EB00CB3328 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 56 | F8B5ECE016CA76B800CB3328 /* Antenna.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Antenna.h; path = ../Antenna/Antenna.h; sourceTree = ""; }; 57 | F8B5ECE116CA76B800CB3328 /* Antenna.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Antenna.m; path = ../Antenna/Antenna.m; sourceTree = ""; }; 58 | F8C09A9B245B3299004B29B1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ViewController.xib; sourceTree = ""; }; 59 | F8C09A9C245B32CA004B29B1 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; 60 | F8FAF8E5186118470028D799 /* AFHTTPRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPRequestOperation.h; sourceTree = ""; }; 61 | F8FAF8E6186118470028D799 /* AFHTTPRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPRequestOperation.m; sourceTree = ""; }; 62 | F8FAF8E7186118470028D799 /* AFHTTPRequestOperationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPRequestOperationManager.h; sourceTree = ""; }; 63 | F8FAF8E8186118470028D799 /* AFHTTPRequestOperationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPRequestOperationManager.m; sourceTree = ""; }; 64 | F8FAF8E9186118470028D799 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPSessionManager.h; sourceTree = ""; }; 65 | F8FAF8EA186118470028D799 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPSessionManager.m; sourceTree = ""; }; 66 | F8FAF8EB186118470028D799 /* AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworking.h; sourceTree = ""; }; 67 | F8FAF8EC186118470028D799 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworkReachabilityManager.h; sourceTree = ""; }; 68 | F8FAF8ED186118470028D799 /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFNetworkReachabilityManager.m; sourceTree = ""; }; 69 | F8FAF8EE186118470028D799 /* AFSecurityPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFSecurityPolicy.h; sourceTree = ""; }; 70 | F8FAF8EF186118470028D799 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFSecurityPolicy.m; sourceTree = ""; }; 71 | F8FAF8F0186118470028D799 /* AFURLConnectionOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLConnectionOperation.h; sourceTree = ""; }; 72 | F8FAF8F1186118470028D799 /* AFURLConnectionOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLConnectionOperation.m; sourceTree = ""; }; 73 | F8FAF8F2186118470028D799 /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLRequestSerialization.h; sourceTree = ""; }; 74 | F8FAF8F3186118470028D799 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLRequestSerialization.m; sourceTree = ""; }; 75 | F8FAF8F4186118470028D799 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLResponseSerialization.h; sourceTree = ""; }; 76 | F8FAF8F5186118470028D799 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLResponseSerialization.m; sourceTree = ""; }; 77 | F8FAF8F6186118470028D799 /* AFURLSessionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLSessionManager.h; sourceTree = ""; }; 78 | F8FAF8F7186118470028D799 /* AFURLSessionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLSessionManager.m; sourceTree = ""; }; 79 | F8FAF901186118580028D799 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 80 | /* End PBXFileReference section */ 81 | 82 | /* Begin PBXFrameworksBuildPhase section */ 83 | F8B5ECB416CA75EB00CB3328 /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | F8FAF902186118580028D799 /* Security.framework in Frameworks */, 88 | F85D33D817429D6E00B446F5 /* SystemConfiguration.framework in Frameworks */, 89 | F83F36DA172863E000FB13E3 /* CoreData.framework in Frameworks */, 90 | F8B5ECBB16CA75EB00CB3328 /* UIKit.framework in Frameworks */, 91 | F8B5ECBD16CA75EB00CB3328 /* Foundation.framework in Frameworks */, 92 | F8C09A9D245B32CA004B29B1 /* CoreServices.framework in Frameworks */, 93 | F8B5ECBF16CA75EB00CB3328 /* CoreGraphics.framework in Frameworks */, 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | /* End PBXFrameworksBuildPhase section */ 98 | 99 | /* Begin PBXGroup section */ 100 | F8B5ECAE16CA75EB00CB3328 = { 101 | isa = PBXGroup; 102 | children = ( 103 | F8B5ECC016CA75EB00CB3328 /* Antenna */, 104 | F8B5ECB916CA75EB00CB3328 /* Frameworks */, 105 | F8B5ECB816CA75EB00CB3328 /* Products */, 106 | F8B5ECE316CA76D600CB3328 /* Vendor */, 107 | ); 108 | sourceTree = ""; 109 | }; 110 | F8B5ECB816CA75EB00CB3328 /* Products */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | F8B5ECB716CA75EB00CB3328 /* Antenna.app */, 114 | ); 115 | name = Products; 116 | sourceTree = ""; 117 | }; 118 | F8B5ECB916CA75EB00CB3328 /* Frameworks */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | F8C09A9C245B32CA004B29B1 /* CoreServices.framework */, 122 | F8FAF901186118580028D799 /* Security.framework */, 123 | F85D33D717429D6E00B446F5 /* SystemConfiguration.framework */, 124 | F85D33D517429D6900B446F5 /* MobileCoreServices.framework */, 125 | F83F36D9172863E000FB13E3 /* CoreData.framework */, 126 | F8B5ECBA16CA75EB00CB3328 /* UIKit.framework */, 127 | F8B5ECBC16CA75EB00CB3328 /* Foundation.framework */, 128 | F8B5ECBE16CA75EB00CB3328 /* CoreGraphics.framework */, 129 | ); 130 | name = Frameworks; 131 | sourceTree = ""; 132 | }; 133 | F8B5ECC016CA75EB00CB3328 /* Antenna */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | F8B5ECC916CA75EB00CB3328 /* AppDelegate.h */, 137 | F8B5ECCA16CA75EB00CB3328 /* AppDelegate.m */, 138 | F8B5ECD216CA75EB00CB3328 /* ViewController.h */, 139 | F8B5ECD316CA75EB00CB3328 /* ViewController.m */, 140 | F8B5ECD516CA75EB00CB3328 /* ViewController.xib */, 141 | F8B5ECC116CA75EB00CB3328 /* Supporting Files */, 142 | ); 143 | name = Antenna; 144 | sourceTree = ""; 145 | }; 146 | F8B5ECC116CA75EB00CB3328 /* Supporting Files */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | F8B5ECC216CA75EB00CB3328 /* Info.plist */, 150 | F8B5ECC316CA75EB00CB3328 /* InfoPlist.strings */, 151 | F8B5ECC616CA75EB00CB3328 /* main.m */, 152 | F8B5ECC816CA75EB00CB3328 /* Prefix.pch */, 153 | F8B5ECCC16CA75EB00CB3328 /* Default.png */, 154 | F8B5ECCE16CA75EB00CB3328 /* Default@2x.png */, 155 | F8B5ECD016CA75EB00CB3328 /* Default-568h@2x.png */, 156 | ); 157 | name = "Supporting Files"; 158 | sourceTree = ""; 159 | }; 160 | F8B5ECE316CA76D600CB3328 /* Vendor */ = { 161 | isa = PBXGroup; 162 | children = ( 163 | F8FAF8E4186118470028D799 /* AFNetworking */, 164 | F8B5ECE416CA76E400CB3328 /* Antenna */, 165 | ); 166 | name = Vendor; 167 | sourceTree = ""; 168 | }; 169 | F8B5ECE416CA76E400CB3328 /* Antenna */ = { 170 | isa = PBXGroup; 171 | children = ( 172 | F8B5ECE016CA76B800CB3328 /* Antenna.h */, 173 | F8B5ECE116CA76B800CB3328 /* Antenna.m */, 174 | ); 175 | name = Antenna; 176 | sourceTree = ""; 177 | }; 178 | F8FAF8E4186118470028D799 /* AFNetworking */ = { 179 | isa = PBXGroup; 180 | children = ( 181 | F8FAF8E5186118470028D799 /* AFHTTPRequestOperation.h */, 182 | F8FAF8E6186118470028D799 /* AFHTTPRequestOperation.m */, 183 | F8FAF8E7186118470028D799 /* AFHTTPRequestOperationManager.h */, 184 | F8FAF8E8186118470028D799 /* AFHTTPRequestOperationManager.m */, 185 | F8FAF8E9186118470028D799 /* AFHTTPSessionManager.h */, 186 | F8FAF8EA186118470028D799 /* AFHTTPSessionManager.m */, 187 | F8FAF8EB186118470028D799 /* AFNetworking.h */, 188 | F8FAF8EC186118470028D799 /* AFNetworkReachabilityManager.h */, 189 | F8FAF8ED186118470028D799 /* AFNetworkReachabilityManager.m */, 190 | F8FAF8EE186118470028D799 /* AFSecurityPolicy.h */, 191 | F8FAF8EF186118470028D799 /* AFSecurityPolicy.m */, 192 | F8FAF8F0186118470028D799 /* AFURLConnectionOperation.h */, 193 | F8FAF8F1186118470028D799 /* AFURLConnectionOperation.m */, 194 | F8FAF8F2186118470028D799 /* AFURLRequestSerialization.h */, 195 | F8FAF8F3186118470028D799 /* AFURLRequestSerialization.m */, 196 | F8FAF8F4186118470028D799 /* AFURLResponseSerialization.h */, 197 | F8FAF8F5186118470028D799 /* AFURLResponseSerialization.m */, 198 | F8FAF8F6186118470028D799 /* AFURLSessionManager.h */, 199 | F8FAF8F7186118470028D799 /* AFURLSessionManager.m */, 200 | ); 201 | name = AFNetworking; 202 | path = ../AFNetworking/AFNetworking; 203 | sourceTree = ""; 204 | }; 205 | /* End PBXGroup section */ 206 | 207 | /* Begin PBXNativeTarget section */ 208 | F8B5ECB616CA75EB00CB3328 /* Antenna */ = { 209 | isa = PBXNativeTarget; 210 | buildConfigurationList = F8B5ECDA16CA75EB00CB3328 /* Build configuration list for PBXNativeTarget "Antenna" */; 211 | buildPhases = ( 212 | F8B5ECB316CA75EB00CB3328 /* Sources */, 213 | F8B5ECB416CA75EB00CB3328 /* Frameworks */, 214 | F8B5ECB516CA75EB00CB3328 /* Resources */, 215 | ); 216 | buildRules = ( 217 | ); 218 | dependencies = ( 219 | ); 220 | name = Antenna; 221 | productName = Antenna; 222 | productReference = F8B5ECB716CA75EB00CB3328 /* Antenna.app */; 223 | productType = "com.apple.product-type.application"; 224 | }; 225 | /* End PBXNativeTarget section */ 226 | 227 | /* Begin PBXProject section */ 228 | F8B5ECAF16CA75EB00CB3328 /* Project object */ = { 229 | isa = PBXProject; 230 | attributes = { 231 | LastUpgradeCheck = 1140; 232 | ORGANIZATIONNAME = "Mattt Thompson"; 233 | }; 234 | buildConfigurationList = F8B5ECB216CA75EB00CB3328 /* Build configuration list for PBXProject "Antenna Example" */; 235 | compatibilityVersion = "Xcode 3.2"; 236 | developmentRegion = en; 237 | hasScannedForEncodings = 0; 238 | knownRegions = ( 239 | en, 240 | Base, 241 | ); 242 | mainGroup = F8B5ECAE16CA75EB00CB3328; 243 | productRefGroup = F8B5ECB816CA75EB00CB3328 /* Products */; 244 | projectDirPath = ""; 245 | projectRoot = ""; 246 | targets = ( 247 | F8B5ECB616CA75EB00CB3328 /* Antenna */, 248 | ); 249 | }; 250 | /* End PBXProject section */ 251 | 252 | /* Begin PBXResourcesBuildPhase section */ 253 | F8B5ECB516CA75EB00CB3328 /* Resources */ = { 254 | isa = PBXResourcesBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | F8B5ECC516CA75EB00CB3328 /* InfoPlist.strings in Resources */, 258 | F8B5ECCD16CA75EB00CB3328 /* Default.png in Resources */, 259 | F8B5ECCF16CA75EB00CB3328 /* Default@2x.png in Resources */, 260 | F8B5ECD116CA75EB00CB3328 /* Default-568h@2x.png in Resources */, 261 | F8B5ECD716CA75EB00CB3328 /* ViewController.xib in Resources */, 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | }; 265 | /* End PBXResourcesBuildPhase section */ 266 | 267 | /* Begin PBXSourcesBuildPhase section */ 268 | F8B5ECB316CA75EB00CB3328 /* Sources */ = { 269 | isa = PBXSourcesBuildPhase; 270 | buildActionMask = 2147483647; 271 | files = ( 272 | F8B5ECDE16CA766F00CB3328 /* main.m in Sources */, 273 | F8FAF8FC186118470028D799 /* AFSecurityPolicy.m in Sources */, 274 | F8B5ECDD16CA766E00CB3328 /* AppDelegate.m in Sources */, 275 | F8FAF8F9186118470028D799 /* AFHTTPRequestOperationManager.m in Sources */, 276 | F8FAF8FD186118470028D799 /* AFURLConnectionOperation.m in Sources */, 277 | F8FAF8F8186118470028D799 /* AFHTTPRequestOperation.m in Sources */, 278 | F8B5ECDF16CA767100CB3328 /* ViewController.m in Sources */, 279 | F8FAF8FE186118470028D799 /* AFURLRequestSerialization.m in Sources */, 280 | F8FAF8FA186118470028D799 /* AFHTTPSessionManager.m in Sources */, 281 | F8FAF8FB186118470028D799 /* AFNetworkReachabilityManager.m in Sources */, 282 | F8FAF8FF186118470028D799 /* AFURLResponseSerialization.m in Sources */, 283 | F8FAF900186118470028D799 /* AFURLSessionManager.m in Sources */, 284 | F8B5ECE216CA76B800CB3328 /* Antenna.m in Sources */, 285 | ); 286 | runOnlyForDeploymentPostprocessing = 0; 287 | }; 288 | /* End PBXSourcesBuildPhase section */ 289 | 290 | /* Begin PBXVariantGroup section */ 291 | F8B5ECC316CA75EB00CB3328 /* InfoPlist.strings */ = { 292 | isa = PBXVariantGroup; 293 | children = ( 294 | F8B5ECC416CA75EB00CB3328 /* en */, 295 | ); 296 | name = InfoPlist.strings; 297 | sourceTree = ""; 298 | }; 299 | F8B5ECD516CA75EB00CB3328 /* ViewController.xib */ = { 300 | isa = PBXVariantGroup; 301 | children = ( 302 | F8C09A9B245B3299004B29B1 /* Base */, 303 | ); 304 | name = ViewController.xib; 305 | sourceTree = ""; 306 | }; 307 | /* End PBXVariantGroup section */ 308 | 309 | /* Begin XCBuildConfiguration section */ 310 | F8B5ECD816CA75EB00CB3328 /* Debug */ = { 311 | isa = XCBuildConfiguration; 312 | buildSettings = { 313 | ALWAYS_SEARCH_USER_PATHS = NO; 314 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 315 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 316 | CLANG_CXX_LIBRARY = "libc++"; 317 | CLANG_ENABLE_OBJC_ARC = YES; 318 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 319 | CLANG_WARN_BOOL_CONVERSION = YES; 320 | CLANG_WARN_COMMA = YES; 321 | CLANG_WARN_CONSTANT_CONVERSION = YES; 322 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 323 | CLANG_WARN_EMPTY_BODY = YES; 324 | CLANG_WARN_ENUM_CONVERSION = YES; 325 | CLANG_WARN_INFINITE_RECURSION = YES; 326 | CLANG_WARN_INT_CONVERSION = YES; 327 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 328 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 329 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 330 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 331 | CLANG_WARN_STRICT_PROTOTYPES = YES; 332 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 333 | CLANG_WARN_UNREACHABLE_CODE = YES; 334 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 335 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 336 | COPY_PHASE_STRIP = NO; 337 | ENABLE_STRICT_OBJC_MSGSEND = YES; 338 | ENABLE_TESTABILITY = YES; 339 | GCC_C_LANGUAGE_STANDARD = gnu99; 340 | GCC_DYNAMIC_NO_PIC = NO; 341 | GCC_NO_COMMON_BLOCKS = YES; 342 | GCC_OPTIMIZATION_LEVEL = 0; 343 | GCC_PREPROCESSOR_DEFINITIONS = ( 344 | "DEBUG=1", 345 | "$(inherited)", 346 | ); 347 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 348 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 349 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 350 | GCC_WARN_UNDECLARED_SELECTOR = YES; 351 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 352 | GCC_WARN_UNUSED_FUNCTION = YES; 353 | GCC_WARN_UNUSED_VARIABLE = YES; 354 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 355 | ONLY_ACTIVE_ARCH = YES; 356 | SDKROOT = iphoneos; 357 | }; 358 | name = Debug; 359 | }; 360 | F8B5ECD916CA75EB00CB3328 /* Release */ = { 361 | isa = XCBuildConfiguration; 362 | buildSettings = { 363 | ALWAYS_SEARCH_USER_PATHS = NO; 364 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 365 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 366 | CLANG_CXX_LIBRARY = "libc++"; 367 | CLANG_ENABLE_OBJC_ARC = YES; 368 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 369 | CLANG_WARN_BOOL_CONVERSION = YES; 370 | CLANG_WARN_COMMA = YES; 371 | CLANG_WARN_CONSTANT_CONVERSION = YES; 372 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 373 | CLANG_WARN_EMPTY_BODY = YES; 374 | CLANG_WARN_ENUM_CONVERSION = YES; 375 | CLANG_WARN_INFINITE_RECURSION = YES; 376 | CLANG_WARN_INT_CONVERSION = YES; 377 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 378 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 379 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 381 | CLANG_WARN_STRICT_PROTOTYPES = YES; 382 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 383 | CLANG_WARN_UNREACHABLE_CODE = YES; 384 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 385 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 386 | COPY_PHASE_STRIP = YES; 387 | ENABLE_STRICT_OBJC_MSGSEND = YES; 388 | GCC_C_LANGUAGE_STANDARD = gnu99; 389 | GCC_NO_COMMON_BLOCKS = YES; 390 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 391 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 392 | GCC_WARN_UNDECLARED_SELECTOR = YES; 393 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 394 | GCC_WARN_UNUSED_FUNCTION = YES; 395 | GCC_WARN_UNUSED_VARIABLE = YES; 396 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 397 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 398 | SDKROOT = iphoneos; 399 | VALIDATE_PRODUCT = YES; 400 | }; 401 | name = Release; 402 | }; 403 | F8B5ECDB16CA75EB00CB3328 /* Debug */ = { 404 | isa = XCBuildConfiguration; 405 | buildSettings = { 406 | CLANG_WARN_BOOL_CONVERSION = YES; 407 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 408 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 409 | CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; 410 | CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; 411 | CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO; 412 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; 413 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 414 | GCC_PREFIX_HEADER = Prefix.pch; 415 | GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; 416 | GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; 417 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 418 | GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; 419 | GCC_WARN_ABOUT_MISSING_NEWLINE = YES; 420 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 421 | GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; 422 | GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; 423 | GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES; 424 | GCC_WARN_SHADOW = YES; 425 | GCC_WARN_SIGN_COMPARE = YES; 426 | GCC_WARN_STRICT_SELECTOR_MATCH = YES; 427 | GCC_WARN_UNDECLARED_SELECTOR = YES; 428 | GCC_WARN_UNKNOWN_PRAGMAS = YES; 429 | GCC_WARN_UNUSED_FUNCTION = YES; 430 | GCC_WARN_UNUSED_LABEL = YES; 431 | GCC_WARN_UNUSED_PARAMETER = YES; 432 | INFOPLIST_FILE = Info.plist; 433 | PRODUCT_BUNDLE_IDENTIFIER = "com.mattt.${PRODUCT_NAME:rfc1034identifier}"; 434 | PRODUCT_NAME = "$(TARGET_NAME)"; 435 | WRAPPER_EXTENSION = app; 436 | }; 437 | name = Debug; 438 | }; 439 | F8B5ECDC16CA75EB00CB3328 /* Release */ = { 440 | isa = XCBuildConfiguration; 441 | buildSettings = { 442 | CLANG_WARN_BOOL_CONVERSION = YES; 443 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 444 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 445 | CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; 446 | CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; 447 | CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO; 448 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; 449 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 450 | GCC_PREFIX_HEADER = Prefix.pch; 451 | GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; 452 | GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; 453 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 454 | GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; 455 | GCC_WARN_ABOUT_MISSING_NEWLINE = YES; 456 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 457 | GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; 458 | GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; 459 | GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES; 460 | GCC_WARN_SHADOW = YES; 461 | GCC_WARN_SIGN_COMPARE = YES; 462 | GCC_WARN_STRICT_SELECTOR_MATCH = YES; 463 | GCC_WARN_UNDECLARED_SELECTOR = YES; 464 | GCC_WARN_UNKNOWN_PRAGMAS = YES; 465 | GCC_WARN_UNUSED_FUNCTION = YES; 466 | GCC_WARN_UNUSED_LABEL = YES; 467 | GCC_WARN_UNUSED_PARAMETER = YES; 468 | INFOPLIST_FILE = Info.plist; 469 | PRODUCT_BUNDLE_IDENTIFIER = "com.mattt.${PRODUCT_NAME:rfc1034identifier}"; 470 | PRODUCT_NAME = "$(TARGET_NAME)"; 471 | WRAPPER_EXTENSION = app; 472 | }; 473 | name = Release; 474 | }; 475 | /* End XCBuildConfiguration section */ 476 | 477 | /* Begin XCConfigurationList section */ 478 | F8B5ECB216CA75EB00CB3328 /* Build configuration list for PBXProject "Antenna Example" */ = { 479 | isa = XCConfigurationList; 480 | buildConfigurations = ( 481 | F8B5ECD816CA75EB00CB3328 /* Debug */, 482 | F8B5ECD916CA75EB00CB3328 /* Release */, 483 | ); 484 | defaultConfigurationIsVisible = 0; 485 | defaultConfigurationName = Release; 486 | }; 487 | F8B5ECDA16CA75EB00CB3328 /* Build configuration list for PBXNativeTarget "Antenna" */ = { 488 | isa = XCConfigurationList; 489 | buildConfigurations = ( 490 | F8B5ECDB16CA75EB00CB3328 /* Debug */, 491 | F8B5ECDC16CA75EB00CB3328 /* Release */, 492 | ); 493 | defaultConfigurationIsVisible = 0; 494 | defaultConfigurationName = Release; 495 | }; 496 | /* End XCConfigurationList section */ 497 | }; 498 | rootObject = F8B5ECAF16CA75EB00CB3328 /* Project object */; 499 | } 500 | --------------------------------------------------------------------------------