반응형

이번에는 Fat Static Library만드는 작업을 스크립트로 처리하여 자동화 처리하는 방법입니다.

 

Fat Static Library(이하 Fat 라이브러리) 빌드 자동화  스크립트 사용 방법

1. Xcode의 Build Phases에서 스크립트 추가

2. 아래 스크립트 내용을 붙여넣기 한다.

##############################################

#

# Fat static library

#

# Automatically create cross-platform (simulator + device) 

# static libraries for Objective C / iPhone / iPad.

#

# added by netcanis 2018.10.26 

#############################################

set -e

set -o pipefail



# Get BaseSdk version

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '\d\{1,2\}\.\d\{1,2\}$')



# Get build type (Device or Simulator).

if [ ${PLATFORM_NAME} = "iphonesimulator" ]

then

OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}

else

OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}

fi



if [ "true" == ${ALREADYINVOKED:-false} ]

then

echo "RECURSION"

exit 0;

fi





# Building

export ALREADYINVOKED="true"



xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"



ACTION="build"



CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos

CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator

CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal



# Remove previous build floder.

rm -rf "${CREATING_UNIVERSAL_DIR}"

mkdir "${CREATING_UNIVERSAL_DIR}"



# Make universal static library.

xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"



echo "Build complete!"

 

3. 빌드 설정을 ‘Release’로 설정한 후 빌드.

 

4. 빌드시 스크립트를 통해 디바이스와 시뮬레이터 빌드를 하며 ‘Release-universal’폴더에
두 빌드에 대한 Fat 라이브러리를 생성하여 준다.

5. ‘Release-universal’ 폴더에 생성된 Fat라이브러리 ‘libXXX.a’를 배포한다.

 

주의 : 빌드시 적용이 안될 경우 시뮬레이터 빌드를 한번 실행한 뒤 다시 시도해 봅니다.

 

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환

2020/08/11 - [iOS/Swift] - WKWebView 화면 출력 완료 이벤트

2020/08/06 - [iOS/Tips] - 개발관련 폴더 경로

2020/07/19 - [Android/Tips] - 안드로이드 원격 디버깅 방법

2020/07/18 - [Android/Tips] - Cannot convert string value 'JETPACK_COMPOSE' to an enum value of type 'com.android.builder.model.AndroidGradlePluginProjectFlags$BooleanFlag' (valid case insensitive values: APPLICATION_R_CLASS_CONSTANT_IDS, TEST_R_CLASS_CONSTANT_IDS, TRANSITIVE_R_CLASS)

2020/07/18 - [Android/Tips] - OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

2020/07/17 - [iOS/Tips] - 웹에서 iOS 앱 설치여부 체크

반응형

'개발 > iOS' 카테고리의 다른 글

UIViewController 스위칭  (0) 2020.12.11
웹뷰에서 javascript 함수 동기식 호출  (0) 2020.12.10
Fat Static Library 빌드 (1/2)  (1) 2020.12.10
Custom UserAgent 설정  (0) 2020.12.10
CocoaPods 설치 및 제거  (0) 2020.12.10
블로그 이미지

SKY STORY

,
반응형

정적라이브러리 생성후 배포 시 시뮬레이터로 작업하는 프로젝트의 경우 라이브러리에 해당 아키텍쳐가 포함되어있지 않아 실행할 수 없는 상황이 발생하곤 합니다. 이럴경우 생성된 정적라이브러리에 해당 아키텍처를 포함시켜줄 수 있습니다.

아래의 과정은 배포하는 정적라이브러리를 사용하는 프로젝트에서 시뮬레이터 빌드가 가능하도록 Fat Static Library를 생성하는 방법입니다.

Fat Static Library(이하 Fat 라이브러리) 생성 순서

1. Device 용 빌드
빌드 패스에 ’Release-iphoneos’ 폴더에  저장 됨.

2. Simulator 용 빌드
빌드 패스에 ’Release-iphonesimulator’ 폴더에 저장 됨.

3. Xcode 메뉴에서 Project Seettings… 창을 열면 아래와 같이 빌드 디렉토리 경로를 볼 수 있다.

 

4. 또는 Xcode 의 Project Navigator 에서 Products에 빌드된 파일로 빌드된 디렉토리를 확인할 수 있다.

5. 위 4번 파일을 이용하여 빌드된 디렉토리로 이동하면 다음과 같다.

6. 빌드된 라이브러리 파일을 Device, Simulator에 따라 파일이름을 각각 ‘libXXXD.a’, ‘libXXXS.a’로 바꿔 Desktop에 복사한다.

7. 콘솔창을 띄워 Desktop폴더로 이동

cd ~/Desktop

8. 콘솔창에서 lipo명령을 통해 Device와 Simulator 로 빌드된 두 라이브러리를 합친다. 

lipo -create ./libXXXD.a ./libXXXS.a -output ./libXXX.a

9. 8번에서 생성된 Fat 라이브러리 Architectures 를 확인 하도록 한다.
lipo -I libXXX.a

10. 9 결과가 Device 아키텍쳐(armv7, arm64, armv7s) Simulator 아키텍쳐(i386, x86_64)
포함되었다면 정상이므로 ‘libXXX.a’ 배포하도록 한다.

 

 

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환

2020/08/11 - [iOS/Swift] - WKWebView 화면 출력 완료 이벤트

2020/08/06 - [iOS/Tips] - 개발관련 폴더 경로

2020/07/19 - [Android/Tips] - 안드로이드 원격 디버깅 방법

2020/07/18 - [Android/Tips] - Cannot convert string value 'JETPACK_COMPOSE' to an enum value of type 'com.android.builder.model.AndroidGradlePluginProjectFlags$BooleanFlag' (valid case insensitive values: APPLICATION_R_CLASS_CONSTANT_IDS, TEST_R_CLASS_CONSTANT_IDS, TRANSITIVE_R_CLASS)

2020/07/18 - [Android/Tips] - OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

2020/07/17 - [iOS/Tips] - 웹에서 iOS 앱 설치여부 체크

반응형

'개발 > iOS' 카테고리의 다른 글

웹뷰에서 javascript 함수 동기식 호출  (0) 2020.12.10
Fat Static Library 빌드 (2/2)  (0) 2020.12.10
Custom UserAgent 설정  (0) 2020.12.10
CocoaPods 설치 및 제거  (0) 2020.12.10
Clang diagnostic 경고 무시하기  (0) 2020.12.10
블로그 이미지

SKY STORY

,

Custom UserAgent 설정

개발/iOS 2020. 12. 10. 15:21
반응형
//--------------------------------------------------------
/// WKWebView (type 1 - Objective C)
WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:CGRectZero];
[wkWebView loadHTMLString:@"<html></html>" baseURL:nil];
[wkWebView evaluateJavaScript:@"navigator.appName" completionHandler:^(id __nullable appName, NSError * __nullable error) {
    NSLog(@"%@", appName);
}];

[wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id __nullable userAgent, NSError * __nullable error) {
    NSLog(@"%@", userAgent);
    // iOS 8.3
    // Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12F70
    // iOS 9.0
    // Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.32 (KHTML, like Gecko) Mobile/13A4254v
    // Custom UserAgent
    NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
    NSString *newUserAgent = [NSString stringWithFormat:@"%@ %@", userAgent, appName];
    if (@available(iOS 9.0, *)) {
        wkWebView.customUserAgent = newUserAgent;
    } else {
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
        [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
    }
}];

//--------------------------------------------------------
/// WKWebView (type 2 - Objective C)
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.applicationNameForUserAgent = @"My Custom Useragent Name";
WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
NSLog(@"%@", wkWebView.configuration.applicationNameForUserAgent); // My Custom Useragent Name
NSLog(@"%@", wkWebView.customUserAgent); // null
[wkWebView loadHTMLString:@"<html></html>" baseURL:nil];
[wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id __nullable userAgent, NSError * __nullable error) {
    NSLog(@"%@", userAgent);
    // iOS 9
    // Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.32 (KHTML, like Gecko) My Custom Useragent Name
}];

//--------------------------------------------------------
/// WKWebView (type 1 - Swift) Available: iOS 9+
wkWebView.evaluateJavaScript("navigator.userAgent") {
    [weak webView] (result, error) in
if let webView = webView, let userAgent = result as? String {
    webView.customUserAgent = userAgent + "/Custom Agent"
} }

//--------------------------------------------------------
/// WKWebView (type 1 - Swift) Available: iOS 9+
let webConfiguration = WKWebViewConfiguration()
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.customUserAgent = "ExampleApp/1.0 (iPhone)"

//--------------------------------------------------------
/// WKWebView (type 2 - Swift) Available: iOS 9+
/// Append to the default User Agent
let webConfiguration = WKWebViewConfiguration()
webConfiguration.applicationNameForUserAgent = "ExampleApp/1.0 (iPhone)"
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
// Mozilla/5.0 (iPhone; CPU iPhone OS 11_2 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) ExampleApp/1.0 (iPhone)
 
//--------------------------------------------------------
/// UIWebView (Objective C)
UIWebView *webView = [[UIWebView alloc] init];
[webView loadHTMLString:@"<html></html>" baseURL:nil];
NSString *appName = [webView stringByEvaluatingJavaScriptFromString:@"navigator.appName"];
NSLog(@"%@", appName);
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"%@", userAgent);
// iOS 8.3
// Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12F70
// iOS 9.0
// Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.32 (KHTML, like Gecko) Mobile/13A4254v}

// Custom UserAgent
NSString *newUserAgent = [NSString stringWithFormat:@"%@ %@", userAgent, appName];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

//--------------------------------------------------------
/// UIWebView (Swift) Available: iOS 9+
webView.customUserAgent = (UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent") ?? "") + "/Custom agent"



//--------------------------------------------------------
//--------------------------------------------------------
/// Example :

// UIWebView
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
NSString *newUserAgent = [NSString stringWithFormat:@"%@ %@", userAgent, appName];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

// WKWebView
WKWebView *wkWebView = [[WKWebView alloc]initWithFrame:CGRectZero];
[wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id userAgent, NSError *error) {
    NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
    NSString *newUserAgent = [NSString stringWithFormat:@"%@ %@", userAgent, appName];
    if (@available(iOS 9.0, *)) {
        wkWebView.customUserAgent = newUserAgent;
    } else {
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
        [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
    }
}];

 

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환

2020/08/11 - [iOS/Swift] - WKWebView 화면 출력 완료 이벤트

2020/08/06 - [iOS/Tips] - 개발관련 폴더 경로

2020/07/19 - [Android/Tips] - 안드로이드 원격 디버깅 방법

2020/07/18 - [Android/Tips] - Cannot convert string value 'JETPACK_COMPOSE' to an enum value of type 'com.android.builder.model.AndroidGradlePluginProjectFlags$BooleanFlag' (valid case insensitive values: APPLICATION_R_CLASS_CONSTANT_IDS, TEST_R_CLASS_CONSTANT_IDS, TRANSITIVE_R_CLASS)

2020/07/18 - [Android/Tips] - OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

2020/07/17 - [iOS/Tips] - 웹에서 iOS 앱 설치여부 체크

2020/07/14 - [Android/Tips] - 웹에서 안드로이드 앱을 실행 (Custom URL Scheme)

2020/07/11 - [OS/Mac OS X] - SMC(System Management Controller) 재설정

반응형

'개발 > iOS' 카테고리의 다른 글

Fat Static Library 빌드 (2/2)  (0) 2020.12.10
Fat Static Library 빌드 (1/2)  (1) 2020.12.10
CocoaPods 설치 및 제거  (0) 2020.12.10
Clang diagnostic 경고 무시하기  (0) 2020.12.10
WKWebView 화면 출력 완료 이벤트  (0) 2020.08.11
블로그 이미지

SKY STORY

,
반응형

스마트폰 BTC 채굴앱

https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site

 

 CocoaPods 설치
sudo gem install cocoapods

 CocoaPods 설정 pod setup

 버전 확인 pod —version

 CocoaPods 제거
sudo gem uninstall cocoapods
sudo gem uninstall cocoapods-core
sudo gem uninstall cocoapods-downloader sudo gem uninstall cocoapods-deintegrate sudo gem uninstall cocoapods-plugins sudo gem uninstall cocoapods-search sudo gem uninstall cocoapods-stats
sudo gem uninstall cocoapods-trunk
sudo gem uninstall cocoapods-try

 설치된 cocoapods 리스트 보기 gem list --local | grep cocoapods

 특정버전 제거
sudo gem uninstall cocoapods -v 0.20.2

 최신안정버전설치
sudo gem install cocoapods

 특정버전설치
sudo gem install cocoapods -v 0.38.0

 최신프리뷰버전설치
gem install cocoapods --pre

 

스마트폰 BTC 채굴앱

https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site

 

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환

2020/08/11 - [iOS/Swift] - WKWebView 화면 출력 완료 이벤트

2020/08/06 - [iOS/Tips] - 개발관련 폴더 경로

2020/07/19 - [Android/Tips] - 안드로이드 원격 디버깅 방법

2020/07/18 - [Android/Tips] - Cannot convert string value 'JETPACK_COMPOSE' to an enum value of type 'com.android.builder.model.AndroidGradlePluginProjectFlags$BooleanFlag' (valid case insensitive values: APPLICATION_R_CLASS_CONSTANT_IDS, TEST_R_CLASS_CONSTANT_IDS, TRANSITIVE_R_CLASS)

2020/07/18 - [Android/Tips] - OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

2020/07/17 - [iOS/Tips] - 웹에서 iOS 앱 설치여부 체크

2020/07/14 - [Android/Tips] - 웹에서 안드로이드 앱을 실행 (Custom URL Scheme)

2020/07/11 - [OS/Mac OS X] - SMC(System Management Controller) 재설정

반응형

'개발 > iOS' 카테고리의 다른 글

Fat Static Library 빌드 (1/2)  (1) 2020.12.10
Custom UserAgent 설정  (0) 2020.12.10
Clang diagnostic 경고 무시하기  (0) 2020.12.10
WKWebView 화면 출력 완료 이벤트  (0) 2020.08.11
개발관련 폴더 경로  (0) 2020.08.06
블로그 이미지

SKY STORY

,
반응형

https://clang.llvm.org/docs/DiagnosticsReference.html http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

컴파일 및 배포를 해도 상관은 없지만 Xcode Server에서 경고 메시지가 하나 이상 있다면 실패로 처리된다.
그래서 강제로 경고를 무시하게 할 필요가 있다.

다음과 같이 선언하면 경고를 무시할 수 있다.

#pragma clang diagnostic push
#pragma clang diagnostic ignored "
경고가 발생하는 원인" // your code

#pragma clang diagnostic pop

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations" // your 
code

#pragma clang diagnostic pop

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar" // your code

#pragma GCC diagnostic pop

ex)
// 
로컬 선언을 사용하지 않으려면 인스턴스 변수를 숨김
#pragma clang diagnostic ignored "-Wshadow-ivar"
#pragma clang diagnostic ignored "-Wmismatched-return-types" #pragma clang diagnostic ignored "-Woverriding-method-mismatch" // 
폐기된 함수 또는 변수를 사용한 경우
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// Extension 
및 부모 클래스에서 미리 selector를 사용하여 구현을 한 경우 #pragma clang diagnostic ignored "-Wundeclared-selector"

 

반응형

'개발 > iOS' 카테고리의 다른 글

Custom UserAgent 설정  (0) 2020.12.10
CocoaPods 설치 및 제거  (0) 2020.12.10
WKWebView 화면 출력 완료 이벤트  (0) 2020.08.11
개발관련 폴더 경로  (0) 2020.08.06
웹에서 iOS 앱 설치여부 체크  (0) 2020.07.17
블로그 이미지

SKY STORY

,

Bluetooth UUID

개발/Note 2020. 12. 10. 13:31
반응형

블루투스의 UUID

  • 범용 고유 번호(Universally Unique IDentifiers) 라고 불리며, 128 비트의 숫자들을 조합한다.
  • 범용적으로 사용할 수 있는 고유의 ID를 사용하기 위해 생성되며, 그렇기 때문에 128 비트의 HEX 조합 unique 하여야 한다.
  • Bluetooth 에서는 device에서 제공하는 service를 검색하여 각 service 마다 UUID 를 부여하는등 많은 부분에서 사용된다.

 

UUID의 구성 요소

[time low] - [time mid] - [time high and version] - [clock seq_hi and reserved] - [clock seq low node]

ex) 000011001-0000-1000-8000-00805F9B34FB

  • time low : 타임 스탬프(시간표시) 의 최하위 32 비트.
  • 블루투스 device 끼리 통신을 하기 위해서 소켓 생성시 UUID 가 필요한데 이는 해당 프로토콜의 의미 한다.
  • 안드로이드 플랫폼의 단말기끼리는 어떤 UUID를 사용하여도 되지만 특정 프로토콜의 device에 접근하 기 위해서는 각각의 프로토콜 UUID 를 사용하여만 한다.

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

메모리 덤프를 해결하는 방법에 대해 간단히 팁을 알려드립니다.

메모리 덤프는 실시간이 아니라 특정 시점에 사용중인 메모리를 덤프 하는 것입니다.

그렇기 때문에 메모리를 사용하고나서 바로 사용한 메모리 공간을 초기화 시켜주면 덤프 시 해당 메모리 내용을 볼 수 없게 됩니다.

하지만 현실은 그렇게 쉽지 않죠.. c/c++로 직접 메모리를 제어할 경우 사용한 메모리 초기화하고 제거하면 되겠지만 언어 자체가 메모리를 알아서 관리해 주다보니 제어하기 쉽지 않죠.

해결 방법은 메모리를 생성하여 해당 메모리 내용을 치환하면 됩니다.

예를들어 메모리 버퍼를 생성하고 "ABC12"라는 내용이 할당하였다고 할때 다음과 같이 특수문자로 치환합니다.

'A'->'{', 'B'->'}', 'C'-'>', '1'->'[', '2'->']'

해당 메모리 사용 후 생성된 버퍼를 '0'으로 모두 채워주면 덤프로 해당 내용이 특수문자로 나오거나 빈값으로 처리 됩니다.

물론 원본 데이터를 사용해야 할 경우 로컬 변수로 버퍼를 생성하고 치환된 데이터를 메모리 카피하여

다시 정해진 룰에 따라 치환하여 원본 데이터를 사용하고 생성된 로컬변수는 다시 '0'으로 채워줍니다.

재밌게도 메모리에 다른값을 할당하지 않고 replace 함수로 치환하게 되면 딥 메모리 카피가 일어나지 않고

해당 메모리 실제 데이터 값만 변경이 이루어져 덤프 이슈를 해결할 수 있습니다.

 

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환

2020/08/11 - [iOS/Swift] - WKWebView 화면 출력 완료 이벤트

2020/08/06 - [iOS/Tips] - 개발관련 폴더 경로

2020/07/19 - [Android/Tips] - 안드로이드 원격 디버깅 방법

2020/07/18 - [Android/Tips] - Cannot convert string value 'JETPACK_COMPOSE' to an enum value of type 'com.android.builder.model.AndroidGradlePluginProjectFlags$BooleanFlag' (valid case insensitive values: APPLICATION_R_CLASS_CONSTANT_IDS, TEST_R_CLASS_CONSTANT_IDS, TRANSITIVE_R_CLASS)

2020/07/18 - [Android/Tips] - OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

2020/07/17 - [iOS/Tips] - 웹에서 iOS 앱 설치여부 체크

2020/07/14 - [Android/Tips] - 웹에서 안드로이드 앱을 실행 (Custom URL Scheme)

2020/07/11 - [OS/Mac OS X] - SMC(System Management Controller) 재설정

2020/07/11 - [OS/Mac OS X] - NVRAM(PRAM) 재설정 방법

2020/07/11 - [iOS/Swift] - Dictionary sort

2020/07/11 - [iOS/Swift] - UTC시간, Locale시간 변경

2020/07/11 - [iOS/Swift] - SEED 블록암호 알고리즘 CBC (Cipher Block Chaining) 예제2

반응형

'개발 > Note' 카테고리의 다른 글

특수문자 발음  (0) 2020.12.11
Bluetooth UUID  (0) 2020.12.10
Android, iOS 앱 설치여부 체크 및 스토어 이동  (0) 2020.12.08
SMC(System Management Controller) 재설정  (0) 2020.07.11
NVRAM(PRAM) 재설정 방법  (0) 2020.07.11
블로그 이미지

SKY STORY

,
반응형

스마트폰 BTC 채굴앱
https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site

 

모바일 웹 페이지에서 스마트폰의 특정앱이 설치되어 있을 경우 앱을 실행하고
그렇지 않으면 스토어로 이동 시켜야 하는 경우 다음과 같이 처리하여 해결할 수 있다.

 

Android :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.mytest.mypackageid">
	...
</manifest>

<application>
	....
	<activity
		...
		<intent-filter>
			...
			<data android:host="action" android:scheme="myScheme" />
		</intent-filter>
	</activity>
    ....
</application>
방법 1:
location.href = "Intent://action#Intent;scheme=myscheme;package=com.mytest.mypackageid;end";

방법 2:
location.href = "https://play.google.com/store/apps/details?id=com.mytest.mypackageid";

 

참고 자료 :

https://developer.chrome.com/multidevice/android/intents

 

Android Intents with Chrome - Google Chrome

Chrome Extend the Browser What are Extensions? Get Started Tutorial Overview Manifest Format Manage Events Design User Interface Content Scripts Declare Permissions and Warn Users Give Users Options Developer Guide Reach Peak Performance Protect User Priva

developer.chrome.com

 

iOS :

//
// 방법 1 : Timer 이용한 방법
//
function openAppOrStore() {
	var timeout = setTimeout(function () { 
    	window.location = "https://itunes.apple.com/app/id123456789"; 
	}, 25);
	window.location = "myappscheme://";
	clearTimeout(timeout);
}

//
// 방법 2 : iframe을 이용한 방법
//
function openAppOrStore() {
  var appURL = "yourappname://";
  var appStoreURL = "https://itunes.apple.com/app/yourappname/id1234567890";
  
  // 앱이 설치되어 있는지 확인
  var iframe = document.createElement("iframe");
  iframe.style.display = "none";
  iframe.src = appURL;
  document.body.appendChild(iframe);
  
  setTimeout(function() {
    document.body.removeChild(iframe);
    // 앱이 설치되어 있다면 앱 실행
    window.location.href = appURL;
  }, 2000);
  
  // 앱이 설치되어 있지 않다면 앱스토어 다운로드 페이지로 이동
  setTimeout(function() {
    window.location.href = appStoreURL;
  }, 4000);
}
위 코드에서는 `yourappname://`이라는 URL Scheme을 이용하여 앱이 설치되어 있는지를 확인합니다. 
만약 앱이 설치되어 있다면 해당 URL Scheme을 가진 앱을 실행하게 됩니다. 
반면, 앱이 설치되어 있지 않다면 `https://itunes.apple.com/app/yourappname/id1234567890`와 같은 
링크를 이용하여 앱스토어 다운로드 페이지로 이동시킵니다. 
이 때, `window.location.href`를 변경하여 앱스토어 페이지로 이동합니다.



//
// 방법 3 : 'canOpenURL'메소드를 사용하는 방법
//

만약 위 방법 1의 코드를 사용하면서 iframe을 사용하는 것이 보안 문제로 인해 불가능하다면, 
iOS 9부터는 `canOpenURL` 메소드를 사용하여 URL Scheme이 실행 가능한지 확인할 수 있습니다. 
이를 사용하여 `openAppOrStore()` 함수를 다음과 같이 변경할 수 있습니다.

function openAppOrStore() {
  var appURL = "yourappname://";
  var appStoreURL = "https://itunes.apple.com/app/yourappname/id1234567890";
  
  // 앱이 설치되어 있는지 확인
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
      // 앱이 설치되어 있다면 앱 실행
      window.location.href = appURL;
    }
  };
  xhr.open("GET", appURL, true);
  xhr.send();
  
  // 앱이 설치되어 있지 않다면 앱스토어 다운로드 페이지로 이동
  setTimeout(function() {
    window.location.href = appStoreURL;
  }, 4000);
}
위 코드에서는 XMLHttpRequest를 사용하여 URL Scheme이 실행 가능한지를 확인합니다. 
이 때, `open` 메소드의 `async` 파라미터를 true로 설정하여 비동기 요청을 수행하게 됩니다. 
요청이 완료되면 `readyState`가 4이고, `status`가 200인 경우에는 
앱이 설치되어 있다는 것을 의미하기 때문에 앱을 실행합니다. 
그렇지 않은 경우에는 앱스토어 페이지로 이동합니다.


스마트폰 BTC 채굴앱
https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site


2021.03.16 - [iOS/Tips] - Universal Link (1/4) - 네이티브 환경설정
2021.03.16 - [iOS/Tips] - Universal Link (2/4) - 네이티브 링크 수신
2021.03.16 - [iOS/Tips] - Universal Link (3/4) - 웹서버 환경 설정
2021.03.16 - [iOS/Tips] - Universal Link (4/4) - 웹서버 환경 검증
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)
2020/12/10 - [iOS/Tips] - Custom UserAgent 설정
2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거
2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기
2020/12/10 - [개발노트] - Bluetooth UUID
2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법
2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동
2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환
2020/08/11 - [iOS/Swift] - WKWebView 화면 출력 완료 이벤트
2020/08/06 - [iOS/Tips] - 개발관련 폴더 경로
2020/07/19 - [Android/Tips] - 안드로이드 원격 디버깅 방법
2020/07/18 - [Android/Tips] - Cannot convert string value 'JETPACK_COMPOSE' to an enum value of type 'com.android.builder.model.AndroidGradlePluginProjectFlags$BooleanFlag' (valid case insensitive values: APPLICATION_R_CLASS_CONSTANT_IDS, TEST_R_CLASS_CONSTANT_IDS, TRANSITIVE_R_CLASS)
2020/07/18 - [Android/Tips] - OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
2020/07/17 - [iOS/Tips] - 웹에서 iOS 앱 설치여부 체크

반응형

'개발 > Note' 카테고리의 다른 글

Bluetooth UUID  (0) 2020.12.10
모바일 앱 메모리덤프 이슈 해결방법  (0) 2020.12.08
SMC(System Management Controller) 재설정  (0) 2020.07.11
NVRAM(PRAM) 재설정 방법  (0) 2020.07.11
duplicate symbol 에러 해결  (0) 2020.06.16
블로그 이미지

SKY STORY

,