Is it possible to build custom client with EAS build?

Hello!

Is it possible to make custom client, with my libraries such flipper and apple payments support in my different expo go ?

Or Eas build only for easy sharing like expo managed and I still need xcode for development like bare expo?

I think what you’re looking for is the expo dev client- Introduction - Expo Documentation which can also be built with EAS Build

Ok, thanx for the link, but still 2 questions:

  1. Where could I find all plugins for managed workflow? Especially, does it includes flipper plugin?

  2. And for the apple pay I still need to use bare workflow, but at the end I could also make my custom client with apple pay support?

  1. The plugins are all per-library, so any library can use Expo’s config plugins to build their own plugin. Not sure if there’s one for Flipper yet

  2. Yep

  1. so could I make my plugin with flipper by my own?
  2. its sounds fantastic

1- yes you can

Yes, see here for some example plugins:

https://github.com/mrousavy/react-native-vision-camera/pull/260

Indeed it is! :slight_smile: although I’m still figuring out how to write Config Plugins.

1 Like

I tnink that plugins supported out of the box:

But if I want to write my plugin for flipper? Any instructions?

The plugins in the expo/config-plugins repository were written by the Expo team because the modules they are for did not already have their own config plugins. Ideally each project would write the config plugin needed to use that module in an Expo app.

So if you want to see how to write your own config plugin you can look at the source code for the config plugins in that repository to see how they were written.

Also check the documentation if you haven’t already.

I have not yet written one myself, but what I would do is figure out which files you need to modify, then check the Config Plugin docs Mod Plugins section to see if there’s one that can modify the file you’re interested in. Then check the expo/config-plugins repository (or other projects with config plugins) for examples of how to use that mod plugin. Then if you get stuck with that, ask specific questions on the forums.

I hope that helps.

EDIT:

Other examples

1 Like

Really thank You for that links. But what I see:

a) I could make my js-files like example on the link
b) modify some native files with mods

But what if I want:

a) connect native library like bluetooth in xcode and write some variables there for the bridge

So, should I use reject or bare-workflow for that and after run after it expo install ?

I’m not quite sure what you are asking, but have you seen the Bluetooth instructions by Evan Bacon here?

Bluetooth just for example for native integration

Ok, so if I want react-native-navigation with native libs.

My steps is:

a) make bare expo new project
b) adding lib with navigation
c) run expo install
d) I’ve got client with react-native-navigation, and I could make import in code?
e) continue working in managed-expo?

Sure, if you need React Native Navigation (e.g. because you’ve inherited a React Native app that already uses it or something like that) then the easiest thing to do is to use the bare workflow. If someone writes a config plugin for RNN then you would be able to use the managed worklflow.

Also, by the way React Navigation uses native primitives:

You should expo install expo-dev-client and then build a custom dev client (e.g. using eas build --profile development)

Then you will have something like Expo Go, except that it has react-native-navigation built in (and it does not have Facebook ads, or the face detector, or other stuff you don’t use, unless you have those as dependencies too.)

You run expo start --dev-client and open the dev client on your device or in your emulator/simulator and you can use RNN.

This is not the managed workflow, but these days it is a lot closer to the managed workflow than used to be possible. You only have to build a new dev client if you add more native dependencies, or change stuff in app.json.

In future, if someone writes a config plugin for RNN, then you could use the managed workflow.

Hi, thanks for the detail explanation.
For a bare workflow project, we want to build a custom dev client for it, we’ve follow below steps based on our understanding:

  1. expo install expo-dev-client
  2. expo install expo-dev-menu-interface
  3. Followed all the steps in: Installation in React Native and Bare workflow projects - Expo Documentation which manually setup expo-dev-client related configs.
  4. Now, if we run yarn ios, the project failed to build with some weird errors(Log 1).
  5. eas build --profile development also failed with some errors(Log 2)

Can you let us know what we are missing? yarn ios was working fine before we run above steps and we were able to run the app in simulator without any issue.

Log 1:

ld: warning: Could not find or use auto-linked library 'swiftFoundation'
ld: warning: Could not find or use auto-linked library 'swiftCompatibility51'
ld: warning: Could not find or use auto-linked library 'swiftMetal'
ld: warning: Could not find or use auto-linked library 'swiftDarwin'
ld: warning: Could not find or use auto-linked library 'swiftUIKit'
ld: warning: Could not find or use auto-linked library 'swiftCoreFoundation'
ld: warning: Could not find or use auto-linked library 'swiftCompatibility50'
ld: warning: Could not find or use auto-linked library 'swiftQuartzCore'
ld: warning: Could not find or use auto-linked library 'swiftCore'
ld: warning: Could not find or use auto-linked library 'swiftCoreGraphics'
ld: warning: Could not find or use auto-linked library 'swiftObjectiveC'
ld: warning: Could not find or use auto-linked library 'swiftDispatch'
ld: warning: Could not find or use auto-linked library 'swiftSwiftOnoneSupport'
ld: warning: Could not find or use auto-linked library 'swiftCoreImage'
ld: warning: Could not find or use auto-linked library 'swiftCompatibilityDynamicReplacements'
Undefined symbols for architecture x86_64:
  "protocol witness table for Swift.Int : Swift.Hashable in Swift", referenced from:
      protocol witness for Swift.Hashable.hashValue.getter : Swift.Int in conformance EXDevMenuInterface.DevMenuItem.ItemType : Swift.Hashable in EXDevMenuInterface in libexpo-dev-menu-interface.a(DevMenuItem.o)
      protocol witness for Swift.Hashable.hash(into: inout Swift.Hasher) -> () in conformance EXDevMenuInterface.DevMenuItem.ItemType : Swift.Hashable in EXDevMenuInterface in libexpo-dev-menu-interface.a(DevMenuItem.o)
      protocol witness for Swift.Hashable._rawHashValue(seed: Swift.Int) -> Swift.Int in conformance EXDevMenuInterface.DevMenuItem.ItemType : Swift.Hashable in EXDevMenuInterface in libexpo-dev-menu-interface.a(DevMenuItem.o)
      protocol witness for Swift.Hashable.hashValue.getter : Swift.Int in conformance EXDevMenuInterface.DevMenuScreenItem.ItemImportance : Swift.Hashable in EXDevMenuInterface in libexpo-dev-menu-interface.a(DevMenuScreenItem.o)
      protocol witness for Swift.Hashable.hash(into: inout Swift.Hasher) -> () in conformance EXDevMenuInterface.DevMenuScreenItem.ItemImportance : Swift.Hashable in EXDevMenuInterface in libexpo-dev-menu-interface.a(DevMenuScreenItem.o)
      protocol witness for Swift.Hashable._rawHashValue(seed: Swift.Int) -> Swift.Int in conformance EXDevMenuInterface.DevMenuScreenItem.ItemImportance : Swift.Hashable in EXDevMenuInterface in libexpo-dev-menu-interface.a(DevMenuScreenItem.o)
  "protocol conformance descriptor for Swift.String : Swift.Collection in Swift", referenced from:
      lazy protocol witness table accessor for type Swift.String and conformance Swift.String : Swift.Collection in Swift in libexpo-dev-menu.a(DevMenuUtils.o)
  "(extension in Swift):Swift.RangeReplaceableCollection.insert<A where A1: Swift.Collection, A.Element == A1.Element>(contentsOf: __owned A1, at: A.Index) -> ()", referenced from:
      (extension in EXDevMenu):__C.UIResponder.EXDevMenu_keyCommands.getter : [__C.UIKeyCommand] in libexpo-dev-menu.a(DevMenuKeyCommandsInterceptor.o)
  "protocol witness table for Swift.Bool : Swift.Equatable in Swift", referenced from:
      EXDevMenu.DevMenuExtensionDefaultSettings.wasRunOnDevelopmentBridge() -> Swift.Bool in libexpo-dev-menu.a(DevMenuExtensionDefaultSettings.o)
  "type metadata accessor for Foundation.Notification", referenced from:
      EXDevMenu.DevMenuViewController.(forceRootViewToRenderHack in _33CA899E1EF7A9DEDA2AFCC716E8AE40)() -> () in libexpo-dev-menu.a(DevMenuViewController.o)
  "Foundation.Notification.init(name: __C.NSNotificationName, object: Any?, userInfo: [Swift.AnyHashable : Any]?) -> Foundation.Notification", referenced from:
      EXDevMenu.DevMenuViewController.(forceRootViewToRenderHack in _33CA899E1EF7A9DEDA2AFCC716E8AE40)() -> () in libexpo-dev-menu.a(DevMenuViewController.o)
  "type metadata accessor for Foundation.UUID", referenced from:
      EXDevMenu.DevMenuViewController.(initialProps in _33CA899E1EF7A9DEDA2AFCC716E8AE40)() -> [Swift.String : Any] in libexpo-dev-menu.a(DevMenuViewController.o)

Log 2:

› Packaging Pods/Pods-MyNewBareApp » libPods-MyNewBareApp.a
› Executing MyNewBareApp » [CP] Check Pods Manifest.lock
› Executing MyNewBareApp » Start Packager
› Compiling MyNewBareApp » RCTCalendarModule.m
› Compiling MyNewBareApp » main.m
› Compiling MyNewBareApp » AppDelegate.m
› Compiling MyNewBareApp » MyNewBareApp_vers.c
› Linking   MyNewBareApp » MyNewBareApp
⚠️  ld: Could not find or use auto-linked library 'swiftFoundation'
⚠️  ld: Could not find or use auto-linked library 'swiftCompatibility51'
⚠️  ld: Could not find or use auto-linked library 'swiftMetal'
⚠️  ld: Could not find or use auto-linked library 'swiftDarwin'
⚠️  ld: Could not find or use auto-linked library 'swiftUIKit'
⚠️  ld: Could not find or use auto-linked library 'swiftCoreFoundation'
⚠️  ld: Could not find or use auto-linked library 'swiftCompatibility50'
⚠️  ld: Could not find or use auto-linked library 'swiftQuartzCore'
⚠️  ld: Could not find or use auto-linked library 'swiftCore'
⚠️  ld: Could not find or use auto-linked library 'swiftCoreGraphics'
⚠️  ld: Could not find or use auto-linked library 'swiftObjectiveC'
⚠️  ld: Could not find or use auto-linked library 'swiftDispatch'
⚠️  ld: Could not find or use auto-linked library 'swiftSwiftOnoneSupport'
⚠️  ld: Could not find or use auto-linked library 'swiftCoreImage'
⚠️  ld: Could not find or use auto-linked library 'swiftCompatibilityDynamicReplacements'
❌  Undefined symbols for architecture arm64
┌─ Symbol: protocol witness table for Swift.Int : Swift.Hashable in Swift
└─ Referenced from: protocol witness for Swift.Hashable.hashValue.getter : Swift.Int in conformance EXDevMenuInterface.DevMenuItem.ItemType : Swift.Hashable in EXDevMenuInterface in libexpo-dev-menu-interface.a(DevMenuItem.o)

❌  ld: symbol(s) not found for architecture arm64


Updates:
This fixed above errors

  1. Right click on your root project in the Project Navigator
  2. Select ‘New File’
  3. Select a ‘Swift File’
  4. Give it a name of ‘BridgeHeader’ (you don’t need to specify the .swift - it’ll add the extension automatically)
  5. Run a clean + build and hopefully the errors will have disappeared!