How to create a native module in React Native - xcode

I'm trying to follow this guide here to create a native module in React Native.
https://facebook.github.io/react-native/docs/native-modules-setup
When you create the native module these are the setup instructions.
cd react-native-my-library/example
yarn
cd ios
pod install # required starting with React Native 0.60
cd ..
react-native run-ios
I don't have an example subfolder and there is also no pod file installed in the ios directory so pod install just gives me this error.
[!] No `Podfile' found in the project directory.
It's also creating my project with an older verison of react native. It's using react-native: 0.59.10.
The current version I have installed is react-native: 0.61.5.
I'm on Mac OS X 10.15.3.

I was having this issue as well yesterday, here's one reply from the repo owner. Append the following to podfile will do
pod 'react-native-my-library', :path => '../react-native-my-library.podspec'
At the same time I realized podfile is not really necessary unless your module required other depedendency to be installed? Otherwise, I just build on top of .xcworkspace and link to my project. Ta-da, works fine!
** One thing to keep in mind is that, .xcworkspace is not able to compile due to the complain of missing React/***.h

Related

Library not loaded: #rpath/hermes.framework/hermes

I have enabled Hermes in my react-native(v0.64) Application. Everytime I run app I get following stack trace.
dyld: dyld cache load error: shared cache file open() failed
dyld: Library not loaded: #rpath/hermes.framework/hermes
Referenced from: /Users/sharktank/Library/Developer/CoreSimulator/Devices/A32F4931-51A8-4D22-AEFB-625F834CE221/data/Containers/Bundle/Application/71773888-08D5-4B82-9545-07F6B1538864/COSPM-DEV.app/COSPM-DEV
Reason: image not found
dyld: launch, loading dependent libraries
DYLD_SHARED_CACHE_DIR=/Users/sharktank/Library/Developer/CoreSimulator/Caches/dyld/20E232/com.apple.CoreSimulator.SimRuntime.iOS-14-4.18D46
DYLD_ROOT_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot
DYLD_LIBRARY_PATH=/Users/sharktank/Library/Developer/Xcode/DerivedData/COSPM-atbujvbobdbyehckyoqrdgmqiubm/Build/Products/Debug-iphonesimulator:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/introspection
DYLD_INSERT_LIBRARIES=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libBacktraceRecording.dylib:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSim
(lldb)
I have enabled hermes in Podfile and after pod install pod is available in Pods folder.
Project is in monorepo architecture along side another projects. Another app enabled with Hermes in same mono-repo package is working fine without crash.
Podfile:
require_relative '../../../node_modules/react-native/scripts/react_native_pods'
require_relative '../../../node_modules/#react-native-community/cli-platform-ios/native_modules'
platform :ios, '10.0'
source 'https://github.com/CocoaPods/Specs.git'
target 'COSPM' do
config = use_native_modules!
use_react_native!(
:path => config[:reactNativePath],
# to enable hermes on iOS, change `false` to `true` and then install pods
:hermes_enabled => true
)
pod 'RNVectorIcons', :path => '../../../node_modules/react-native-vector-icons'
# Firebase
pod 'Firebase'
pod 'Firebase/Core'
pod 'Firebase/Messaging'
pod 'CodePush', :path => '../../../node_modules/react-native-code-push'
target 'COSPMTests' do
inherit! :complete
# Pods for testing
end
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable the next line.
use_flipper!()
post_install do |installer|
react_native_post_install(installer)
end
end
I am using Xcode 12.4.
Solutions I tried which did not work:
Clean Pods and npm packages, clean previous build and rebuild
Clear watchman and metro bundler cache and rebuild
I was facing the same problem on react native 0.70
Select App Target then follow the steps
goto Build Phases
Inside Link Binary With Libraries section
Click on Add Items and search for hermes.xcframework and add it
Rebuild application
This resolved my issue in RN 0.70. In Xcode, Targets -> Build Phases -> Link Binary With Libraries
The other answers suggest disabling Hermes or manually adding it as a linked library, but this should not be necessary.
The latest version should install the Hermes framework automatically.
The problem seems to be related to using the incorrect version of CocoaPods and the pods repo.
To bring everything up to date, do the following:
Make sure your Gemfile is up to date for your version of React Native. You can use the Upgrade Helper to see if it needs changed.
Upgrade Ruby to the version listed in your project's Gemfile. (Instructions)
Upgrade CocoaPods to the latest version: bundle install
Update the CocoaPods repo: bundle exec pod repo update
Delete Podfile.lock
Reinstall pods cd ./ios && bundle exec pod install
If you're still getting errors, double check that the correct versions are actually being used (are in your PATH).
I also made a blog post about this error if you would like more details: https://traviswimer.com/blog/cocoapods-could-not-find-compatible-versions-for-pod-hermes-engine/
Update (Jan 17, 2023)
I updated this answer to use the Bundler tool to manage Ruby and Cocoapods versions. The bundle command is now the recommended way to use Cocoapods in React Native projects. It runs commands based on the versions listed in your project's Gemfile (which is updated with each version of React Native). If for some reason you are unable to use bundle, you can manually upgrade Cocoapods using: gem install cocoapods
Then run the other commands without bundle exec. (e.g. pod repo update and pod install
Try following:
Change hermes_enabled value from true to false in Podfile
Reinstall npm/yarn dependencies by (yarn install)
Reinstall pods (cd ios && pods install)
Run app (react-native run-ios)
I tried this a couple of times changing hermes_enabled from true to false and back, and once it starts working.
The right answer depends on your react-native version
This error means that your react-native project is set to use hermes a lightweight Javascript engine created by facebook specially for react-native. It is supposed to make the app faster and lighter.
If you want to use hermes, open your Podfile (ios/Podfile), look for hermes_enabled and set its value to true. The line should look like the following
:hermes_enabled => true
Besides that, you might needs to follow few more steps from the official page.
If your Podfile does not have any hermes_enabled property, please make sure your react-native project is using at least 0.60.
For react-native > 0.60 and < 0.70
follow these steps from the official page.
For react-native >= 0.70
Hermes is the default engine for this version and beyond. Maybe you just need to reinstall your node packages, clean your Podfile.lock and reinstall your pods by running pod install from inside your ios folder.

fatal error: 'boost/preprocessor/control/expr_iif.hpp' file not found

I have a React Native project. I recently updated to macOS Big Sur 11.3 and XCode Version 12.5 (12E262).
When I build the project in XCode I get the following error:
../ios/Pods/Headers/Public/Flipper-Folly/folly/functional/Invoke.h:22:10: fatal error: 'boost/preprocessor/control/expr_iif.hpp' file not found
#include <boost/preprocessor/control/expr_iif.hpp>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
When I browse to Pods folder, expr_iif.hpp file exists.
I tried removing Pods folder, Podfile.lock, .xcworkspace. Deleted npm cache. Then ran pod install.
But no luck.
This build-time error is thrown by Flipper-RSocket and Flipper-Folly.
I can provide further details if requested.
I just had this issue and it happens when you have incompatible versions of Flipper pods.
This worked for me:
Update your Podfile to install Flipper like this:
use_flipper!({ 'Flipper' => '0.93.0', 'Flipper-Folly' => '2.6.7', 'Flipper-DoubleConversion' => '3.1.7' })
Update deployment target on both Podfile and Xcode project o 12.1 or newer:
platform :ios, '12.1'
Remove Podfile.lock
pod install --repo-update
Close and re-open the Xcode project
You may also try fixing permissions if the above is not enough for you:
chmod -R 755 ios/Pods/boost-for-react-native
The error went away after this.
It completely removes Flipper, but here's a workaround I used
disabled Flipper in PodFile (as explained in an answer here: React Native Project is not running on iOS Simulator)
deleted Pods directory
re-ran npx pod-install
started the application (npx react-native run-ios)
Instead of giving him the precise version I used the next line:
use_flipper!
Put it in Podfile and run: pod install --repo-update.
It worked for me!

Creating a pod with cocoapods fails

I've just tried to create a pod using pod lib create Test and went with all the defaults. However, when it is done asking me questions I get:
Running pod install on your new library.
[!] No `Podfile' found in the project directory.
Ace! you're ready to go!
We will start you off by opening your project in Xcode
open 'Test/Example/Test'
The file /Users/macattack/Documents/Xcode/Test/Example/Test.xcworkspace does not exist.
I don't understand what I've done wrong.
I'm using XCode 8, cocoapods 1.1.0.rc.2.
Following is working on Cocoapods 1.1.0.rc.2 version.
You haven't done anything wrong. It's a pre-release version, just a few more steps required.
Podfile is already there, but in the Example folder. Open terminal, proceed to Example folder:
cd [path]
You can just drag&drop the folder after 'cd' letters to paste the path.
Then just run pod install.
Open workspace, Xcode will prompt you to update to last Swift syntax version and update version property.
If you are using Swift 3 there is another option, suggested by authors (Issue 5841).
Create a .swift-version file in pod parent folder. Run echo "3.0" >> .swift-version
Create pod with pod lib create [pod name].
Proceed to pod Example folder and run pod install
Hope it helps!
Artem

How to install ConvenienceKit Framework via Podfile Swift

I've tried multiple methods and Xcode versions to install this method and use it but every time when i use import ConvenienceKit it always fails by saying "No such module ConvenienceKit"
https://github.com/MakeSchool/ConvenienceKit
it can be installed by using use_frameworks! in the Podfile and pod 'ConvenienceKit'. Everything installs fine, just doesn't work.
What am i missing ?
To use pods use have to work in a 'workspace' with the the pod that you are using. If you are using a workspace and it is sill not working you can try the following:
Check to see if there is a update for CocoaPods
Check to see if there is a update for Xcode
Uninstall Xcode and re install it.
Hope this works.

Implementing ObjCMongoDB into a project

I am having trouble implementing the "Getting Started" portion of using the ObjCMongoDB driver for MongoDB. Please simplify some of the instructions. I am new to Github and some of the terms do not quite click for me. Any sort of simplification or a step by step process of doing this would be helpful.
CocoaPods is a command line tool for managing Objective-C dependencies. If you're having trouble following the ObjCMongoDB Getting Started guide (or will be building a number of projects) CocoaPods should be an easier install process. As an added bonus, there are thousands of other dependencies that can be installed via CocoaPods once you're set up.
With the exception of creating your XCode project, the following steps need to be done from a command-line prompt (i.e. Terminal or iTerm).
First, install CocoaPods
$ gem install cocoapods
(You may need to sudo gem install cocoapods if you are using a default Ruby install)
Setup the CocoaPods master repo, which includes definitions of Objective C dependencies that can be installed:
$ pod setup
Create a new Xcode project (or use an existing one)
Create a new iOS or OS X project in Xcode. If you have an existing project, you can skip to the next step.
Change to the project directory
$ cd ~/src/myproject
Create a new Podfile
You can run pod init and then edit the default Podfile created, but for simplicity this will work:
$ echo "pod 'ObjCMongoDB', '~> 0.11.0'" >> Podfile
Run pod install
$ pod install
Analyzing dependencies
Downloading dependencies
Installing ObjCMongoDB (0.11.0)
Installing mongo-c-driver (0.8.1)
Generating Pods project
Integrating client project
[!] From now on use `MyProject.xcworkspace`.
Open the workspace file in XCode
$ open MyProject.xcworkspace
#import "ObjCMongoDB.h" and get started coding your app
You should now be set to start coding with The Basics of using ObjCMongoDB.

Resources