9.앱 개발 및 실행 (iOS)

9.1사전 준비

iOS 앱을 개발하고 배포하기 위해서는 아래와 같은 사전 준비가 필요합니다. 각 단계에 필요한 상세 작업은 Apple에서 제공하는 가이드를 참고하세요.

넥사크로 스튜디오에서 생성한 애플리케이션을 디바이스에서 실행하기 위해서는 설치할 수 있는 앱 형태로 빌드하는 작업이 필요합니다. 빌드 작업을 위해서는 Xcode, iOS SDK가 필요합니다.

관리자 가이드에서는 Xcode 7.3.1 버전을 기준으로 설명합니다.

Xcode 버전이 업데이트되면서 일부 메뉴 및 동작이 변경될 수 있습니다.

9.2앱 프로젝트 개발 및 빌드

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

9.2.1프로젝트 생성

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

File > New > Project

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

그림 9-1스크린샷 2013-09-12 오전 11.26.19

Product Name과 필요한 항목을 지정하고 프로젝트를 생성할 위치를 지정한 후 'Create' 버튼을 클릭합니다.

그림 9-2스크린샷 2013-09-12 오전 11.27.18

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/

9.2.2넥사크로플랫폼 라이브러리 설정

iOS 프로젝트에서 넥사크로플랫폼에 최적화된 환경을 만들기 위해 추가로 제공되는 넥사크로플랫폼 라이브러리 파일을 설정해주어야 합니다. 프로젝트를 선택하고 'Frameworks' 폴더를 추가합니다.

넥사크로플랫폼 라이브러리는 압축 파일 형태로 제공되며 nexacro14.framework.zipiOS 개발 환경:nexacro14.framework.zip이라는 파일명으로 제공됩니다. 제공되는 파일은 압축을 풀어 생성된 프로젝트의 Frameworks 폴더로 끌어다 놓습니다.

그림 9-3스크린샷 2013-09-12 오전 11.37.56

9.2.3추가 라이브러리/프레임워크 설정

iOS에서 제공하는 API를 사용하는 데 필요한 라이브러리와 프레임워크를 설정합니다. 프로젝트 아래 Frameworks 폴더를 선택하고 TARGETS 항목을 선택하면 화면 상단에 'Build Phases' 라는 탭을 확인할 수 있습니다. 해당 탭을 선택하고 'Link Binary With Libraries' 항목을 선택합니다. 추가된 넥사크로플랫폼 라이브러리를 확인할 수 있습니다.

그림 9-4스크린샷 2013-09-12 오후 1.07.35

하단에 있는 + 버튼을 클릭해 14개 항목을 추가합니다. 추가할 항목은 아래와 같습니다.

프로젝트 개발 환경에 따라 아래 명시된 항목 외 라이브러리나 프레임워크를 추가해야 할 수도 있습니다. 문제가 생기는 경우 Xcode 에러 메시지를 확인해주시고, 필요한 항목을 추가해주세요.

libz.1.2.5.tbd

libsqlite3.0.tbd

MessageUI.fremawork

SystemConfiguration.framework

CoreMedia.framework

MobileCoreServices.framework

QuartzCore.fremawork

MediaPlayer.fremawork

CoreLocation.fremawork

CFNetwork.fremawork

AVFoundation.fremawork

AudioToolbox.framework

AddressBookUI.fremawork

AddressBook.fremawork

2015년 6월 이후 넥사크로플랫폼 버전을 사용하는 경우에는 아래 2개 항목을 추가해야 합니다.

Security.framework

libc++.tbd

2018년 3월 이후 넥사크로플랫폼 버전을 사용하는 경우에는 아래 3개 항목을 추가해야 합니다.

Eventkit.framework

AssetsLibrary.framework

Photos.framework

2019년 12월 이후 넥사크로플랫폼 버전을 사용하는 경우에는 아래 항목을 추가해야 합니다.

WebKit.framework

추가된 라이브러리/프레임워크가 프로젝트 바로 아래에 추가된 경우에는 Frameworks 폴더 아래로 끌어다 놓습니다.

9.2.4리소스 설정

앱에서 사용할 로딩 이미지, 아이콘, 메시지, 레이아웃 등을 설정하는 단계입니다.

아이콘 이미지 설정

iOS 앱에서 사용하는 아이콘과 스플래시 이미지는 개별적으로 지정합니다. 미리 만들어진 파일을 가져와 연결할 수 있습니다. 프로젝트를 선택하고 TARGETS 항목을 선택하면 화면 상단에 'General' 탭을 확인할 수 있습니다.

해당 탭을 선택하고 하단 항목 중 'App Icons Source' 항목 옆에 화살표 버튼을 클릭하고 맞는 크기의 파일을 끌어다 지정합니다.

항목별 아이콘 이미지 크기는 아래와 같습니다.


1x

2x

3x

20pt (Notification icon)

20px x 20px

40px x 40px

60px x 60px

29pt (Settings icon)

29px x 29px

58px x 58px

87px x 87px

40pt (Spotlight icon)

40px x 40px

80px x 80px

120px x 120px

60pt (iphone icon)


120px x 120px

180px x 180px

76pt (iPad icon)

76px x 76px

152px x 152px


83.5pt (iPad Pro icon)


167px x 167px


스플래시 이미지 설정

스플래시 이미지 사용을 위해 프로젝트에 폴더를 생성하고 이미지를 추가합니다. 스플래시 이미지의 경우 복잡하지 않은 이미지인 경우에는 해상도별로 이미지를 생성하지 않고 하나의 크기(750px x 1334px)로 대체할 수 있습니다.

Xcode에서 사용할 스플래시 이미지를 위해 Asset Catalog를 생성합니다.

Editor > Add Assets > App Icons & Launch Images > New iOS Launch Image

크기에 맞는 파일 또는 하나의 크기(750px x 1334px)로 생성된 파일을 끌어다 지정합니다.

프로젝트를 선택하고 TARGETS 항목을 선택합니다. 화면 상단 'General' 탭을 선택하고 'Launch Images Source' 항목 옆에 'Use Asset Catalog' 버튼을 선택한 후 표시되는 화면에서 [Migrate] 버튼을 선택합니다. 'Launch Images Source' 항목에서 새로 생성한 Asset Catalog 를 선택하고 'Launch Screen File' 항목 값은 삭제합니다.

메시지 설정

앱 실행 시 사용할 메시지를 설정합니다. 먼저 Supporting Files 폴더 아래 새로운 파일을 생성합니다. 폴더를 선택하고 컨텍스트 메뉴에서 'New File'을 선택합니다. 화면에 보이는 템플릿 중에서 'Strings File'을 선택하고 파일명은 'Localizable'로 입력합니다.

그림 9-5스크린샷 2013-09-13 오전 10.55.46

생성한 파일을 선택한 상태에서 오른쪽 창에서 Localization 항목 내에 'Localize' 버튼을 선택하고 원하는 언어를 선택합니다.

그림 9-6스크린샷 2013-09-13 오전 10.57.46

프로젝트를 선택한 상태에서 Info 탭을 확인하면 Localizations 항목에 선택한 언어가 추가된 것을 확인할 수 있습니다. 하단에 있는 '+' 버튼을 선택하면 원하는 언어를 추가할 수 있으며 추가된 언어는 프로젝트 폴더에서도 확인할 수 있습니다.

그림 9-7스크린샷 2013-09-13 오전 11.04.57

생성된 Localization.strings 파일은 아래와 같이 수정하고 추가된 언어도 적절하게 수정합니다.

"needupdate" = "It is need to update.";
"loadingFail" = "First loading is fail.  \r\nPlease restart.";
"updateFail" = "Update is fail.  \r\nPlease restart.";
"notexist" = "Start file is NOT exist.  \r\nPlease restart.";
"BeingUpdated" = "Being updated.";
"wantreplace" = "There is a file of the save 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 updates.";
"installforupdates" = "Install for updates.";
"downloadingforupdates" = "Downloading for updates.";
"force_close" = "Update is Completed.";

커스텀 폰트 설정

14.0.1.3400 이후 버전은 WKWebView 기반으로 제품 라이브러리를 변경했습니다.

해당 버전에서 커스텀 폰트 사용 시에는 아래와 같이 적용할 수 있습니다.

  1. Xcode에서 설정한 폰트와 plist에 등록한 폰트 설정을 삭제합니다.

  2. 넥사크로 스튜디오에서 아카이브 파일 생성 시 폰트 파일을 포함하도록 구성합니다.

  1. 생성된 Run.zip 파일 내 Run.html 파일에 아래와 같이 <style> 태그를 추가하고 다시 압축 파일을 생성합니다.

    src 설정 경로는 넥사크로 스튜디오의 아카이브 파일 생성 구조에 맞춥니다.

<head>
...
    <style id="userfont">
    @font-face {
        font-family: 'NanumSquare';
        src: url(./Fonts/NanumSquareR.ttf) format('truetype')
    }
    @font-face {
        font-family: 'NanumSquare Bold';
        src: url(./Fonts/NanumSquareB.ttf) format('truetype')
    }
    </style>
...
</head>

9.2.5코드 파일 설정

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

AppDelegate.h

생성된 애플리케이션 델리게이트가 넥사크로플랫폼 AppDelegate를 상속받도록 수정합니다. 관련된 파일을 다음과 같이 수정하여 nexacro14.framework이 동작할 수 있도록 합니다.

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

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

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

AppDelegate.m

아래 코드에서 start_ios.json 파일을 지정한 부분은 넥사크로 스튜디오에서 만든 start_ios.json 파일이 배치된 서버 URL을 지정합니다.

#import "AppDelegate.h"

@implementation AppViewController
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    //return NO;
    return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
@end

@implementation AppDelegate
-(NexacroMainViewController*) initializeMainViewController;
{
    NSString *bootstrapUrl = @"http://example.com/start_ios.json";
    [[NexacroResourceManager sharedResourceManager] setBootstrapURL:bootstrapUrl isDirect:NO];
    AppViewController* controller = [[AppViewController alloc] initWithFullScreen:NO];
    return controller;
}
@end

isDirect 옵션은 부트스트랩 URL에 접근하는 방식을 지정합니다. 기본값은 "NO"로 설정합니다.

iOS 운영체제 쿠키를 사용해야 하거나 WebBrowser 컴포넌트에서 callMethod를 사용해야 한다면 isDirect 항목값을 "YES"로 수정해주어야 합니다. 아래 제약사항을 참고해주세요.

iOS 운영체제에서 WKWebView 관련 제약

main.m

Supporting Files 폴더 아래에 있는 main.m 파일을 아래와 같이 수정합니다.

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

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

9.2.6빌드 환경 설정

Build Settings

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

Build Settings > Linking > Other Linker Flags

Debug

-lxml2

Release

-lxml2

Build Settings > Search Paths > Header Search Paths

Debug

/usr/include/libxml2

Release

/usr/include/libxml2

Build Settings > Architectures > Build Active Architecture Only

Debug

No

Release

No

Build Settings > Architectures > Vaild Architectures

Debug

armv7 armv7s

Release

armv7 armv7s

Build Settings > Apple LLVM *.* - Language - objective C

Objective-C Automatic Reference Counting

No

Build Settings > Build Options

Enable Bitcode

No

그림 9-8스크린샷 2013-09-13 오전 11.51.04

iOS 버전이 올라가면서 사용자 동의 후 접근이 가능한 기능에 권한 요청을 위한 설정, 또는 기능 추가로 인한 설정이 필요할 수 있습니다. iOS 버전에 따라 Architectures 항목을 추가합니다.

ARMv7 : iPhone 3GS, iPad(2010), iPhone 4, iPod touch, iPad2, iPhone 4S, (new)iPad, iPad mini

ARMv7s : iPhone 5, iPad(2012), iPhone 5c

ARM64 : iPhone 5S, iPad Air, iPad mini 2, iPhone 6, iPhone 6 plus, iPad Air 2, iPad mini3

Info

Info 항목에서 설정 내용을 확인합니다. Bundle Name에서 지정한 값은 앱의 이름이며 Bundle identifier에서 지정한 값은 앱을 구분하는 값입니다.

Info.plist

Info.plist 파일을 선택하고 일부 설정을 수정합니다. 'App Transport Security Settings' 항목을 추가하고 하위에 'Allow Arbitrary Loads'를 추가합니다. 값을 'YES'로 설정합니다. 그리고 'View controller-based status bar appearance' 항목을 추가하고 값을 'NO'로 설정합니다.

위치정보 사용 및 카메라, 사진 앨범 접근 설정을 info.plist에 추가합니다.

Code Singing

시뮬레이터로 테스트하는 경우에는 별도의 인증 과정 없이 테스트를 진행할 수 있습니다. 하지만 실제 단말기에 연결하려면 추가적인 설정이 필요합니다.

'Code Signing' 항목에서 'Code Signing Identity' 항목을 아래와 같이 적절한 프로파일로 설정합니다.

그림 9-9스크린샷 2013-09-13 오후 2.45.54

'Provisioning Profile' 항목에서 프로비저닝 프로파일을 설정합니다.

사용할 수 있는 인증서는 키체인에서 확인할 수 있으며 프로비저닝 프로파일은 Xcode(Preferences > Accounts)에서 확인할 수 있습니다.

9.3앱 테스트

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

그림 9-10스크린샷 2013-09-13 오후 2.30.20

  1. 테스트를 진행할 대상을 먼저 선택하고 Xcode에서 Run 기능을 수행합니다. 화면 상단의 아이콘을 직접 클릭하거나 아래 메뉴에서 실행할 수 있습니다.

Product > Run