diff --git a/.gitignore b/.gitignore
index a2b47ef..fb422f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -107,7 +107,30 @@ proguard/
# Android Studio captures folder
captures/
-# For Mac
-.DS_STORE
+# OSX
+#
+.DS_Store
+
+# Xcode
+#
+build/
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata
+*.xccheckout
+*.moved-aside
+DerivedData
+*.hmap
+*.ipa
+*.xcuserstate
+project.xcworkspace
+
+Pods/
*.swp
diff --git a/android/.project b/android/.project
deleted file mode 100644
index 3964dd3..0000000
--- a/android/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- android
- Project android created by Buildship.
-
-
-
-
- org.eclipse.buildship.core.gradleprojectbuilder
-
-
-
-
-
- org.eclipse.buildship.core.gradleprojectnature
-
-
diff --git a/android/.settings/org.eclipse.buildship.core.prefs b/android/.settings/org.eclipse.buildship.core.prefs
deleted file mode 100644
index 8c80c93..0000000
--- a/android/.settings/org.eclipse.buildship.core.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-#Thu Nov 30 08:38:54 IST 2017
-connection.project.dir=
diff --git a/android/build.gradle b/android/build.gradle
index 9b5638c..c3fff00 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,22 +1,50 @@
-apply plugin: "com.android.library"
+def safeExtGet(prop, fallback) {
+ rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
+}
+
+buildscript {
+ // The Android Gradle plugin is only required when opening the android folder stand-alone.
+ // This avoids unnecessary downloads and potential conflicts when the library is included as a
+ // module dependency in an application project.
+ if (project == rootProject) {
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath("com.android.tools.build:gradle:3.5.3")
+ }
+ }
+}
+
+apply plugin: 'com.android.library'
android {
- compileSdkVersion 23
- buildToolsVersion "23.0.3"
+ compileSdkVersion safeExtGet('compileSdkVersion', 29)
+ buildToolsVersion safeExtGet('buildToolsVersion', '29.0.2')
defaultConfig {
- minSdkVersion 23
- targetSdkVersion 23
- versionCode 1
- versionName "1.0"
- ndk {
- abiFilters "armeabi-v7a", "x86"
- }
+ minSdkVersion safeExtGet('minSdkVersion', 23)
+ targetSdkVersion safeExtGet('targetSdkVersion', 29)
+
+ consumerProguardFiles 'consumer-rules.pro'
+ }
+ lintOptions {
+ abortOnError false
}
}
-dependencies {
- compile fileTree(dir: "libs", include: ["*.jar"])
- compile "com.android.support:appcompat-v7:23.0.1"
- compile "com.facebook.react:react-native:+" // From node_modules
+
+repositories {
+ mavenLocal()
+ jcenter()
+ maven {
+ // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
+ url "$projectDir/../../../node_modules/react-native/android"
+ }
+ google()
}
+dependencies {
+ implementation "com.facebook.react:react-native:+"
+}
diff --git a/android/consumer-rules.pro b/android/consumer-rules.pro
new file mode 100644
index 0000000..6b5cb0f
--- /dev/null
+++ b/android/consumer-rules.pro
@@ -0,0 +1 @@
+-dontwarn com.himelbrand.ble.peripheral.**
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index b5166da..0000000
Binary files a/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index dbdc05d..0000000
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/android/gradlew b/android/gradlew
deleted file mode 100755
index 91a7e26..0000000
--- a/android/gradlew
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched.
-if $cygwin ; then
- [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-fi
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >&-
-APP_HOME="`pwd -P`"
-cd "$SAVED" >&-
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/android/gradlew.bat b/android/gradlew.bat
deleted file mode 100644
index aec9973..0000000
--- a/android/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index c0b5047..55e1e1b 100644
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -2,4 +2,8 @@
package="com.himelbrand.ble.peripheral">
+
+
+
+
diff --git a/android/src/main/java/com/himelbrand/ble/peripheral/RNBLEModule.java b/android/src/main/java/com/himelbrand/ble/peripheral/RNBLEModule.java
index 71a5f60..21d5ff3 100644
--- a/android/src/main/java/com/himelbrand/ble/peripheral/RNBLEModule.java
+++ b/android/src/main/java/com/himelbrand/ble/peripheral/RNBLEModule.java
@@ -4,7 +4,6 @@
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattDescriptor;
import android.bluetooth.BluetoothGattServer;
import android.bluetooth.BluetoothGattServerCallback;
import android.bluetooth.BluetoothGattService;
@@ -13,73 +12,68 @@
import android.bluetooth.le.AdvertiseData;
import android.bluetooth.le.AdvertiseSettings;
import android.bluetooth.le.BluetoothLeAdvertiser;
-import android.bluetooth.le.BluetoothLeScanner;
-import android.bluetooth.le.ScanCallback;
-import android.bluetooth.le.ScanFilter;
-import android.bluetooth.le.ScanResult;
-import android.bluetooth.le.ScanSettings;
import android.content.Context;
-import android.os.Bundle;
-import android.os.Handler;
+import android.os.Build;
import android.os.ParcelUuid;
-import android.support.v7.app.AppCompatActivity;
-import android.text.TextUtils;
+import androidx.annotation.NonNull;
import android.util.Log;
-
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-
-
-import android.content.Intent;
-import android.net.Uri;
-import android.widget.Toast;
-
+import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.NativeModule;
+import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
-import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
-import com.facebook.react.common.MapBuilder;
-import com.facebook.react.bridge.Promise;
-import com.facebook.react.bridge.WritableMap;
-import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableArray;
+import com.facebook.react.bridge.WritableMap;
-
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.UUID;
/**
* {@link NativeModule} that allows JS to open the default browser
* for an url.
*/
public class RNBLEModule extends ReactContextBaseJavaModule{
+ public static final String ERROR_BLUETOOTH_POWERED_OFF = "BluetoothPoweredOff";
+
+ private final ReactApplicationContext reactContext;
+ private final Context context;
- ReactApplicationContext reactContext;
- HashMap servicesMap;
- HashSet mBluetoothDevices;
- BluetoothManager mBluetoothManager;
- BluetoothAdapter mBluetoothAdapter;
- BluetoothGattServer mGattServer;
- BluetoothLeAdvertiser advertiser;
- AdvertiseCallback advertisingCallback;
- String name;
- boolean advertising;
- private Context context;
+ private final BluetoothManager mBluetoothManager;
+ private final BluetoothAdapter mBluetoothAdapter;
+
+ private final HashMap servicesMap;
+ private HashSet mBluetoothDevices;
+ private BluetoothGattServer mGattServer;
+ private BluetoothLeAdvertiser advertiser;
+ private AdvertiseCallback advertisingCallback;
+ private String name;
+ private boolean advertising;
public RNBLEModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
this.context = reactContext;
- this.servicesMap = new HashMap();
+ this.servicesMap = new HashMap<>();
this.advertising = false;
this.name = "RN_BLE";
+
+ mBluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
+ mBluetoothAdapter = mBluetoothManager.getAdapter();
+ }
+
+ @ReactMethod
+ public void isAdvertisementSupported(@NonNull Promise promise) {
+ if (!mBluetoothAdapter.isEnabled()) {
+ promise.reject(ERROR_BLUETOOTH_POWERED_OFF, "Enable Bluetooth to perform a check");
+ return;
+ }
+ final boolean supported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+ && mBluetoothAdapter.isMultipleAdvertisementSupported();
+ promise.resolve(supported);
}
@Override
@@ -164,8 +158,6 @@ public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId,
@ReactMethod
public void start(final Promise promise){
- mBluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
- mBluetoothAdapter = mBluetoothManager.getAdapter();
mBluetoothAdapter.setName(this.name);
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
@@ -227,7 +219,7 @@ public void stop(){
public void sendNotificationToDevices(String serviceUUID,String charUUID,ReadableArray message) {
byte[] decoded = new byte[message.size()];
for (int i = 0; i < message.size(); i++) {
- decoded[i] = new Integer(message.getInt(i)).byteValue();
+ decoded[i] = Integer.valueOf(message.getInt(i)).byteValue();
}
BluetoothGattCharacteristic characteristic = servicesMap.get(serviceUUID).getCharacteristic(UUID.fromString(charUUID));
characteristic.setValue(decoded);
diff --git a/android/src/main/java/com/himelbrand/ble/peripheral/RNBLEPackage.java b/android/src/main/java/com/himelbrand/ble/peripheral/RNBLEPackage.java
index c6dd678..8f5a701 100644
--- a/android/src/main/java/com/himelbrand/ble/peripheral/RNBLEPackage.java
+++ b/android/src/main/java/com/himelbrand/ble/peripheral/RNBLEPackage.java
@@ -5,6 +5,7 @@
import java.util.List;
import com.facebook.react.ReactPackage;
+import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
@@ -13,9 +14,8 @@
public class RNBLEPackage implements ReactPackage {
@Override
- public List createNativeModules(
- ReactApplicationContext reactContext) {
- List modules = new ArrayList();
+ public List createNativeModules(ReactApplicationContext reactContext) {
+ List modules = new ArrayList<>();
modules.add(new RNBLEModule(reactContext));
return modules;
}
@@ -24,4 +24,4 @@ public List createNativeModules(
public List createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
-}
\ No newline at end of file
+}
diff --git a/index.d.ts b/index.d.ts
index ac324da..8a59e89 100644
--- a/index.d.ts
+++ b/index.d.ts
@@ -15,4 +15,5 @@ declare module "react-native-ble-peripheral" {
function stop(): void;
function setName(name: string): void;
function isAdvertising(): Promise;
+ function isAdvertisementSupported(): Promise;
}
diff --git a/ios/RNBLEPeripheral.m b/ios/RNBLEPeripheral.m
index 61e3bc6..0e55353 100644
--- a/ios/RNBLEPeripheral.m
+++ b/ios/RNBLEPeripheral.m
@@ -11,6 +11,11 @@ @interface RCT_EXTERN_MODULE(BLEPeripheral, RCTEventEmitter)
(RCTPromiseResolveBlock)resolve
rejecter: (RCTPromiseRejectBlock)reject
)
+RCT_EXTERN_METHOD(
+ isAdvertisementSupported:
+ (RCTPromiseResolveBlock)resolve
+ rejecter: (RCTPromiseRejectBlock)reject
+)
RCT_EXTERN_METHOD(
setName: (NSString *)string
)
diff --git a/ios/RNBLEPeripheral.swift b/ios/RNBLEPeripheral.swift
index 27c5925..98e9d33 100644
--- a/ios/RNBLEPeripheral.swift
+++ b/ios/RNBLEPeripheral.swift
@@ -12,25 +12,30 @@ class BLEPeripheral: RCTEventEmitter, CBPeripheralManagerDelegate {
var manager: CBPeripheralManager!
var startPromiseResolve: RCTPromiseResolveBlock?
var startPromiseReject: RCTPromiseRejectBlock?
-
+
override init() {
super.init()
manager = CBPeripheralManager(delegate: self, queue: nil, options: nil)
print("BLEPeripheral initialized, advertising: \(advertising)")
}
-
+
//// PUBLIC METHODS
+ @objc func isAdvertisementSupported(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
+ resolve(true)
+ print("called isAdvertisementSupported")
+ }
+
@objc func setName(_ name: String) {
self.name = name
print("name set to \(name)")
}
-
+
@objc func isAdvertising(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
resolve(advertising)
print("called isAdvertising")
}
-
+
@objc(addService:primary:)
func addService(_ uuid: String, primary: Bool) {
let serviceUUID = CBUUID(string: uuid)
@@ -44,7 +49,7 @@ class BLEPeripheral: RCTEventEmitter, CBPeripheralManagerDelegate {
alertJS("service \(uuid) already there")
}
}
-
+
@objc(addCharacteristicToService:uuid:permissions:properties:data:)
func addCharacteristicToService(_ serviceUUID: String, uuid: String, permissions: UInt, properties: UInt, data: String) {
let characteristicUUID = CBUUID(string: uuid)
@@ -55,13 +60,13 @@ class BLEPeripheral: RCTEventEmitter, CBPeripheralManagerDelegate {
servicesMap[serviceUUID]?.characteristics?.append(characteristic)
print("added characteristic to service")
}
-
+
@objc func start(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
if (manager.state != .poweredOn) {
alertJS("Bluetooth turned off")
return;
}
-
+
startPromiseResolve = resolve
startPromiseReject = reject
@@ -71,7 +76,7 @@ class BLEPeripheral: RCTEventEmitter, CBPeripheralManagerDelegate {
] as [String : Any]
manager.startAdvertising(advertisementData)
}
-
+
@objc func stop() {
manager.stopAdvertising()
advertising = false
@@ -98,7 +103,7 @@ class BLEPeripheral: RCTEventEmitter, CBPeripheralManagerDelegate {
alertJS("service \(serviceUUID) does not exist")
}
}
-
+
//// EVENTS
// Respond to Read request
@@ -175,7 +180,7 @@ class BLEPeripheral: RCTEventEmitter, CBPeripheralManagerDelegate {
startPromiseResolve!(advertising)
print("advertising succeeded!")
}
-
+
//// HELPERS
func getCharacteristic(_ characteristicUUID: CBUUID) -> CBCharacteristic? {
@@ -229,7 +234,7 @@ class BLEPeripheral: RCTEventEmitter, CBPeripheralManagerDelegate {
override func startObserving() { hasListeners = true }
override func stopObserving() { hasListeners = false }
@objc override static func requiresMainQueueSetup() -> Bool { return false }
-
+
}
@available(iOS 10.0, *)
diff --git a/react-native-ble-peripheral.podspec b/react-native-ble-peripheral.podspec
new file mode 100644
index 0000000..bb4c143
--- /dev/null
+++ b/react-native-ble-peripheral.podspec
@@ -0,0 +1,19 @@
+require 'json'
+
+package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
+
+Pod::Spec.new do |s|
+ s.name = package['name']
+ s.version = package['version']
+ s.summary = package['description']
+ s.license = package['license']
+
+ s.authors = package['author']
+ s.homepage = package['homepage']
+ s.platform = :ios, "9.0"
+
+ s.source = { :git => "https://github.com/himelbrand/react-native-ble-peripheral.git", :tag => "v#{s.version}" }
+ s.source_files = "ios/**/*.{h,m,swift}"
+
+ s.dependency 'React'
+end