Untitled
unknown
plain_text
9 months ago
3.7 kB
16
Indexable
const { withInfoPlist, withEntitlementsPlist, withAppDelegate } = require('@expo/config-plugins');
/**
* Config plugin to handle Firebase iOS configuration
* This plugin ensures proper setup for Firebase Cloud Messaging on iOS
*/
const withFirebaseIOS = (config, options = {}) => {
// First, update the Info.plist
config = withInfoPlist(config, (config) => {
const infoPlist = config.modResults;
// Ensure UIBackgroundModes includes remote-notification
if (!infoPlist.UIBackgroundModes) {
infoPlist.UIBackgroundModes = ['remote-notification'];
} else if (Array.isArray(infoPlist.UIBackgroundModes)) {
if (!infoPlist.UIBackgroundModes.includes('remote-notification')) {
infoPlist.UIBackgroundModes.push('remote-notification');
}
}
// Add Firebase-specific settings
infoPlist.FirebaseAppDelegateProxyEnabled = false;
return config;
});
// Then, update the Entitlements.plist
config = withEntitlementsPlist(config, (config) => {
const entitlementsPlist = config.modResults;
// Ensure aps-environment is set
entitlementsPlist['aps-environment'] = process.env.EAS_BUILD_PROFILE === 'production'
? 'production'
: 'development';
return config;
});
// Finally, update the AppDelegate.mm file to properly handle remote notifications
config = withAppDelegate(config, (config) => {
const appDelegate = config.modResults;
// Check if we need to add [application registerForRemoteNotifications]
if (!appDelegate.contents.includes('[application registerForRemoteNotifications]')) {
// Add the line after [FIRApp configure]
appDelegate.contents = appDelegate.contents.replace(
'[FIRApp configure];',
'[FIRApp configure];\n [application registerForRemoteNotifications]; // Added by withFirebaseIOS plugin'
);
}
// Check if we need to add [FIRMessaging messaging].APNSToken = deviceToken
if (!appDelegate.contents.includes('[FIRMessaging messaging].APNSToken = deviceToken')) {
// Look for the didRegisterForRemoteNotificationsWithDeviceToken method
const didRegisterMethod = appDelegate.contents.match(
/- \(void\)application:\(UIApplication \*\)application didRegisterForRemoteNotificationsWithDeviceToken:\(NSData \*\)deviceToken\s*{[^}]*}/
);
if (didRegisterMethod) {
// Replace the method with our modified version
const originalMethod = didRegisterMethod[0];
const modifiedMethod = originalMethod.replace(
'{',
'{\n [FIRMessaging messaging].APNSToken = deviceToken; // Added by withFirebaseIOS plugin'
);
appDelegate.contents = appDelegate.contents.replace(originalMethod, modifiedMethod);
} else {
// If the method doesn't exist, add it after the @implementation line
const implementationLine = appDelegate.contents.match(/@implementation AppDelegate/);
if (implementationLine) {
const newMethod = `
// Added by withFirebaseIOS plugin
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
[FIRMessaging messaging].APNSToken = deviceToken;
return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
`;
appDelegate.contents = appDelegate.contents.replace(
'@implementation AppDelegate',
'@implementation AppDelegate' + newMethod
);
}
}
}
return config;
});
return config;
};
module.exports = withFirebaseIOS;
Editor is loading...
Leave a Comment