MD 문서 정리

This commit is contained in:
techAdmin 2023-09-18 17:23:58 +09:00
parent 12709eaf2a
commit 086e77257f
8 changed files with 0 additions and 1029 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
Nexacro14/.DS_Store vendored

Binary file not shown.

View File

@ -1,15 +0,0 @@
nexacro14 개발을 위한 안드로이드 스튜디오 기반의 개발자용 프로젝트 입니다.
프로젝트 구성의 기본틀은 aar을 이용하기 위한 런처앱이(nexacro.launcher) 있고,
실질적인 so파일과 jar파일과 관련된 내용을 수정할수 이있는 엔진이 모듈 형태로(com.nexacro) 포함되어 있습니다.
모듈은 gralde 명령어로(buildNative_Debug, buildNative_Release, buildNative_Clean) 로 빌드하시고,
apk 형태로 만드는 거는 그냥 초록색 화살표를 누르시면 자동으로 aar을 포함하여 apk를 생성하게 됩니다.
AAR 이란 : 새로운 안드로이드스튜디오 기반의 라이브러리. (jar, res, so, AndroidManifest 등을 하나로 통합)
<import 하기전>
1. DroidStudio\nexacro14 폴더로 가서 setup.cmd 커맨드를 실행해서
2. 안드로이드 스튜디오로 import후 자신의 환경에 맞게 세팅오류 잡기. 이때 오류는 자동으로 잡히는 부분이 있고 수동으로 해야 하는 부분이 있을수 있음.

View File

@ -1,338 +0,0 @@
<h1 align="center">Nexacro 24 iOS</h1>
Nexacro 24 Runtime for iOS 버전
## Nexacro N Runtime for iOS 버전 대비 차이점
- start_ios.json 을 파싱 하는 로직을 시작으로 초기 로딩 부분을 [Android WebView](http://172.10.12.65:22080/nre/Droid-WebView) 버전과 비슷한 구조로 리팩토링 하였습니다.
- [Cordova WebView](https://github.com/apache/cordova-ios) 엔진 구조를 참고하여 개발하였습니다.
- 배포라이브러리를 framework에서 [xcframework](https://showcove.medium.com/library-framework-%EA%B7%B8%EB%A6%AC%EA%B3%A0-xcframework-15387031964b) 로 변경하였습니다.
- DeviceAPI가 nexacro.xcframework 에서 분리 되어 별도로 배포됩니다.
## 개선사항
- 앱 설치 후에도 Update Type을 server or update, local 변경이 자유롭게 가능하도록 개선하였습니다.
## 테스트 환경
`NEXACRO Studio`
- 큰 변경사항이 없으며 iOS 로 디플로이한 프로젝트를 그대로 사용 합니다.
`Xcode`
- Version 14.3
- macOS Ventura 13.3.1 (a)
- 최신 버전 사용을 권장 합니다.
## 사양
- iOS 11 이상
- 기존 nexacro의 최소 지원 버전은 9입니다.
- 어느 버전부터 지원할지 [iOS 및 iPadOS 사용 현황](https://developer.apple.com/kr/support/app-store/) 참고하여 정해야 할 것으로 판단됩니다.
- 너무 예전 버전으로 설정시 warning 이 뜨거나 새로운 Xcode로 프로젝트 생성시 9 같은 버전은 선택 리스트에 뜨지 않고 있습니다.
## 의존 라이브러리
- 현재 시점에서는 없습니다.
## 테스트 방법
- 기존 iOS 와 유사하지만 약간의 변경사항이 있습니다.
- 상속하는 클래스명이 변경되었습니다.
```sh
# 변경 전
@interface ViewController : NexacroMainViewController
@interface AppDelegate : NexacroAppDelegate
# 변경 후
@interface ViewController : NXViewController
@interface AppDelegate : NXAppDelegate
```
- 부트스트랩 주소를 선언하는 오버라이딩 대상 메소드가 변경 되었습니다.
```sh
# 변경 전
@implementation AppDelegate
- (NexacroMainViewController*)initializeMainViewController
{
NSString *bootstrapUrl = @"http://172.10.12.59:8080/nexacroN/DroidWebviewSample/_ios_/start_ios.json";
[[NexacroResourceManager sharedResourceManager] setBootstrapURL:bootstrapUrl isDirect:NO];
AppViewController* controller = [[AppViewController alloc] initWithFullScreen:NO];
return controller;
}
@end
# 변경 후
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.viewController = [[ViewController alloc] init];
// server 및 update 모드 구동 방법
self.viewController.projectUrl = @"http://172.10.12.59:8080/nexacroN/DroidWebviewSample/_ios_update_/";
self.viewController.bootstrapUrl = @"http://172.10.12.59:8080/nexacroN/DroidWebviewSample/_ios_update_/start_ios.json";
// local 모드 구동 방법
// self.viewController.bootstrapUrl = @"file:///ios_asset/archive/start_ios.json";
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
```
- 현지화 리소스를 nexacro.framework에 포함시켜 사용자는 Xcode의 PROJECT 설정에서 Localizations 항목에 사용하고자 하는 지역만 추가 하면 됩니다. [(기존 방법)](http://docs.tobesoft.com/deployment_guide_nexacro_n_ko/5399b11819414d63#3650a1c89a4d70f6)
- 그리고 메인번들의 리소스를 우선시 하기 때문에 기존 방법대로 하게 되면 메시지문구를 재정의 할 수 있습니다.
- Scene관련 소스와 리소스는 사용되지 않으므로 제거가 필요합니다.
## WKWebViewConfiguration 변경 방법
- NXViewController 를 상속받은 클래스에 변수를 선언하여 설정 합니다.
```sh
@interface ViewController ()
@property (nonatomic, strong) WKWebViewConfiguration *configuration;
@end
@implementation ViewController
- (id)init {
...
self.configuration = [[WKWebViewConfiguration alloc] init];
if (@available(iOS 13.0, *)) {
self.configuration.defaultWebpagePreferences.preferredContentMode = WKContentModeMobile;
}
}
```
## 사용자 Splash View 변경 방법
- nexacro_config.xml 에 splash screen classname 을 설정합니다.
```sh
<config>
<splash classname="UserSplashScreen" ... />
</config>
```
- NXSplashScreenProtocol 을 구현한 클래스를 생성하고 다음과 같은 방법으로 구현을 합니다.
```sh
// Lottie 를 이용해서 구현한 예제입니다.
#import <nexacro/NXSplashScreenProtocol.h>
#import <Lottie/Lottie.h>
@interface UserSplashScreen : NSObject <NXSplashScreenProtocol>
@property (nonatomic, strong, readonly) UIView *splashView;
@property (nonatomic, strong, readonly) NSString *dialogPosition;
@end
@implementation UserSplashScreen
- (nullable instancetype)initWithFrame:(CGRect)frame {
return [self initWithFrame:frame dialogPosition:@""];
}
- (nullable instancetype)initWithFrame:(CGRect)frame dialogPosition:(nonnull NSString *)position {
self = [super init];
if (self) {
_splashView = [[UIView alloc] initWithFrame:frame];
}
_splashView.backgroundColor = [UIColor whiteColor];
LOTAnimationView *animation = [LOTAnimationView animationNamed:@"CompanyLogo"]; // json
[animation setFrame:frame];
[self.splashView addSubview:animation];
[animation playWithCompletion:^(BOOL animationFinished) {
// Do Something
}];
return self;
}
- (void)setMessage:(nonnull NSString *)message {
NSLog(@"setMessage: %@", message);
}
- (void)setProgress:(float)progress {
NSLog(@"setProgress: %f", progress);
}
@end
```
- SplashScreen 을 좀더 노출해야 하는 경우 아래의 메소드를 오버라이드 하여 호출 시점을 조절 합니다.
```sh
@implementation ViewController
...
- (void)onWebViewPageDidLoad:(NSNotification *)notification
{
// 아래 함수를 딜레이를 줘서 호출 한다.
[super onWebViewPageDidLoad:notification];
}
...
@end
```
## 플러그인 개발
- NXPlugin을 상속받은 후 필수 함수를 정의하여 개발합니다.
```sh
@interface Camera : NXPlugin
...
@end
@implementation Camera
...
- (void)pluginInitialize {
// JavaScript에서 exec를 호출할때 method 가 constructor 일때 호출됩니다.
}
- (void)pluginRelease {
// JavaScript에서 exec를 호출할때 method 가 destroy 일때 호출됩니다.
}
@end
```
- 결과값 리턴은 아래와 같은 방식으로 개발합니다.
```sh
// 변경전
NSString *callbackResult = [NSString stringWithFormat:@"runCallback(\"callbackID\",\"eventName\",jsonPrametes);"];
[self writeJavascript:callbackResult];
// 변경후
NSDictionary *parameters = @{@"pram1":@(pramvalue1),
@"pram2":@(pramvalue2)};
NXPluginResult *result = [[NXPluginResult alloc] initWithCallbackId:self.nID
eventName:@"_onrecvsuccess"
parameters:parameters];
[self.nxCommandDelegate sendPluginResult:result];
```
## Cordova 플러그인 지원
- Cordova 플러그인 개발을 위해 nexacro.framework 에 기능 구현 및 헤더를 추가 하였습니다.
```sh
// Cordova 헤더 파일 위치
nexacro.framework/Headers/Cordova
```
## Cordova 플러그인 추가 방법
- (개발중인) 코르도바 제네레이터를 사용합니다.
- 코르도바 플러그인 모듈이 생성됩니다.
- 넥사크로 프로젝트 하위 경로로 필요한 플러그인 소스가 복사되어 배치됩니다.
- 넥사크로 프로젝트에 배치된 소스가 앱 프로젝트에 복사됩니다.
- 코르도바 제네레이터가 하지 못하는 작업은 plugin.xml 정보를 바탕으로 아래와 같이 직접 수정합니다.
1. 넥사크로 plugin_config.xml 파일에 코르도바 플러그인을 다음과 같이 등록
```sh
<!-- plugin.xml 파일 정보를 바탕으로 plugin_config.xml 파일에 등록합니다. -->
plugin.xml
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="StatusBar">
<param name="ios-package" value="CDVStatusBar" />
<param name="onload" value="true" />
</feature>
<preference name="StatusBarOverlaysWebView" value="true" />
<preference name="StatusBarStyle" value="lightcontent" />
</config-file>
</platform>
==>
plugin_config.xml
<plugin name="StatusBar" class="CDVStatusBar" onload="true"/>
<preference name="StatusBarOverlaysWebView" value="true" />
<preference name="StatusBarStyle" value="lightcontent" />
코르도바의 config.xml은 넥사크로의 plugin_config.xml 파일과 동일한 역할을 합니다.
```
2. Xcode 를 통한 Cordova 플러그인 파일 추가 및 수정.
- 코르도바 제네레이터를 통해 넥사크로 프로젝트 경로에 복사된 플러그인 소스를 앱의 프로젝트에 복사한후 Xcode 에서 빌드되도록 소스를 추가합니다.
- 추가한 플러그인 소스에서 Cordova 관련 import 경로를 아래와 같이 변경한다.
```
<Cordova/CDV.h> // 변경 전
<nexacro/Cordova/CDV.h> // 변경 후
```
3. 플러그인의 종류에 따라서 이외의 작업이 있을수 있습니다.
4. 빌드.
## CLI (커맨드 라인 인터페이스) 에서 배포용 라이브러리 만드는 방법
- nexacro.xcframework 생성 명령어 (필수)
```
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme nexacro_universal -configuration Release
```
- DeviceAPI.xcframework 생성 명령어 (선택)
- 참고로 nexacro.xcframework 에 의존하므로 먼저 위의 커맨드로 생성 되어 있어야함.
```
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXAcceleration_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXAudioPlayer_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXBluetoothLE_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXCamera_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXContact_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXExternalAPI_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXGeolocation_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXSms_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXLiteDB_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXVibrator_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXNetwork_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXPush_universal -configuration Release
```
- 배표용 라이브러리 위치
```
WORK800/Hybrid/iOS/nexacroLib/XCFramework/nexacro.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXAcceleration/XCFramework/NXAcceleration.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXAudioPlayer/XCFramework/NXAudioPlayer.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXBluetoothLE/XCFramework/NXBluetoothLE.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXCamera/XCFramework/NXCamera.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXContact/XCFramework/NXContact.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXGeolocation/XCFramework/NXGeolocation.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXLiteDB/XCFramework/NXLiteDB.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXNetwork/XCFramework/NXNetwork.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXSms/XCFramework/NXSms.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXVibrator/XCFramework/NXVibrator.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXPush/XCFramework/NXPush.xcframework
```

BIN
Nexacro17/.DS_Store vendored

Binary file not shown.

View File

@ -1,338 +0,0 @@
<h1 align="center">Nexacro 24 iOS</h1>
Nexacro 24 Runtime for iOS 버전
## Nexacro N Runtime for iOS 버전 대비 차이점
- start_ios.json 을 파싱 하는 로직을 시작으로 초기 로딩 부분을 [Android WebView](http://172.10.12.65:22080/nre/Droid-WebView) 버전과 비슷한 구조로 리팩토링 하였습니다.
- [Cordova WebView](https://github.com/apache/cordova-ios) 엔진 구조를 참고하여 개발하였습니다.
- 배포라이브러리를 framework에서 [xcframework](https://showcove.medium.com/library-framework-%EA%B7%B8%EB%A6%AC%EA%B3%A0-xcframework-15387031964b) 로 변경하였습니다.
- DeviceAPI가 nexacro.xcframework 에서 분리 되어 별도로 배포됩니다.
## 개선사항
- 앱 설치 후에도 Update Type을 server or update, local 변경이 자유롭게 가능하도록 개선하였습니다.
## 테스트 환경
`NEXACRO Studio`
- 큰 변경사항이 없으며 iOS 로 디플로이한 프로젝트를 그대로 사용 합니다.
`Xcode`
- Version 14.3
- macOS Ventura 13.3.1 (a)
- 최신 버전 사용을 권장 합니다.
## 사양
- iOS 11 이상
- 기존 nexacro의 최소 지원 버전은 9입니다.
- 어느 버전부터 지원할지 [iOS 및 iPadOS 사용 현황](https://developer.apple.com/kr/support/app-store/) 참고하여 정해야 할 것으로 판단됩니다.
- 너무 예전 버전으로 설정시 warning 이 뜨거나 새로운 Xcode로 프로젝트 생성시 9 같은 버전은 선택 리스트에 뜨지 않고 있습니다.
## 의존 라이브러리
- 현재 시점에서는 없습니다.
## 테스트 방법
- 기존 iOS 와 유사하지만 약간의 변경사항이 있습니다.
- 상속하는 클래스명이 변경되었습니다.
```sh
# 변경 전
@interface ViewController : NexacroMainViewController
@interface AppDelegate : NexacroAppDelegate
# 변경 후
@interface ViewController : NXViewController
@interface AppDelegate : NXAppDelegate
```
- 부트스트랩 주소를 선언하는 오버라이딩 대상 메소드가 변경 되었습니다.
```sh
# 변경 전
@implementation AppDelegate
- (NexacroMainViewController*)initializeMainViewController
{
NSString *bootstrapUrl = @"http://172.10.12.59:8080/nexacroN/DroidWebviewSample/_ios_/start_ios.json";
[[NexacroResourceManager sharedResourceManager] setBootstrapURL:bootstrapUrl isDirect:NO];
AppViewController* controller = [[AppViewController alloc] initWithFullScreen:NO];
return controller;
}
@end
# 변경 후
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.viewController = [[ViewController alloc] init];
// server 및 update 모드 구동 방법
self.viewController.projectUrl = @"http://172.10.12.59:8080/nexacroN/DroidWebviewSample/_ios_update_/";
self.viewController.bootstrapUrl = @"http://172.10.12.59:8080/nexacroN/DroidWebviewSample/_ios_update_/start_ios.json";
// local 모드 구동 방법
// self.viewController.bootstrapUrl = @"file:///ios_asset/archive/start_ios.json";
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
```
- 현지화 리소스를 nexacro.framework에 포함시켜 사용자는 Xcode의 PROJECT 설정에서 Localizations 항목에 사용하고자 하는 지역만 추가 하면 됩니다. [(기존 방법)](http://docs.tobesoft.com/deployment_guide_nexacro_n_ko/5399b11819414d63#3650a1c89a4d70f6)
- 그리고 메인번들의 리소스를 우선시 하기 때문에 기존 방법대로 하게 되면 메시지문구를 재정의 할 수 있습니다.
- Scene관련 소스와 리소스는 사용되지 않으므로 제거가 필요합니다.
## WKWebViewConfiguration 변경 방법
- NXViewController 를 상속받은 클래스에 변수를 선언하여 설정 합니다.
```sh
@interface ViewController ()
@property (nonatomic, strong) WKWebViewConfiguration *configuration;
@end
@implementation ViewController
- (id)init {
...
self.configuration = [[WKWebViewConfiguration alloc] init];
if (@available(iOS 13.0, *)) {
self.configuration.defaultWebpagePreferences.preferredContentMode = WKContentModeMobile;
}
}
```
## 사용자 Splash View 변경 방법
- nexacro_config.xml 에 splash screen classname 을 설정합니다.
```sh
<config>
<splash classname="UserSplashScreen" ... />
</config>
```
- NXSplashScreenProtocol 을 구현한 클래스를 생성하고 다음과 같은 방법으로 구현을 합니다.
```sh
// Lottie 를 이용해서 구현한 예제입니다.
#import <nexacro/NXSplashScreenProtocol.h>
#import <Lottie/Lottie.h>
@interface UserSplashScreen : NSObject <NXSplashScreenProtocol>
@property (nonatomic, strong, readonly) UIView *splashView;
@property (nonatomic, strong, readonly) NSString *dialogPosition;
@end
@implementation UserSplashScreen
- (nullable instancetype)initWithFrame:(CGRect)frame {
return [self initWithFrame:frame dialogPosition:@""];
}
- (nullable instancetype)initWithFrame:(CGRect)frame dialogPosition:(nonnull NSString *)position {
self = [super init];
if (self) {
_splashView = [[UIView alloc] initWithFrame:frame];
}
_splashView.backgroundColor = [UIColor whiteColor];
LOTAnimationView *animation = [LOTAnimationView animationNamed:@"CompanyLogo"]; // json
[animation setFrame:frame];
[self.splashView addSubview:animation];
[animation playWithCompletion:^(BOOL animationFinished) {
// Do Something
}];
return self;
}
- (void)setMessage:(nonnull NSString *)message {
NSLog(@"setMessage: %@", message);
}
- (void)setProgress:(float)progress {
NSLog(@"setProgress: %f", progress);
}
@end
```
- SplashScreen 을 좀더 노출해야 하는 경우 아래의 메소드를 오버라이드 하여 호출 시점을 조절 합니다.
```sh
@implementation ViewController
...
- (void)onWebViewPageDidLoad:(NSNotification *)notification
{
// 아래 함수를 딜레이를 줘서 호출 한다.
[super onWebViewPageDidLoad:notification];
}
...
@end
```
## 플러그인 개발
- NXPlugin을 상속받은 후 필수 함수를 정의하여 개발합니다.
```sh
@interface Camera : NXPlugin
...
@end
@implementation Camera
...
- (void)pluginInitialize {
// JavaScript에서 exec를 호출할때 method 가 constructor 일때 호출됩니다.
}
- (void)pluginRelease {
// JavaScript에서 exec를 호출할때 method 가 destroy 일때 호출됩니다.
}
@end
```
- 결과값 리턴은 아래와 같은 방식으로 개발합니다.
```sh
// 변경전
NSString *callbackResult = [NSString stringWithFormat:@"runCallback(\"callbackID\",\"eventName\",jsonPrametes);"];
[self writeJavascript:callbackResult];
// 변경후
NSDictionary *parameters = @{@"pram1":@(pramvalue1),
@"pram2":@(pramvalue2)};
NXPluginResult *result = [[NXPluginResult alloc] initWithCallbackId:self.nID
eventName:@"_onrecvsuccess"
parameters:parameters];
[self.nxCommandDelegate sendPluginResult:result];
```
## Cordova 플러그인 지원
- Cordova 플러그인 개발을 위해 nexacro.framework 에 기능 구현 및 헤더를 추가 하였습니다.
```sh
// Cordova 헤더 파일 위치
nexacro.framework/Headers/Cordova
```
## Cordova 플러그인 추가 방법
- (개발중인) 코르도바 제네레이터를 사용합니다.
- 코르도바 플러그인 모듈이 생성됩니다.
- 넥사크로 프로젝트 하위 경로로 필요한 플러그인 소스가 복사되어 배치됩니다.
- 넥사크로 프로젝트에 배치된 소스가 앱 프로젝트에 복사됩니다.
- 코르도바 제네레이터가 하지 못하는 작업은 plugin.xml 정보를 바탕으로 아래와 같이 직접 수정합니다.
1. 넥사크로 plugin_config.xml 파일에 코르도바 플러그인을 다음과 같이 등록
```sh
<!-- plugin.xml 파일 정보를 바탕으로 plugin_config.xml 파일에 등록합니다. -->
plugin.xml
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="StatusBar">
<param name="ios-package" value="CDVStatusBar" />
<param name="onload" value="true" />
</feature>
<preference name="StatusBarOverlaysWebView" value="true" />
<preference name="StatusBarStyle" value="lightcontent" />
</config-file>
</platform>
==>
plugin_config.xml
<plugin name="StatusBar" class="CDVStatusBar" onload="true"/>
<preference name="StatusBarOverlaysWebView" value="true" />
<preference name="StatusBarStyle" value="lightcontent" />
코르도바의 config.xml은 넥사크로의 plugin_config.xml 파일과 동일한 역할을 합니다.
```
2. Xcode 를 통한 Cordova 플러그인 파일 추가 및 수정.
- 코르도바 제네레이터를 통해 넥사크로 프로젝트 경로에 복사된 플러그인 소스를 앱의 프로젝트에 복사한후 Xcode 에서 빌드되도록 소스를 추가합니다.
- 추가한 플러그인 소스에서 Cordova 관련 import 경로를 아래와 같이 변경한다.
```
<Cordova/CDV.h> // 변경 전
<nexacro/Cordova/CDV.h> // 변경 후
```
3. 플러그인의 종류에 따라서 이외의 작업이 있을수 있습니다.
4. 빌드.
## CLI (커맨드 라인 인터페이스) 에서 배포용 라이브러리 만드는 방법
- nexacro.xcframework 생성 명령어 (필수)
```
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme nexacro_universal -configuration Release
```
- DeviceAPI.xcframework 생성 명령어 (선택)
- 참고로 nexacro.xcframework 에 의존하므로 먼저 위의 커맨드로 생성 되어 있어야함.
```
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXAcceleration_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXAudioPlayer_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXBluetoothLE_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXCamera_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXContact_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXExternalAPI_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXGeolocation_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXSms_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXLiteDB_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXVibrator_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXNetwork_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXPush_universal -configuration Release
```
- 배표용 라이브러리 위치
```
WORK800/Hybrid/iOS/nexacroLib/XCFramework/nexacro.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXAcceleration/XCFramework/NXAcceleration.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXAudioPlayer/XCFramework/NXAudioPlayer.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXBluetoothLE/XCFramework/NXBluetoothLE.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXCamera/XCFramework/NXCamera.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXContact/XCFramework/NXContact.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXGeolocation/XCFramework/NXGeolocation.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXLiteDB/XCFramework/NXLiteDB.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXNetwork/XCFramework/NXNetwork.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXSms/XCFramework/NXSms.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXVibrator/XCFramework/NXVibrator.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXPush/XCFramework/NXPush.xcframework
```

BIN
NexacroN/.DS_Store vendored

Binary file not shown.

View File

@ -1,338 +0,0 @@
<h1 align="center">Nexacro 24 iOS</h1>
Nexacro 24 Runtime for iOS 버전
## Nexacro N Runtime for iOS 버전 대비 차이점
- start_ios.json 을 파싱 하는 로직을 시작으로 초기 로딩 부분을 [Android WebView](http://172.10.12.65:22080/nre/Droid-WebView) 버전과 비슷한 구조로 리팩토링 하였습니다.
- [Cordova WebView](https://github.com/apache/cordova-ios) 엔진 구조를 참고하여 개발하였습니다.
- 배포라이브러리를 framework에서 [xcframework](https://showcove.medium.com/library-framework-%EA%B7%B8%EB%A6%AC%EA%B3%A0-xcframework-15387031964b) 로 변경하였습니다.
- DeviceAPI가 nexacro.xcframework 에서 분리 되어 별도로 배포됩니다.
## 개선사항
- 앱 설치 후에도 Update Type을 server or update, local 변경이 자유롭게 가능하도록 개선하였습니다.
## 테스트 환경
`NEXACRO Studio`
- 큰 변경사항이 없으며 iOS 로 디플로이한 프로젝트를 그대로 사용 합니다.
`Xcode`
- Version 14.3
- macOS Ventura 13.3.1 (a)
- 최신 버전 사용을 권장 합니다.
## 사양
- iOS 11 이상
- 기존 nexacro의 최소 지원 버전은 9입니다.
- 어느 버전부터 지원할지 [iOS 및 iPadOS 사용 현황](https://developer.apple.com/kr/support/app-store/) 참고하여 정해야 할 것으로 판단됩니다.
- 너무 예전 버전으로 설정시 warning 이 뜨거나 새로운 Xcode로 프로젝트 생성시 9 같은 버전은 선택 리스트에 뜨지 않고 있습니다.
## 의존 라이브러리
- 현재 시점에서는 없습니다.
## 테스트 방법
- 기존 iOS 와 유사하지만 약간의 변경사항이 있습니다.
- 상속하는 클래스명이 변경되었습니다.
```sh
# 변경 전
@interface ViewController : NexacroMainViewController
@interface AppDelegate : NexacroAppDelegate
# 변경 후
@interface ViewController : NXViewController
@interface AppDelegate : NXAppDelegate
```
- 부트스트랩 주소를 선언하는 오버라이딩 대상 메소드가 변경 되었습니다.
```sh
# 변경 전
@implementation AppDelegate
- (NexacroMainViewController*)initializeMainViewController
{
NSString *bootstrapUrl = @"http://172.10.12.59:8080/nexacroN/DroidWebviewSample/_ios_/start_ios.json";
[[NexacroResourceManager sharedResourceManager] setBootstrapURL:bootstrapUrl isDirect:NO];
AppViewController* controller = [[AppViewController alloc] initWithFullScreen:NO];
return controller;
}
@end
# 변경 후
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.viewController = [[ViewController alloc] init];
// server 및 update 모드 구동 방법
self.viewController.projectUrl = @"http://172.10.12.59:8080/nexacroN/DroidWebviewSample/_ios_update_/";
self.viewController.bootstrapUrl = @"http://172.10.12.59:8080/nexacroN/DroidWebviewSample/_ios_update_/start_ios.json";
// local 모드 구동 방법
// self.viewController.bootstrapUrl = @"file:///ios_asset/archive/start_ios.json";
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
```
- 현지화 리소스를 nexacro.framework에 포함시켜 사용자는 Xcode의 PROJECT 설정에서 Localizations 항목에 사용하고자 하는 지역만 추가 하면 됩니다. [(기존 방법)](http://docs.tobesoft.com/deployment_guide_nexacro_n_ko/5399b11819414d63#3650a1c89a4d70f6)
- 그리고 메인번들의 리소스를 우선시 하기 때문에 기존 방법대로 하게 되면 메시지문구를 재정의 할 수 있습니다.
- Scene관련 소스와 리소스는 사용되지 않으므로 제거가 필요합니다.
## WKWebViewConfiguration 변경 방법
- NXViewController 를 상속받은 클래스에 변수를 선언하여 설정 합니다.
```sh
@interface ViewController ()
@property (nonatomic, strong) WKWebViewConfiguration *configuration;
@end
@implementation ViewController
- (id)init {
...
self.configuration = [[WKWebViewConfiguration alloc] init];
if (@available(iOS 13.0, *)) {
self.configuration.defaultWebpagePreferences.preferredContentMode = WKContentModeMobile;
}
}
```
## 사용자 Splash View 변경 방법
- nexacro_config.xml 에 splash screen classname 을 설정합니다.
```sh
<config>
<splash classname="UserSplashScreen" ... />
</config>
```
- NXSplashScreenProtocol 을 구현한 클래스를 생성하고 다음과 같은 방법으로 구현을 합니다.
```sh
// Lottie 를 이용해서 구현한 예제입니다.
#import <nexacro/NXSplashScreenProtocol.h>
#import <Lottie/Lottie.h>
@interface UserSplashScreen : NSObject <NXSplashScreenProtocol>
@property (nonatomic, strong, readonly) UIView *splashView;
@property (nonatomic, strong, readonly) NSString *dialogPosition;
@end
@implementation UserSplashScreen
- (nullable instancetype)initWithFrame:(CGRect)frame {
return [self initWithFrame:frame dialogPosition:@""];
}
- (nullable instancetype)initWithFrame:(CGRect)frame dialogPosition:(nonnull NSString *)position {
self = [super init];
if (self) {
_splashView = [[UIView alloc] initWithFrame:frame];
}
_splashView.backgroundColor = [UIColor whiteColor];
LOTAnimationView *animation = [LOTAnimationView animationNamed:@"CompanyLogo"]; // json
[animation setFrame:frame];
[self.splashView addSubview:animation];
[animation playWithCompletion:^(BOOL animationFinished) {
// Do Something
}];
return self;
}
- (void)setMessage:(nonnull NSString *)message {
NSLog(@"setMessage: %@", message);
}
- (void)setProgress:(float)progress {
NSLog(@"setProgress: %f", progress);
}
@end
```
- SplashScreen 을 좀더 노출해야 하는 경우 아래의 메소드를 오버라이드 하여 호출 시점을 조절 합니다.
```sh
@implementation ViewController
...
- (void)onWebViewPageDidLoad:(NSNotification *)notification
{
// 아래 함수를 딜레이를 줘서 호출 한다.
[super onWebViewPageDidLoad:notification];
}
...
@end
```
## 플러그인 개발
- NXPlugin을 상속받은 후 필수 함수를 정의하여 개발합니다.
```sh
@interface Camera : NXPlugin
...
@end
@implementation Camera
...
- (void)pluginInitialize {
// JavaScript에서 exec를 호출할때 method 가 constructor 일때 호출됩니다.
}
- (void)pluginRelease {
// JavaScript에서 exec를 호출할때 method 가 destroy 일때 호출됩니다.
}
@end
```
- 결과값 리턴은 아래와 같은 방식으로 개발합니다.
```sh
// 변경전
NSString *callbackResult = [NSString stringWithFormat:@"runCallback(\"callbackID\",\"eventName\",jsonPrametes);"];
[self writeJavascript:callbackResult];
// 변경후
NSDictionary *parameters = @{@"pram1":@(pramvalue1),
@"pram2":@(pramvalue2)};
NXPluginResult *result = [[NXPluginResult alloc] initWithCallbackId:self.nID
eventName:@"_onrecvsuccess"
parameters:parameters];
[self.nxCommandDelegate sendPluginResult:result];
```
## Cordova 플러그인 지원
- Cordova 플러그인 개발을 위해 nexacro.framework 에 기능 구현 및 헤더를 추가 하였습니다.
```sh
// Cordova 헤더 파일 위치
nexacro.framework/Headers/Cordova
```
## Cordova 플러그인 추가 방법
- (개발중인) 코르도바 제네레이터를 사용합니다.
- 코르도바 플러그인 모듈이 생성됩니다.
- 넥사크로 프로젝트 하위 경로로 필요한 플러그인 소스가 복사되어 배치됩니다.
- 넥사크로 프로젝트에 배치된 소스가 앱 프로젝트에 복사됩니다.
- 코르도바 제네레이터가 하지 못하는 작업은 plugin.xml 정보를 바탕으로 아래와 같이 직접 수정합니다.
1. 넥사크로 plugin_config.xml 파일에 코르도바 플러그인을 다음과 같이 등록
```sh
<!-- plugin.xml 파일 정보를 바탕으로 plugin_config.xml 파일에 등록합니다. -->
plugin.xml
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="StatusBar">
<param name="ios-package" value="CDVStatusBar" />
<param name="onload" value="true" />
</feature>
<preference name="StatusBarOverlaysWebView" value="true" />
<preference name="StatusBarStyle" value="lightcontent" />
</config-file>
</platform>
==>
plugin_config.xml
<plugin name="StatusBar" class="CDVStatusBar" onload="true"/>
<preference name="StatusBarOverlaysWebView" value="true" />
<preference name="StatusBarStyle" value="lightcontent" />
코르도바의 config.xml은 넥사크로의 plugin_config.xml 파일과 동일한 역할을 합니다.
```
2. Xcode 를 통한 Cordova 플러그인 파일 추가 및 수정.
- 코르도바 제네레이터를 통해 넥사크로 프로젝트 경로에 복사된 플러그인 소스를 앱의 프로젝트에 복사한후 Xcode 에서 빌드되도록 소스를 추가합니다.
- 추가한 플러그인 소스에서 Cordova 관련 import 경로를 아래와 같이 변경한다.
```
<Cordova/CDV.h> // 변경 전
<nexacro/Cordova/CDV.h> // 변경 후
```
3. 플러그인의 종류에 따라서 이외의 작업이 있을수 있습니다.
4. 빌드.
## CLI (커맨드 라인 인터페이스) 에서 배포용 라이브러리 만드는 방법
- nexacro.xcframework 생성 명령어 (필수)
```
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme nexacro_universal -configuration Release
```
- DeviceAPI.xcframework 생성 명령어 (선택)
- 참고로 nexacro.xcframework 에 의존하므로 먼저 위의 커맨드로 생성 되어 있어야함.
```
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXAcceleration_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXAudioPlayer_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXBluetoothLE_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXCamera_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXContact_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXExternalAPI_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXGeolocation_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXSms_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXLiteDB_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXVibrator_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXNetwork_universal -configuration Release
xcodebuild -workspace nexacro_ios_package.xcworkspace -scheme NXPush_universal -configuration Release
```
- 배표용 라이브러리 위치
```
WORK800/Hybrid/iOS/nexacroLib/XCFramework/nexacro.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXAcceleration/XCFramework/NXAcceleration.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXAudioPlayer/XCFramework/NXAudioPlayer.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXBluetoothLE/XCFramework/NXBluetoothLE.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXCamera/XCFramework/NXCamera.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXContact/XCFramework/NXContact.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXGeolocation/XCFramework/NXGeolocation.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXLiteDB/XCFramework/NXLiteDB.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXNetwork/XCFramework/NXNetwork.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXSms/XCFramework/NXSms.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXVibrator/XCFramework/NXVibrator.xcframework
WORK800/Hybrid/iOS/module-DeviceAPI/NXPush/XCFramework/NXPush.xcframework
```