Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Driversnote-Dev/react-native-kontaktio
React Native (iOS and Android) library for Kontakt.io beacons (and all other beacons)
https://github.com/Driversnote-Dev/react-native-kontaktio
beacon ibeacon kontaktio
Last synced: 3 months ago
JSON representation
React Native (iOS and Android) library for Kontakt.io beacons (and all other beacons)
- Host: GitHub
- URL: https://github.com/Driversnote-Dev/react-native-kontaktio
- Owner: Driversnote-Dev
- License: mit
- Created: 2016-07-14T09:18:03.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-05-14T10:56:11.000Z (6 months ago)
- Last Synced: 2024-05-15T00:15:37.096Z (6 months ago)
- Topics: beacon, ibeacon, kontaktio
- Language: Objective-C
- Homepage:
- Size: 22.7 MB
- Stars: 112
- Watchers: 9
- Forks: 48
- Open Issues: 33
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-react-native-native-modules - react-native-kontaktio ★35
README
# react-native-kontaktio [![npm version](https://badge.fury.io/js/react-native-kontaktio.svg)](https://badge.fury.io/js/react-native-kontaktio)
Cross-platform React Native module for detecting beacons with **Android** and **iOS** devices.
Kontakt.io SDK Versions of newest release:
| OS | SDK Version |
| :---------- | :--------------------------------------------------------------------------------------------------- |
| **Android** | [7.0.6](https://kontakt-api-docs.stoplight.io/docs/dev-ctr-sdks/423dcaf4067cc-android-sdk-changelog) |
| **iOS** | [3.0.25](https://github.com/kontaktio/kontakt-ios-sdk/releases/tag/v3.0.25) |## Advantages
- Works with any beacon (because the Kontakt.io SDK wraps the native beacon libraries (while adding more) - no Kontakt.io SDK API key is necessary.
- Especially useful with [Kontakt.io](http://kontakt.io/) beacons because additional information like the **unique id** (on the back of each beacon), the **battery power level** and others are available and get synchronized with your Kontakt.io online panel.
- Highly customizable configurations (e.g. for setting arbitrary monitoring intervals on Android)## Setup
- [Android Setup](/docs/setup.android.md)
- [iOS Setup](/docs/setup.ios.md)## API Documentation
- [Android Documentation](/docs/api.android.md)
- [iOS Documentation](/docs/api.ios.md)## Examples
### Extensive Example
- [Android extensive Example](/Example/src/Example.android.js)
- [iOS extensive Example](/Example/src/Example.ios.js)### Minimal TypeScript Example
A minimal example (created with [React Native v0.69.5](https://github.com/facebook/react-native/releases/tag/v0.69.5) and TypeScript) with the default configuration and no specifically set regions. Thus, the default region `everywhere` (i.e. all beacons) is automatically used.
1. Follow the setup instructions carefully for `iOS` and `Android` to install `react-native-kontaktio` for both platforms.
2. Start a new React Native TypeScript project (`npx react-native init BeaconTest --template react-native-template-typescript`) and replace `App.tsx` with the example code below.
3. Run the app on a real device (`iOS` or `Android` - not a simulator)
4. Check the React Native logs to see console statements containing incoming beacon signals.```ts
import React, { useEffect } from 'react';
import {
Alert,
DeviceEventEmitter,
NativeEventEmitter,
PermissionsAndroid,
Platform,
SafeAreaView,
StatusBar,
StyleSheet,
Text,
View,
} from 'react-native';import Kontakt, { KontaktModule } from 'react-native-kontaktio';
const {
connect,
init,
startDiscovery,
startRangingBeaconsInRegion,
startScanning,
} = Kontakt;const kontaktEmitter = new NativeEventEmitter(KontaktModule);
const isAndroid = Platform.OS === 'android';
/**
* Android Marshmallow (6.0) and above need to ask the user to grant certain permissions.
* This function does just that.
*/
const requestLocationPermission = async () => {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
title: 'Location Permission',
message:
'This example app needs to access your location in order to use bluetooth beacons.',
buttonNeutral: 'Ask Me Later',
buttonNegative: 'Cancel',
buttonPositive: 'OK',
}
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
return true;
} else {
// permission denied
return false;
}
} catch (err) {
console.warn(err);
return false;
}
};const beaconSetup = async () => {
if (isAndroid) {
// Android
const granted = await requestLocationPermission();
if (granted) {
await connect();
await startScanning();
} else {
Alert.alert(
'Permission error',
'Location permission not granted. Cannot scan for beacons',
[{ text: 'OK', onPress: () => console.log('OK Pressed') }],
{ cancelable: false }
);
}
} else {
// iOS
await init();/**
* Will discover Kontakt.io beacons only
*/
await startDiscovery();/**
* Works with any beacon(also virtual beacon, e.g. https://github.com/timd/MactsAsBeacon)
* Requires user to allow GPS Location (at least while in use)
*
* change to match your beacon values
*/
await startRangingBeaconsInRegion({
identifier: '',
uuid: 'A4826DE4-1EA9-4E47-8321-CB7A61E4667E',
major: 1,
minor: 34,
});
}// Add beacon listener
if (isAndroid) {
/* works with any beacon */
DeviceEventEmitter.addListener(
'beaconsDidUpdate',
({ beacons, region }) => {
console.log('beaconsDidUpdate', { beacons, region });
},
);
} else {
/* works with Kontakt.io beacons only */
kontaktEmitter.addListener('didDiscoverDevices', ({ beacons }) => {
console.log('didDiscoverDevices', { beacons });
});/* works with any beacon */
kontaktEmitter.addListener('didRangeBeacons', ({ beacons, region }) => {
console.log('didRangeBeacons', { beacons, region });
});
}
};const App: React.FC = () => {
useEffect(() => {
Promise.resolve().then(beaconSetup);return () => {
// remove event listeners
if (isAndroid) {
kontaktEmitter.removeAllListeners('beaconsDidUpdate');
} else {
kontaktEmitter.removeAllListeners('didDiscoverDevices');
kontaktEmitter.removeAllListeners('didRangeBeacons');
}
};
}, []);return (
react-native-kontaktio Example
Check console.log statements
);
};const styles = StyleSheet.create({
wrapper: {
height: '100%',
justifyContent: 'center',
alignItems: 'center',
},
title: {
paddingVertical: 10,
fontSize: 30,
},
});export default App;
```---
**Note (March 2020)**: The example in the `Example/` folder is a bit outdated. If you want to try to run the example app anyway, here are some instructions to do so:
1. Clone this repository, connect an Android and/or Apple device to your computer and have some (Kontakt.io) beacons nearby.
2. Open a terminal window, bash to the `Example/` folder, run `npm install` and start the react-native server
```bash
$ cd react-native-kontaktio/Example
$ npm install
$ npm start
```3. Build the example and run it on your device. The app will appear under the name `KontaktIoSimpleTest`:
- Android:
```bash
$ react-native run-android
```- iOS
```bash
$ react-native run-ios
```## Further notes
- Beacons support is part of Android versions 4.3 and up. \* So far the lowest Android version this library was tested on was a device with Android 4.4.2.
- A physical device must be used for testing and some beacons (Kontakt.io beacons to be able to use all features).
- If some BLE Beacons are filtered out by the scan on Android 12+, therefore not returned in the list of beacons, try this:
```xml
```
With the **neverForLocation** android:usesPermissionFlags, some BLE beacons are filtered from the scan results. |More information about this on [issue #121](https://github.com/Driversnote-Dev/react-native-kontaktio/issues/121#issuecomment-2098884380).## ToDo:
- Update Android Eddystone feature:
- Add _multiple_ Eddystone namespaces, i.e. add function `setEddystoneNamespaces`
- Add Eddystone Frames Selection configuration option## Contribute
### Test library changes locally
1. Fork and clone this repository
2. Run `yarn` to install the dependencies
3. Make code changes
4. Delete `lib` folder if it exists and run `yarn tsc` to compile the TypeScript files in the the `lib` folder.
5. In the `package.json` file of an example app point to the this directory, e.g.```json
"dependencies": {
...
"react-native-kontaktio": "../react-native-kontaktio"
},
```
6. Build and run on a real device### Upgrade to a new version of the Kontakt.io SDK
#### Android
In `build.gradle` file change the version in the following line
```
implementation "io.kontakt.mvn:sdk:7.0.6"
```#### iOS
1. Go to the [Kontakt.io SDK releases page](https://github.com/kontaktio/kontakt-ios-sdk/releases) and download the newest version of **KontaktSDK.framework.zip**.
2. Replace the `ios/KontaktSDK.framework` folder of this library with the `Cocoapods/KontaktSDK/iOS/KontaktSDK.xcframework/ios-arm64_armv7/KontaktSDK.framework` folder which you find in the unzipped folder structure.