react-native-geolocation-service 在调试模式下正常工作,但在发布模式下不工作
Posted
技术标签:
【中文标题】react-native-geolocation-service 在调试模式下正常工作,但在发布模式下不工作【英文标题】:react-native-geolocation-service working perfectly fine in debug mode as expected but not working in release mode 【发布时间】:2021-09-07 05:17:39 【问题描述】:我正在使用 react-native-geolocation-service 包来获取位置。包在调试模式下工作得很好,但在发布 apk 时它的负载并给出错误权限被拒绝。
尝试过的解决方案: 删除节点模块并重新安装 毕业清洁 洗干净 但没有任何效果
import
Alert,
Linking,
Permissionsandroid,
Platform,
ToastAndroid,
DeviceEventEmitter,
from "react-native";
import Geolocation from "react-native-geolocation-service";
import LocationServicesDialogBox from "react-native-android-location-services-dialog-box";
class locationClass
hasPermissionios = async () =>
const openSetting = () =>
Linking.openSettings().catch(() =>
Alert.alert("Unable to open settings");
);
;
const status = await Geolocation.requestAuthorization("whenInUse");
if (status === "granted")
return true;
if (status === "denied")
Alert.alert("Location permission denied");
if (status === "disabled")
Alert.alert(
`Turn on Location Services to allow "$appConfig.displayName" to determine your location.`,
"",
[
text: "Go to Settings", onPress: openSetting ,
text: "Don't Use Location", onPress: () => ,
]
);
return false;
;
hasLocationPermission = async () =>
if (Platform.OS === "ios")
const hasPermission = await hasPermissionIOS();
alert("has ios", hasPermission);
return hasPermission;
// if (Platform.OS === "android")
// return true;
//
const hasPermission = await PermissionsAndroid.check(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
);
console.log("has android", hasPermission);
// if (hasPermission)
// return true;
//
const status = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
);
if (status === PermissionsAndroid.RESULTS.GRANTED)
// ToastAndroid.show(
// "Location permission granted by user.",
// ToastAndroid.LONG
// );
return true;
if (status === PermissionsAndroid.RESULTS.DENIED)
ToastAndroid.show(
"Location permission denied by user.",
ToastAndroid.LONG
);
else if (status === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN)
ToastAndroid.show(
"Location permission revoked by user.",
ToastAndroid.LONG
);
return false;
;
getLocation = async (callback) =>
const hasPermission = await this.hasLocationPermission();
console.log("hasPermission", hasPermission);
if (!hasPermission)
await this.checkiflocationisEnable();
Geolocation.getCurrentPosition(
(position) =>
console.log(position);
callback( isSuccess: true, position );
,
(error) =>
//Alert.alert(`Code $error.code`, error.message);
console.log(error);
callback( isSuccess: false, error );
,
accuracy:
android: "high",
ios: "best",
,
enableHighAccuracy: true,
timeout: 15000,
maximumAge: 3600000,
distanceFilter: 0,
forceRequestLocation: true,
forceLocationManager: true,
showLocationDialog: true,
);
;
checkiflocationisEnable = () =>
if (Platform.OS === "android")
LocationServicesDialogBox.checkLocationServicesIsEnabled(
message:
"<h2></h2> \
wants to access your location to show you available nearby.<br/><br/>\
<br/><br/>",
ok: "YES",
cancel: "NO",
)
.then((response) =>
console.log("response", response);
//locationTracking(dispatch, getState, geolocationSettings);
)
.catch((error) =>
console.log("error", error.message);
);
DeviceEventEmitter.addListener(
"locationProviderStatusChange",
function (status)
// only trigger when "providerListener" is enabled
console.log("status", status); // status => enabled: false, status: "disabled" or enabled: true, status: "enabled"
);
;
const locationServices = new locationClass();
export locationServices ;
包版本
"react-native-geolocation-service": "^5.3.0-beta.2",
"react-native": "0.64.2",
app/build.gradle 文件
apply plugin: "com.android.application"
import com.android.build.OutputFile
/**
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
* and bundleReleaseJsAndAssets).
* These basically call `react-native bundle` with the correct arguments during the Android build
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
* bundle directly from the development server. Below you can see all the possible configurations
* and their defaults. If you decide to add a configuration block, make sure to add it before the
* `apply from: "../../node_modules/react-native/react.gradle"` line.
*
* project.ext.react = [
* // the name of the generated asset file containing your JS bundle
* bundleAssetName: "index.android.bundle",
*
* // the entry file for bundle generation. If none specified and
* // "index.android.js" exists, it will be used. Otherwise "index.js" is
* // default. Can be overridden with ENTRY_FILE environment variable.
* entryFile: "index.android.js",
*
* // https://reactnative.dev/docs/performance#enable-the-ram-format
* bundleCommand: "ram-bundle",
*
* // whether to bundle JS and assets in debug mode
* bundleInDebug: false,
*
* // whether to bundle JS and assets in release mode
* bundleInRelease: true,
*
* // whether to bundle JS and assets in another build variant (if configured).
* // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
* // The configuration property can be in the following formats
* // 'bundleIn$productFlavor$buildType'
* // 'bundleIn$buildType'
* // bundleInFreeDebug: true,
* // bundleInPaidRelease: true,
* // bundleInBeta: true,
*
* // whether to disable dev mode in custom build variants (by default only disabled in release)
* // for example: to disable dev mode in the staging build type (if configured)
* devDisabledInStaging: true,
* // The configuration property can be in the following formats
* // 'devDisabledIn$productFlavor$buildType'
* // 'devDisabledIn$buildType'
*
* // the root of your project, i.e. where "package.json" lives
* root: "../../",
*
* // where to put the JS bundle asset in debug mode
* jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
*
* // where to put the JS bundle asset in release mode
* jsBundleDirRelease: "$buildDir/intermediates/assets/release",
*
* // where to put drawable resources / React Native assets, e.g. the ones you use via
* // require('./image.png')), in debug mode
* resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
*
* // where to put drawable resources / React Native assets, e.g. the ones you use via
* // require('./image.png')), in release mode
* resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
*
* // by default the gradle tasks are skipped if none of the JS files or assets change; this means
* // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
* // date; if you have any other folders that you want to ignore for performance reasons (gradle
* // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
* // for example, you might want to remove it from here.
* inputExcludes: ["android/**", "ios/**"],
*
* // override which node gets called and with what additional arguments
* nodeExecutableAndArgs: ["node"],
*
* // supply additional arguments to the packager
* extraPackagerArgs: []
* ]
*/
project.ext.react = [
enableHermes: false
]
apply from: '../../node_modules/react-native-unimodules/gradle.groovy'
apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/expo-updates/scripts/create-manifest-android.gradle"
/**
* Set this to true to create two separate APKs instead of one:
* - An APK that only works on ARM devices
* - An APK that only works on x86 devices
* The advantage is the size of the APK is reduced by about 4MB.
* Upload all the APKs to the Play Store and people will download
* the correct one based on the CPU architecture of their device.
*/
def enableSeparateBuildPerCPUArchitecture = false
/**
* Run Proguard to shrink the Java bytecode in release builds.
*/
def enableProguardInReleaseBuilds = false
/**
* The preferred build flavor of javascriptCore.
*
* For example, to use the international variant, you can use:
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
*
* The international variant includes ICU i18n library and necessary data
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
* give correct results when using with locales other than en-US. Note that
* this variant is about 6MiB larger per architecture than default.
*/
def jscFlavor = 'org.webkit:android-jsc:+'
/**
* Whether to enable the Hermes VM.
*
* This should be set on project.ext.react and mirrored here. If it is not set
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
* and the benefits of using Hermes will therefore be sharply reduced.
*/
def enableHermes = project.ext.react.get("enableHermes", false);
android
aaptOptions
cruncherEnabled = false
useNewCruncher = false
signingConfigs
release
storeFile file('./dbazzar_app.keystore')
storePassword 'h2b2912'
keyAlias 'com_dbazzar_app'
keyPassword 'h2b2912'
compileSdkVersion rootProject.ext.compileSdkVersion
compileOptions
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
defaultConfig
applicationId 'com.dbazzar.apptwo'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 34
versionName "2.5.2"
multiDexEnabled true
splits
abi
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
buildTypes
debug
signingConfig signingConfigs.debug
minifyEnabled false
debuggable true
release
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.release
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
minifyEnabled true
debuggable false
// useProguard true
zipAlignEnabled true
shrinkResources true
// applicationVariants are e.g. debug, release
applicationVariants.all variant ->
variant.outputs.each output ->
// For each separate APK per architecture, set a unique version code as described here:
// https://developer.android.com/studio/build/configure-apk-splits.html
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) // null for the universal-debug, universal-release variants
output.versionCodeOverride =
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
dependencies
implementation files('/Users/apple/Desktop/ReactNative/dbz2userapp/android/app/libs/paylibrary-release.aar')
def multidex_version = "2.0.1"
implementation "androidx.multidex:multidex:$multidex_version"
implementation fileTree(dir: "libs", include: ["*.jar"])
//noinspection GradleDynamicVersion
implementation 'com.google.android.gms:play-services-location:18.0.0'
implementation 'com.facebook.fresco:fresco:2.0.0'
implementation 'com.facebook.fresco:animated-gif:2.0.0'
implementation project(':react-native-background-timer')
implementation "com.facebook.react:react-native:+" // From node_modules
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
debugImplementation("com.facebook.flipper:flipper:$FLIPPER_VERSION")
exclude group: 'com.facebook.fbjni'
debugImplementation("com.facebook.flipper:flipper-network-plugin:$FLIPPER_VERSION")
exclude group: 'com.facebook.flipper'
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:$FLIPPER_VERSION")
exclude group: 'com.facebook.flipper'
addUnimodulesDependencies()
if (enableHermes)
def hermesPath = "../../node_modules/hermes-engine/android/";
debugImplementation files(hermesPath + "hermes-debug.aar")
releaseImplementation files(hermesPath + "hermes-release.aar")
else
implementation jscFlavor
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy)
from configurations.compile
into 'libs'
task wrapper(type: Wrapper)
gradleVersion = '6.8.3'
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'
【问题讨论】:
【参考方案1】:试试下面的属性:
forceLocationManager: false
【讨论】:
以上是关于react-native-geolocation-service 在调试模式下正常工作,但在发布模式下不工作的主要内容,如果未能解决你的问题,请参考以下文章