@erin-living/erinsdk-ttlock
v2.0.0
Published
TTLock provider package for @erin-living/erinsdk-core
Keywords
Readme
@erin-living/erinsdk-ttlock
TTLock BLE provider plugin for @erin-living/erinsdk-core.
Install
npm install @erin-living/erinsdk-ttlock @erin-living/erinsdk-corereact-native-ttlock is a direct dependency — it auto-links on iOS and Android when your project runs pod install / Gradle sync.
iOS setup
cd ios && pod installAdd Bluetooth permissions to your Info.plist:
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Required to communicate with TTLock smart locks via BLE.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Required to communicate with TTLock smart locks via BLE.</string>Android setup
AndroidManifest.xml
<!-- Root <manifest> tag — add tools namespace -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- Application tag — suppress label merge conflict -->
<application
...
tools:replace="android:label">
<!-- Permissions -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Android 12+ (API 31+) -->
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />MainActivity.java
Override onRequestPermissionsResult so the TTLock SDK receives permission results:
import com.reactnativettlock.TtlockModule;
import com.facebook.react.ReactInstanceManager;
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
ReactInstanceManager mgr = getReactNativeHost().getReactInstanceManager();
TtlockModule module = mgr.getCurrentReactContext().getNativeModule(TtlockModule.class);
if (module != null) {
module.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}Disable ProGuard in release builds (android/app/build.gradle)
buildTypes {
release {
minifyEnabled false
shrinkResources false
}
}Usage
import { init, register } from '@erin-living/erinsdk-core';
import { createErinSdkTtlockPlugin } from '@erin-living/erinsdk-ttlock';
// Once at app startup
init();
const ttlock = await register(createErinSdkTtlockPlugin());
// Unlock a door (deviceId = lockData string from TTLock initLock)
const result = await ttlock.access.unlock({ deviceId: lockData });
// result = { ok: true, deviceId }
// Create a passcode (label = 4–9 digit passcode string)
const key = await ttlock.credentials.createKey({
label: '1234',
deviceId: lockData,
startDate: Date.now(),
endDate: Date.now() + 7 * 24 * 60 * 60 * 1000, // 1 week
});
// key = { keyId: '1234' }
// Query lock status (BLE ping)
const status = await ttlock.monitoring.getStatus({ deviceId: lockData });
// status = { online: true, deviceId }What is lockData?
lockData is an opaque string returned by TTLock's initLock during device pairing. Store it per-device in your app's secure storage and pass it as deviceId to all ErinSDK domain calls.
Lock state events
const unsubscribe = ttlock.events.subscribe('access.lockStateChanged', (evt) => {
console.log(evt.deviceId, evt.lockState); // 'unlocked'
});
// Events are emitted after a successful ttlock.access.unlock call.
unsubscribe();
// When the provider is no longer needed
await ttlock.unregister();Supported capabilities
| Capability | Status |
|---|---|
| access.unlock | BLE via react-native-ttlock |
| credentials.createKey | BLE passcode via react-native-ttlock |
| monitoring.getStatus | BLE battery query via react-native-ttlock |
| intercom.call | Not supported by TTLock SDK |
Minimum OS / SDK
- iOS 15.1+, Android API 24+
- React Native 0.79+
- Follows
react-native-ttlockvendor-documented TLS minimums for any cloud operations
Security
Long-lived lock credentials (lockData) must be stored in platform secure storage (Keychain / Keystore). Do not log lockData or pass it through console.log in production.
Transport: all TTLock cloud operations go through HTTPS endpoints at euopen.ttlock.com (EU) / api.sciener.com (global). BLE operations are local-only.
See Security & privacy for the full posture.
Note for npm package page readers: the
../../docspath above is a repo-relative link and does not resolve on npmjs.com. Canonical URL: https://github.com/erinapp/erinsdk-monorepo/blob/main/docs/security-and-privacy.md
