Android 에서 react-native-webview (웹뷰) 카드 결제 또는 외부앱 실행하기
1. react-native-send-intent 라이브러리를 이용해 인텐트 호출
- install
npm install react-native-send-intent --save
react-native link react-native-send-intent
2. android/setting.gradle 파일에 아래의 코드를 추가
include ':RNSendIntentModule', ':app'
project(':RNSendIntentModule').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-send-intent/android')
3. android/app/build.gradle 파일에 아래의 코드를 추가
dependencies {
...
compile project(':RNSendIntentModule')
}
4. node_modules/react-native-send-intent/android/src/main/java/com/burnweb/rnsendintent/RNSendIntentModule.java 파일에 아래 소수를 추가한다.
@ReactMethod
public void openAppWithUri(String intentUri, ReadableMap extras, final Promise promise) {
try {
Intent intent = Intent.parseUri(intentUri, Intent.URI_INTENT_SCHEME);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent existPackage = this.reactContext.getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
this.reactContext.startActivity(intent);
} else {
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.setData(Uri.parse("market://details?id="+intent.getPackage()));
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.reactContext.startActivity(marketIntent);
}
promise.resolve(true);
} catch (Exception e) {
promise.resolve(false);
}
}
5. node_modules/react-native-send-intent/index.js 에 아래 소스를 추가한다.
openAppWithUri(intentUri, extras) {
return RNSendIntentAndroid.openAppWithUri(intentUri, extras || {});
}
6. react-native 웹뷰 페이지
안드로이드의 경우 RN webview 내에서 onShouldStartLoadWithRequest 메소드를 이용해 url 바뀔때마다 감지해서 http, https 외의 외부 앱 호출일 경우 react-native-send-intent 등 외부 라이브러리를 이용해 인텐트 호출
import SendIntentAndroid from 'react-native-send-intent';
....
const onNavigationStateChange = (webview) => {
if (webview.url.startsWith('http://') || webview.url.startsWith('https://') || webview.url.startsWith('about:blank')) {
//console.log("url :" + webview.url);
return true;
}
if (Platform.OS === 'android') {
LinkingAndroid.canOpenURL(webview.url).then(res => {
if (res) {
LinkingAndroid.openURL(webview.url);
} else {
SendIntentAndroid.openChromeIntent(webview.url).then(res => {
if (!res) {
console.log('앱 실행에 실패했습니다. 앱이 설치되어있는지 확인하세요');
}
})
}
})
} else {
Linking.openURL(webview.url).catch(err => {
console.log('앱 실행에 실패했습니다. 앱이 설치되어있는지 확인하세요');
});
}
return false;
};
<WebView
source={{uri: "도메인"}}
originWhitelist={['*']}
scrollEnabled={false}
injectedJavaScript={patchPostMessageJsCode}
javaScriptEnabled = {true}
startInLoadingState={true}
onShouldStartLoadWithRequest={(webview) => onNavigationStateChange(webview)} //for iOS
onNavigationStateChange={(webview) => onNavigationStateChange(webview)} //for Android
ref={webview}
/>
'React Native' 카테고리의 다른 글
REACT-NATIVE 안드로이드 웹뷰에서 파일 업로드 카메라 권한 요청 (0) | 2020.11.11 |
---|---|
REACT-NATIVE 인터넷 연결 확인 (0) | 2020.11.09 |
REACT NATIVE FIREBASE 및 FCM을 사용하여 IOS 및 ANDROID에서 사용자 지정 푸시 알림 소리를 추가하는 방법 (0) | 2020.10.26 |
IOS 14 관련 RN 오류 (0) | 2020.09.23 |
RN 빌드 오류] error Android project not found. Are you sure this is a React Native project? (0) | 2020.08.31 |