앱 개발 및 실행 (iOS/iPadOS)

앱 개발 환경 설정

iOS용 앱은 Xcode, iOS SDK를 이용해 개발합니다. Xcode, iOS SDK는 Windows 계열의 PC에서는 사용할 수 없으며 Mac에서만 구동합니다. 그리고 Xcode를 내려받고 앱을 만들고 테스트를 하기 위해서는 Apple 개발자 계정이 필요합니다.

iOS 앱 개발 환경은 기본적으로 다음과 같은 절차에 의해 구성되며 세부 내용은 개발자 사이트 업데이트에 따라 변경될 수 있습니다.

  1. 개발자 계정 등록

  2. Xcode, iOS SDK 설치

  3. 배포 시 필요한 작업

이번 장에서는 Xcode 12.5.1 버전을 기준으로 작성했습니다.

앱 프로젝트 개발

Xcode에서 아래와 같은 절차에 따라 iOS용 앱 프로젝트를 개발합니다. 앱 프로젝트를 진행하기 전에 넥사크로 스튜디오에서 만든 아카이브 파일은 지정된 경로에 위치해야 합니다.

프로젝트 생성

넥사크로로 개발된 앱을 담을 iOS 프로젝트를 생성하고 기본 환경을 설정해야 합니다. 새로운 프로젝트는 아래 메뉴에서 생성할 수 있습니다.

File > New > Project

프로젝트 생성을 위한 템플릿 화면에서 'App' 항목을 선택합니다.

project_new_01

Product Name과 필요한 항목을 지정한 후 Next 버튼을 클릭합니다. 오픈된 팝업 창에서 프로젝트를 생성할 위치를 지정한 후 'Create' 버튼을 클릭하면 새로운 프로젝트가 생성됩니다.

project_new_02_01

설치된 Xcode 버전에 따라 프로젝트 생성 방법이 조금씩 달라질 수 있습니다.

iPhone X 디바이스를 사용하는 경우에 위쪽과 아래쪽에 여백이 생기는 현상을 방지하기 위해서는 프로젝트에 LaunchScreen 스토리 보드를 추가해야 합니다.

자세한 내용은 아래 링크를 참고해주세요.

https://developer.apple.com/ios/update-apps-for-iphone-x/

https://developer.apple.com/ios/human-interface-guidelines/icons-and-images/launch-screen/

iOS 라이브러리 및 프레임워크 설정

iOS에서 제공하는 API를 사용하는 데 필요한 라이브러리와 프레임워크를 설정합니다. 프로젝트를 선택하고 TARGETS 항목을 선택하면 화면 상단에 'General'이라는 탭을 확인할 수 있습니다. 해당 탭을 선택하면 'Frameworks, Libraries, and Embedded Content' 항목이 보이는데 이 곳에서 라이브러리와 프레임워크를 추가합니다.

project_new_03_01

하단에 있는 + 버튼을 클릭해 "libc++.tbd" 항목을 추가합니다.

넥사크로 라이브러리 설정

iOS 프로젝트에서 넥사크로에 최적화된 환경을 만들기 위해 추가로 제공되는 넥사크로 라이브러리 파일을 설정합니다.

넥사크로 라이브러리는 압축 파일 형태로 제공되며 nexacro.framework.zip이라는 파일명으로 제공됩니다. 'Frameworks, Libraries, and Embedded Content' 항목에서 [+] 버튼을 클릭하고 Add Files 항목을 선택해서 nexacro.framework.zip 파일을 선택합니다.

nexacro_library_추가_자름

리소스 설정

앱에서 사용할 로딩 이미지, 아이콘, 메시지, 레이아웃 등을 설정하는 단계입니다. 진행하는 프로젝트에 따라 변경해 적용할 수 있습니다.

이미지 설정

Xcode의 템플릿으로 생성한 프로젝트에는 리소스를 관리하는데 필요한 빈 애셋 카탈로그(Asset Catalog)가 포함됩니다. 사용자는 필요에 따라 앱 아이콘, 런처 이미지 등을 애셋 카탈로그에 등록하여 사용할 수 있습니다.

iOS 앱에서 사용하는 앱 아이콘과 런치 스크린 이미지는 개별적으로 설정할 수 있으며 미리 만들어진 이미지를 연결할 수 있습니다.

이미지 설정시 반드시 해당 iOS 단말기에 맞게 제작된 이미지를 사용해야 합니다. 단말기에 맞지 않는 크기의 이미지 혹은 사양과 맞지 않는 속성을 갖는 이미지를 설정하면 앱 빌드시 에러가 발생하거나 정상적으로 동작하지 않습니다.


아이콘 및 이미지 설정과 관련된 자세한 내용은 애플 개발자 사이트를 참고하세요.

https://developer.apple.com/ios/human-interface-guidelines/icons-and-images/image-size-and-resolution/

아이콘 및 이미지 설정은 프로젝트 설정에서 할 수 있습니다. 프로젝트를 선택하고 TARGETS 항목을 선택하면 화면 상단에 'General'이라는 탭을 확인할 수 있습니다. 해당 탭을 선택하고 'App Icons and Launch Images' 항목을 확인합니다.

appicon_launch_image_설정_01

'App Icons Source' 항목 옆의 화살표를 클릭하면 다음과 같이 애셋 카탈로그에서 앱 아이콘을 설정할 수 있습니다. 미리 제작한 아이콘 이미지를 단말기와 용도에 맞는 위치에 드래그 앤 드롭합니다.

appicon_launch_image_설정_02

메시지 설정

앱에서 사용할 메시지를 별도의 파일로 저장했다가 앱 실행 시 이용할 수 있습니다.

새로운 파일을 생성하려면 프로젝트 폴더를 선택 후 메뉴에서 [File > New > File] 항목을 선택합니다.

project_new_07

화면에 보이는 템플릿 중에서 'Strings File'을 선택합니다.

project_new_08

"Save As"에 파일명을 'Localizable'로 입력합니다.

project_new_09

생성된 Localizable.strings 파일은 아래와 같이 수정합니다.

/* 
  Localizable.strings
  HelloiOS
*/
"needupdate" = "It needs an update.";
"loadingFail" = "First loading fails.  \r\nPlease restart.";
"updateFail" = "Update fails.  \r\nPlease restart.";
"notexist" = "Start file does NOT exist.  \r\nPlease restart.";
"BeingUpdated" = "Being updated.";
"wantreplace" = "There is a file of the same name. Do you want to replace? ";
"ok" = "OK";
"cancel" = "Cancel";
"move" = "Move";
"upper" = "Upper";
"filter" = "Filter";
"home" = "Home";
"nofilename" = "No File Name.";
"checkforupdates" = "Check for update.";
"installforupdates" = "Install update.";
"downloadingforupdates" = "Downloading update.";
"force_close" = "Update is Completed.";

Xcode 화면 오른쪽에 있는 Utilities 창에서 'Localize...' 버튼을 클릭하고 언어를 선택합니다. 사전에 프로젝트 설정에서 언어를 추가하지 않은 경우에는 기본으로 영어가 선택됩니다.

Localization_01

영어 이외의 언어를 지원하려면 [프로젝트 > Info > Localizations]에서 + 버튼을 눌러 다른 언어를 추가할 수 있습니다.

Localization_02

Localization에 관련된 자세한 내용은 애플 개발자 사이트를 참고하세요.

https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/Introduction/Introduction.html

Config 설정

넥사크로에서 제공하는 기능을 앱에서 사용할 수 있도록 nexacro_config.xml 파일을 설정합니다. 앱 업데이트, Notification, 에러 정보 처리 등의 기능을 활성화 할 수 있습니다. nexacro_config.xml 파일은 사용자가 직접 생성해야 하며 [{Asset} > data] 폴더 아래에 배치합니다. 이 파일은 Xcode에서 앱 빌드시 프로젝트에 포함되어 있어야 합니다.

nexacro_config.xml 파일이 없으면 기본 설정이 적용되므로 앱 실행에는 아무런 지장이 없습니다.

nexacro_config.xml 파일은 XML 형식이며 다음 예와 같이 작성합니다.

<?xml version="1.0" encoding="utf-8"?>
<nexacro-config>
  <application dialog-position="top" use-wkwebview="true" file-logging="true" />
  <notification enable="true" handler="DefaultNotificationManagerHandler"/>
  <updator force="false" cancelable="false" quiet="true" errormsg="true" failpass="true"/>
  <xpush-server request-missing-message="true" />
</nexacro-config>

nexacro_config.xml에 설정할 수 있는 기능은 다음과 같습니다.

기능

속성

설정 값

설명

application

dialog-position

"top" | "center" | "bottom"

앱 업데이트 진행 정보를 표시할 팝업 위치를 설정합니다.

file-logging

"true" | "false"

로딩 에러 정보를 파일로 저장할지 설정합니다.

iTunes를 통해서 로그 파일을 확인할 수 있습니다.

updator

force

"true" | "false"

start_ios.json에 업데이트 파일 정보 존재시 팝업으로 표시할지 설정합니다.

"true"로 설정시 팝업 알림없이 강제로 업데이트를 진행합니다.

cancelable

"true" | "false"

업데이트 파일 존재시 팝업에 업데이트 취소 버튼을 표시할지 설정합니다.

취소 버튼을 클릭하면 업데이트를 진행하지 않고 앱을 종료합니다.

errormsg

"true" | "false"

앱 로딩에 실패했을 때 에러 정보를 팝업으로 표시할지 설정합니다.

quiet

"true" | "false"

업데이트 팝업을 표시할지 설정합니다.

"true"로 설정해도 업데이트 파일 존재시 진행 단계는 표시됩니다.

failpass

"true" | "false"

업데이트 오류를 무시할지 설정합니다.

xpush-server

request-missing-message

"true" | "false"

xpush 서버 사용시 수신하지 못한 신뢰성 메시지를 자동으로 요청할지 설정합니다.

notification

enable

"true" | "false"

알림 기능을 사용할지 설정합니다.

handler

"[클래스 이름]"

알림 수신시 처리할 핸들러를 구현한 클래스를 설정합니다.

기본 값은 “DefaultNotificationManagerHandler” 입니다.

빌드 환경 설정

iOS 프로젝트를 생성하면서 기본으로 만들어진 AppDelegate.h, AppDelegate.m 파일과 main.m 파일을 넥사크로 환경에 맞게 수정합니다.

AppDelegate.h

생성된 앱 델리게이트가 넥사크로 AppDelegate를 상속받도록 수정합니다. 파일을 다음과 같이 수정하여 nexacro.framework가 동작할 수 있도록 합니다.

//
//  AppDelegate.h
//  HelloiOS
//

#import <UIKit/UIKit.h>
#import <nexacro/NexacroAppDelegate.h>
#import <nexacro/NexacroMainViewController.h>

@interface AppViewController : NexacroMainViewController
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
@end

@interface AppDelegate : NexacroAppDelegate <UIApplicationDelegate>
-(NexacroMainViewController*)initializeMainViewController;
@end

AppDelegate.m

AppDelegate.m 파일에서는 넥사크로 스튜디오에서 만든 start_ios.json 파일이 배치된 서버 URL 주소를 지정합니다. 아래 코드에서 굵게 표시된 부분을 사용자의 환경에 맞게 수정합니다.

//
//  AppDelegate.m
//  HelloiOS
//

#import "AppDelegate.h"
#import <nexacro/NexacroWKWebViewDelegate.h>

@interface WebViewDelegate : NexacroWKWebViewDelegate
@end

@implementation AppViewController

// 자동 회전 지원 여부 (return: YES|NO)
- (BOOL)shouldAutorotate
{
    return YES;
}

// 회전방향 지원 여부 확인 (return: 회전 방향의 비트값이 설정된 플러그)
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

@end

@implementation AppDelegate
    
- (NexacroMainViewController*)initializeMainViewController
{
    NSString *bootstrapUrl = @"http://[URL]/start_ios.json";

    [[NexacroResourceManager sharedResourceManager] setBootstrapURL:bootstrapUrl isDirect:NO];
    
    // WKWebView에서 발생하는 delegate 이벤트가 필요 없는 경우 초기화
    // AppViewController* controller = [[AppViewController alloc] initWithFullScreen:NO];
    
    // WKWebView에서 발생하는 delegate 이벤트를 받아야 할 경우 초기화
    WebViewDelegate* webviewDelegate = [[WebViewDelegate alloc] init];
    AppViewController* controller = [[AppViewController alloc] initWithFullScreen:NO
                                                               andWebviewDelegate:webviewDelegate];

    return controller;
}
    
@end

// WKWebView의 delegate 이벤트를 받기 위해 AppViewController를 초기화할 때 전달하는 구현체
@implementation WebViewDelegate

#pragma mark - WKWebView - WKNavigationDelegate
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
    [super webView:webView didFinishNavigation:navigation];
    
    // 콘텐츠 데이터 로딩이 완료되는 시점
}
@end

main.m

UIApplicationMain 함수는 UIKit 프레임워크에서 제공하는 기본 함수로 앱의 시작점입니다. 앱의 구동에 필요한 사전 준비를 하고 메인 루프를 시작해 사용자의 입력을 받을 준비를 합니다.

main.m 파일을 아래와 같은지 확인하고 다르면 수정합니다.

//
//  main.m
//  HelloiOS
//

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

기타 설정

'Build Settings' 항목에서 일부 설정을 수정해주어야 합니다.

Build Settings > Architectures > Build Active Architecture Only

Debug: No
Release: No
Build Settings > Apple LLVM 9.0 - Language - Object C > Objective-C Automatic Reference Counting

Yes

네트워크 연결 없는 앱 실행 설정

넥사크로 스튜디오에서 앱을 패킹할 때 Update Type을 Local이나 Update(Local+Server)으로 설정하면 네트워크 연결 없이도 앱을 실행 할 수 있습니다. 일반적으로 네트워크 연결이 필요 없는 경우에는 Local 타입을 사용하고, 네트워크가 연결된 상태에서 앱 실행 후 로컬 파일로 앱을 동작해야 할 경우에는 Update(Local+Server) 타입을 사용할 수 있습니다. 이처럼 네트워크 연결이 필요 없거나 문제 발생 시 앱 단독으로 실행이 가능하게 하려면 앱 빌드 시 실행에 필요한 파일을 적재하여 배포해야 합니다.

앱 실행에 필요한 파일은 모듈, 소스, 리소스 그리고 Run.zip과 start_ios.json으로 넥사크로 스튜디오에서 Packing(Archive&Update)을 수행하여 얻을 수 있습니다. 이 파일을 Xcode 프로젝트에서 archive 폴더에 적재한 후 앱을 빌드하면 네트워크 연결 없이도 앱을 실행할 수 있습니다.

넥사크로 스튜디오에서 Packing(Archive&Update)시 Update Type을 Local로 설정한 때도 Xcode 프로젝트의 AppDelegate.m에서 부트스트랩 URL은 반드시 설정해야 합니다.

예를 들면, 다음과 같이 가상의 주소나 실제 사용하지 않는 임의의 주소로 설정해도 무방합니다.

NSString *bootstrapUrl = @"http://192.168.0.1/_ios_/start_ios.json";

1

Finder에서 archive 폴더를 생성하고 모듈, 소스, 리소스 파일을 복사합니다.

Finder를 실행한 후 Xcode 프로젝트 경로의 하위에 archive 폴더를 생성합니다. 그리고 넥사크로 스튜디오에서 [Packing (Archive&Update)]으로 생성한 파일들을 다음과 같이 archive 폴더로 복사합니다.

01_Finder에_폴더생성및파일복사

2

Xcode 프로젝트에 archive 폴더를 추가합니다.

Xcode의 프로젝트 탐색기 하단의 + 버튼을 클릭하여 [Add Files to "프로젝트명"]을 선택합니다.

02_Xcode_파일추가

archive 폴더를 선택하고 폴더 추가 옵션에서 "Create folder references"을 선택 후 Add 버튼을 클릭합니다.

03_Xcode_파일추가2

3

폴더 및 파일이 프로젝트에 정상적으로 추가되었는지 확인합니다.

Xcode의 프로젝트 탐색기에서 archive 폴더 및 파일이 정상적으로 추가되었는지 확인합니다.

04_Xcode_확인

Xcode의 프로젝트 탐색기에 표시되는 폴더는 노란색과 파란색의 두 가지로 표시됩니다. 노란색 폴더는 Xcode에서 프로젝트 구성을 표시하기 위해 존재하는 논리적인 그룹을 표시하며 실제로는 존재하지 않습니다. 파란색 폴더는 실재하는 물리적인 폴더를 표시합니다. 빌드 수행시 노란색 폴더의 파일은 앱의 루트 디렉터리에 포함되며 파란색 폴더의 파일은 폴더 구조를 유지한 채 포함됩니다.

앱 테스트

iOS 단말기를 PC에 USB로 연결해 바로 테스트하거나 시뮬레이터에 연결해 테스트할 수 있습니다. 단말기를 직접 연결하는 경우에는 단말기에 적절한 프로파일이 설치되어 있어야 합니다.

  1. Xcode 상단의 Target Name을 클릭하여 다음과 같이 앱을 구동시킬 iOS 단말기 혹은 시뮬레이터를 선택합니다.

select_device_01

select_device_02_01

  1. Run 기능을 수행합니다. 화면 상단의 아이콘을 직접 클릭하거나 Xcode 메뉴에서 실행할 수 있습니다.

select_device_01

Product > Run

project_new_13_resize