├── 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 |
13 |
14 | IBNSLayoutConstraint
15 | IBProxyObject
16 | IBUIButton
17 | IBUIView
18 |
19 |
20 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin
21 |
22 |
26 |
27 |
31 |
35 |
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 |
--------------------------------------------------------------------------------