Unable to compile in XCode: Expected identifier or '('

Hello, when trying to compile my XCode project, I receive an error stating "Expected identifier or ‘(’ ".

This error occurs in the AppDelegateListener.h file, which is a Unity supplied file. This error occurs for each of the following lines…

extern "C" __attribute__((visibility ("default"))) NSString* const kUnityDidRegisterForRemoteNotificationsWithDeviceToken;
extern "C" __attribute__((visibility ("default"))) NSString* const kUnityDidFailToRegisterForRemoteNotificationsWithError;
extern "C" __attribute__((visibility ("default"))) NSString* const kUnityDidReceiveRemoteNotification;
extern "C" __attribute__((visibility ("default"))) NSString* const kUnityDidReceiveLocalNotification;
extern "C" __attribute__((visibility ("default"))) NSString* const kUnityOnOpenURL;

What’s stranger is that an empty Unity project with an identical AppDelegateListener.h file compiles without issue.

Possibly worth noting, I’m using CocoaPods, specifically the Google-Mobile-Ads-SDK pod. This means that instead of opening the actual XCode project, I open a workspace created by CocoaPods.

As far as I can tell, my real project and the empty project that compiles are configured the same in XCode. Therefore, I’m at a loss why the error is occurring.

I’m using Unity 5.3.6f1 and XCode 8.0

Thanks in advance for any help you can provide.

Edit: Here’s the entire contents of AppDelegateListener.h as the specific error often relates to earlier code (tho I don’t think that’s the issue in this case)…

#pragma once

#include "LifeCycleListener.h"


@protocol AppDelegateListener<LifeCycleListener>
@optional
// these do not have apple defined notifications, so we use our own notifications

// notification will be posted from
// - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
// notification user data is deviceToken
- (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSNotification*)notification;

// notification will be posted from
// - (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
// notification user data is error
- (void)didFailToRegisterForRemoteNotificationsWithError:(NSNotification*)notification;

// notification will be posted from
// - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
// notification user data is userInfo
- (void)didReceiveRemoteNotification:(NSNotification*)notification;

// notification will be posted from
// - (void)application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)notification
// notification user data is notification
- (void)didReceiveLocalNotification:(NSNotification*)notification;

// notification will be posted from
// - (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
// notification user data is the NSDictionary containing all the params
- (void)onOpenURL:(NSNotification*)notification;

// these are just hooks to existing notifications
- (void)applicationDidReceiveMemoryWarning:(NSNotification*)notification;
- (void)applicationSignificantTimeChange:(NSNotification*)notification;
- (void)applicationWillChangeStatusBarFrame:(NSNotification*)notification;
- (void)applicationWillChangeStatusBarOrientation:(NSNotification*)notification;
@end

void UnityRegisterAppDelegateListener(id<AppDelegateListener> obj);
void UnityUnregisterAppDelegateListener(id<AppDelegateListener> obj);

extern "C" __attribute__((visibility ("default"))) NSString* const kUnityDidRegisterForRemoteNotificationsWithDeviceToken;
extern "C" __attribute__((visibility ("default"))) NSString* const kUnityDidFailToRegisterForRemoteNotificationsWithError;
extern "C" __attribute__((visibility ("default"))) NSString* const kUnityDidReceiveRemoteNotification;
extern "C" __attribute__((visibility ("default"))) NSString* const kUnityDidReceiveLocalNotification;
extern "C" __attribute__((visibility ("default"))) NSString* const kUnityOnOpenURL;

In UnityViewControllerListener.mm comment out all the uses of the DEFINE_NOTIFICATION macro like this:

//DEFINE_NOTIFICATION(kUnityViewDidLayoutSubviews);
//DEFINE_NOTIFICATION(kUnityViewDidDisappear);
//DEFINE_NOTIFICATION(kUnityViewDidAppear);
//DEFINE_NOTIFICATION(kUnityViewWillDisappear);
//DEFINE_NOTIFICATION(kUnityViewWillAppear);
//DEFINE_NOTIFICATION(kUnityInterfaceWillChangeOrientation);
//DEFINE_NOTIFICATION(kUnityInterfaceDidChangeOrientation);

And in UnityViewControllerListener.mm, comment out the declarations of these notification names like this:

//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewDidLayoutSubviews;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewDidDisappear;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewDidAppear;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewWillDisappear;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewWillAppear;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityInterfaceWillChangeOrientation;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityInterfaceDidChangeOrientation;

And add this instead:

NSString* const kUnityViewDidLayoutSubviews = @“kUnityViewDidLayoutSubviews”;
NSString* const kUnityViewDidDisappear = @“kUnityViewDidDisappear”;
NSString* const kUnityViewDidAppear = @“kUnityViewDidAppear”;
NSString* const kUnityViewWillDisappear = @“kUnityViewWillDisappear”;
NSString* const kUnityViewWillAppear = @“kUnityViewWillAppear”;
NSString* const kUnityInterfaceWillChangeOrientation = @“kUnityInterfaceWillChangeOrientation”;
NSString* const kUnityInterfaceDidChangeOrientation = @“kUnityInterfaceDidChangeOrientation”;

In UnityViewControllerListener.h, change how the Notifications are declared by commenting out the old way and adding the new way:

//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewDidLayoutSubviews;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewDidDisappear;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewDidAppear;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewWillDisappear;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityViewWillAppear;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityInterfaceWillChangeOrientation;
//extern “C” attribute((visibility (“default”))) NSString* const kUnityInterfaceDidChangeOrientation;

NSString* const kUnityViewDidLayoutSubviews = @“kUnityViewDidLayoutSubviews”;
NSString* const kUnityViewDidDisappear = @“kUnityViewDidDisappear”;
NSString* const kUnityViewDidAppear = @“kUnityViewDidAppear”;
NSString* const kUnityViewWillDisappear = @“kUnityViewWillDisappear”;
NSString* const kUnityViewWillAppear = @“kUnityViewWillAppear”;
NSString* const kUnityInterfaceWillChangeOrientation = @“kUnityInterfaceWillChangeOrientation”;
NSString* const kUnityInterfaceDidChangeOrientation = @“kUnityInterfaceDidChangeOrientation”;

In UnityViewControllerListener.mm, comment out all the uses of DEFINE_NOTIFICATION macro:

//DEFINE_NOTIFICATION(kUnityViewDidLayoutSubviews);
//DEFINE_NOTIFICATION(kUnityViewDidDisappear);
//DEFINE_NOTIFICATION(kUnityViewDidAppear);
//DEFINE_NOTIFICATION(kUnityViewWillDisappear);
//DEFINE_NOTIFICATION(kUnityViewWillAppear);
//DEFINE_NOTIFICATION(kUnityInterfaceWillChangeOrientation);
//DEFINE_NOTIFICATION(kUnityInterfaceDidChangeOrientation);

I discovered the root cause. An outdated AppsFlyer plugin had the following file: AppsFlyerDelegate.m. This file imports AppsFlyerDelegate.h which then imports AppDelegateListener.h. Because AppsFlyerDelegate.m is an Objective-C file and not an Objective-C++ file, it couldn’t handle the syntax in AppDelegateListener.h.

In an updated AppsFlyer plugin AppsFlyerDelegate.m was removed.