tns plugin add @nativescript-community/sentry
Be sure to run a new build after adding plugins to avoid any issues.
You will need to add something like this to your webpack config so that the source maps gets uploaded. I dont set auth
or project
in the options as i use a .sentryclirc
config file.
SOURCEMAP_REL_DIR
: i almost always set it to../../sourcemaps
SENTRY_PREFIX
: the default isapp:///
if (!!sentry && !!uploadSentry) {
config.devtool = false;
config.plugins.push(
new webpack.SourceMapDevToolPlugin({
append: `\n//# sourceMappingURL=${process.env.SENTRY_PREFIX}[name].js.map`,
filename: join(process.env.SOURCEMAP_REL_DIR, '[name].js.map')
})
);
let appVersion;
let buildNumber;
if (isAndroid) {
const gradlePath = `${appResourcesPath}/Android/app.gradle`;
const gradleData = readFileSync(gradlePath, 'utf8');
appVersion = gradleData.match(/versionName "((?:[0-9]+\.?)+)"/)[1];
buildNumber = gradleData.match(/versionCode ([0-9]+)/)[1];
} else if (isIOS) {
const plistPath = `${appResourcesPath}/iOS/Info.plist`;
const plistData = readFileSync(plistPath, 'utf8');
appVersion = plistData.match(/<key>CFBundleShortVersionString<\/key>[\s\n]*<string>(.*?)<\/string>/)[1];
buildNumber = plistData.match(/<key>CFBundleVersion<\/key>[\s\n]*<string>([0-9]*)<\/string>/)[1];
}
config.plugins.push(
new SentryCliPlugin({
release: appVersion,
urlPrefix: 'app:///',
rewrite: true,
release: `${nconfig.id}@${appVersion}+${buildNumber}`,
dist: `${buildNumber}.${platform}`,
ignoreFile: '.sentrycliignore',
include: [join(dist, process.env.SOURCEMAP_REL_DIR)]
})
);
}
###debug
For debug mode to work correctly you will need to add this to your webpack (see demo app)
nsWebpack.chainWebpack(config=>{
config.entry('bundle').prepend('@nativescript-community/sentry/process');
});
If you use fastlane you can use it to create release and upload dsyms To do that you need to install it:
fastlane add_plugin sentry
Also for now you should install nativescript-set-version
as it is needed to read app version, build number.
npm install -D nativescript-set-version
Now you can setup your Fastfile
- create release
version = ""
versionCode = ""
Dir.chdir("..") do
version = sh("./node_modules/.bin/get-version", platform, "version").gsub(/\n/,'')
versionCode = sh("./node_modules/.bin/get-version", platform, "code").gsub(/\n/,'')
end
sentry_create_release(
version: version, # release version to create
)
- upload dsyms
sentry_upload_dsym
import * as Sentry from '@nativescript-community/sentry';
const buildNumber = await getBuildNumber();
const versionName = await getVersionName();
const buildNumber = await getBuildNumber();
const appId = await getAppId();
Sentry.init({
dsn: SENTRY_DSN,
debug: true,
enableAutoPerformanceTracking: true,
});
The onerror
method ensures all unhandled NativeScript errors will be caught by Sentry in production, using a custom error handler.
If you would like to send a handled error to Bugsnag, you can pass any Error object to Sentry notify method:
import * as Sentry from '@nativescript-community/sentry';
try {
// potentially crashy code
} catch (error) {
Sentry.captureException(error);
}
To report a promise rejection, use notify() as a part of the catch block:
import * as Sentry from '@nativescript-community/sentry';
new Promise(function(resolve, reject) {
/* potentially failing code */
})
.then(function () { /* if the promise is resolved */ })
.catch(function (error) {
Sentry.captureException(error);
});
Bugsnag will automatically capture and attach the following diagnostic data:
- A full stacktrace
- Battery state
- Device model and OS version
- Thread state for all threads
- Release stage (production, debug, etc)
- App running duration in the foreground and/or background
- A device- and vendor-specific identifier
In order to correlate errors with customer reports, or to see a list of users who experienced each error, it is helpful to capture and display user information. Information set on the Bugsnag client is sent with each error report:
Sentry.setUser({"email": "[email protected]"});
In order to understand what happened in your application before each crash, it can be helpful to leave short log statements that we call breadcrumbs. The last several breadcrumbs are attached to a crash to help diagnose what events lead to the error.
By default, Bugsnag captures common events including:
- Low memory warnings
- Device rotation (if applicable)
- Menu presentation
- Screenshot capture (not the screenshot itself)
- Undo and redo
- Table view selection
- Window visibility changes
- Non-fatal errors
- Log messages (off by default, see configuration options)
To attach additional breadcrumbs, use the leaveBreadcrumb function:
Sentry.addBreadcrumb({
category: 'ui',
message: 'load main view',
level: 'info'
});
The repo uses submodules. If you did not clone with --recursive
then you need to call
git submodule update --init
The package manager used to install and link dependencies must be pnpm
or yarn
. npm
wont work.
To develop and test:
if you use yarn
then run yarn
if you use pnpm
then run pnpm i
Interactive Menu:
To start the interactive menu, run npm start
(or yarn start
or pnpm start
). This will list all of the commonly used scripts.
npm run build.all
WARNING: it seems yarn build.all
wont always work (not finding binaries in node_modules/.bin
) which is why the doc explicitly uses npm run
npm run demo.[ng|react|svelte|vue].[ios|android]
npm run demo.svelte.ios # Example
Demo setup is a bit special in the sense that if you want to modify/add demos you dont work directly in demo-[ng|react|svelte|vue]
Instead you work in demo-snippets/[ng|react|svelte|vue]
You can start from the install.ts
of each flavor to see how to register new demos
You can update the repo files quite easily
First update the submodules
npm run update
Then commit the changes Then update common files
npm run sync
Then you can run yarn|pnpm
, commit changed files if any
npm run readme
npm run doc
The publishing is completely handled by lerna
(you can add -- --bump major
to force a major release)
Simply run
npm run publish
The repo uses https:// for submodules which means you won't be able to push directly into the submodules.
One easy solution is t modify ~/.gitconfig
and add
[url "ssh://[email protected]/"]
pushInsteadOf = https://github.com/
If you have any questions/issues/comments please feel free to create an issue or start a conversation in the NativeScript Community Discord.