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