Browse Source

Fix system log viewer on iOS 7

The availability/deprecation annotations in asl.h (8.1 SDK) are incorrect. asl_next() and asl_release() were added in iOS 8, not iOS 7.
Ryan Olson 11 years ago
parent
commit
063ffe97c1

+ 19 - 11
Classes/Global State Explorers/System Log/FLEXSystemLogTableViewController.m

@@ -191,6 +191,11 @@
 
 #pragma mark - Log Message Fetching
 
+// Due to a mistake in asl.h, things get a little messy. We need to mark these symbols as weak since they won't exist on iOS 7 despite the compiler thinking otherwise.
+// asl.h in the iOS 8.1 SDK claims that asl_next() and asl_release() were introduced in iOS 7 to replace aslresponse_next() and aslresponse_free(). However, they were actually added in iOS 8.0.
+extern aslmsg asl_next(asl_object_t obj) __attribute__((weak_import));
+extern void asl_release(asl_object_t obj) __attribute__((weak_import));
+
 + (NSArray *)allLogMessagesForCurrentProcess
 {
     asl_object_t query = asl_new(ASL_TYPE_QUERY);
@@ -204,18 +209,21 @@
 
     NSMutableArray *logMessages = [NSMutableArray array];
 
-    // Work around deprecated API warnings while supporting multiple deployment targets.
-#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0
-    while ((aslMessage = asl_next(response))) {
-        [logMessages addObject:[FLEXSystemLogMessage logMessageFromASLMessage:aslMessage]];
-    }
-    asl_release(response);
-#else
-    while ((aslMessage = aslresponse_next(response))) {
-        [logMessages addObject:[FLEXSystemLogMessage logMessageFromASLMessage:aslMessage]];
+    if (&asl_next != NULL && &asl_release != NULL) {
+        while ((aslMessage = asl_next(response))) {
+            [logMessages addObject:[FLEXSystemLogMessage logMessageFromASLMessage:aslMessage]];
+        }
+        asl_release(response);
+    } else {
+        // Mute incorrect deprecated warnings. We'll need the "deprecated" functions on iOS 7, where their replacements don't yet exist.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+        while ((aslMessage = aslresponse_next(response))) {
+            [logMessages addObject:[FLEXSystemLogMessage logMessageFromASLMessage:aslMessage]];
+        }
+        aslresponse_free(response);
+#pragma clang diagnostic pop
     }
-    aslresponse_free(response);
-#endif
 
     return logMessages;
 }