플랫폼사용을위한 ios Native Guide
- 목차 - - ios 개발환경및유의사항. - 플랫폼 ios Project. - Native Controller와플랫폼화면연동. - 플랫폼 Web(js)-Native 간데이터공유. - 플랫폼확장 WN Interface 함수개발. - Network Manager class 개발. - Native Controller에서 Network Manager 사용하기.
ios 개발환경및유의사항. - ios 개발환경 Xcode 5.x 이상버전 (OS X) - 유의 ( 주의 ) 사항 (* 주의 ) 인증서 (APP, PUSH) 사용기간 365일 (1년) 인증서만료전에인증서 (APP, PUSH) 를갱신 (60일전부터가능 ) 해야함. 참고사이트 https://developer.apple.com/kr/support/technical/certificates/ https://developer.apple.com/kr/support/ios/program-renewals.html
플랫폼의 ios Project(1/4) - ios project file 설명. 파일 설명 ExPPDefaultNetworkIndicator - Network Manager 에서사용되는전문통신중 indocator 출력을위한 class. HttpDefaultNetworkManager - 플랫폼의화면 (js) 또는 native network api 에서전달된데이터를조합하여전달하는기능을담당하는 network class. HttpDefaultFileDownloader HttpDefaultResourceDownloader - 플랫폼의리소스업데이트시서버의 zip 파일을다운로드받는기능을수행하는 class. PPHttpDefaultManagerDataVo PPHttpDefaultManagerDataVoFactory PPHttpDefaultManagerHead PPHttpDefaultManagerJsonVo - HttpDefaultNetworkManager class 에서사용 - req/rsp data 를처리하는편의 class.(json String data)
플랫폼의 ios Project(2/4) - ios project file 설명. 파일 설명 MCoreAppDelegate - Application Delegate class - 플랫폼을 start-up 시킴. start-up code [MPAppMain mcoreinitwithhistory:history parameters:parameter] PPHybridViewController - 플랫폼의기본 HTML 화면을표시하기위해서사용되는 class - 내부멤버로 UIWebView 를가지고있음. ExtendWNInterface - 플랫폼의확장 WN 함수추가시해당파일에 method 를추가. PPIndicatorUtil - 플랫폼의화면전환시 indicator 표시를담당하는 class PPAppDelegate - Application Delegate MCoreAppDelegate 의 child class
플랫폼의 ios Project(3/4) - ios project file 설명. 파일 설명 /MLibrary/MCore.framework - 플랫폼의 Core 라이브러리. /MLibrary/MCore.license - 플랫폼의 license 라이브러리. /MLibrary/MNet.framework /MLibrary/Mxxxyyy.framework /res/manifest.xml - 플랫폼의 Addon, Plugin 라이브러리. - 플랫폼의 App 설정파일. /res/mcore.mobile.lic - 플랫폼의 license 파일. (*) read only file.
플랫폼의 ios Project(4/4) - ios Project 에 res 폴더추가하기 단계 방법 1 단계 - 메뉴 Xcode File Add Files to 추가할프로젝트 클릭. - 단축키 option + command + A 입력. 2 단계 3 단계 - Folders 의 Create folder references for any added folders 선택. - Add to targets 추가할프로젝트 선택. - 추가완료. (*) check : res 폴더가하늘색으로표시되어야함.
Native Controller 와플랫폼화면연동 (1/3) - Native Controller? UIViewController 또는 PPNativeViewController를이용하여생성한 Controller. PPNativeViewController를 parent class로설정해야아래의 native api 사용가능함. - 플랫폼의화면이동 native api? 화면이동 Native Controller 플랫폼화면 (HTML) Native Controller Native Controller Native Controller 이전화면 - (void) movetowebonnewactwithurl:(nsstring*)url paramobj:(ppparameters *)pparameters action:(ppactiontype)pactiontype orient:(ppsupportorientation)porientationtype animation:(ppanimationtype)panimationtype; - (void) movetonativeactwithclass:(class)classname paramobj:(ppparameters *)pparameters action:(ppactiontype)pactiontype orient:(ppsupportorientation)porientation animation:(ppanimationtype)panimationtype; API - (void) historybackwithparamobject:(ppparameters *)pparameters animation:(ppanimationtype)panimationtype; Native Controller PPActionClearTop 이동 - (BOOL) movecleartop:(nsstring *)pkey params:(ppparameters*)pparameters animation:(ppanimationtype)panimationtype;
Native Controller 와플랫폼화면연동 (2/3) - 플랫폼의화면이동 native api 예제 화면이동 Native Controller 플랫폼화면 (HTML) Native Controller Native Controller Native Controller 이전화면 // /www/html/yepp.html 으로이동하는예제 [self movetowebonnewactwithurl:@"/www/html/yepp.html" paramobj:nil action:ppactionnewscreen /* PPActionNewScreen PPActionNoHistory PPActionClearTop */ orient:ppsupportorientationall animation:ppanimationdefault]; // SampleTwoNativeViewController 으로이동하는예제 [self movetonativeactwithclass:[sampletwonativeviewcontroller class] paramobj:nil action:ppactionnewscreen /* PPActionNewScreen PPActionNoHistory PPActionClearTop */ orient:ppsupportorientationall animation:ppanimationdefault]; // 이전화면으로이동하는예제 [self historybackwithparamobject:nil animation:ppanimationdefault]; 예제
Native Controller 와플랫폼화면연동 (3/3) - 플랫폼의화면이동 native api 의파라미터 파라미터파라미터정의비고 PPAnimationType typedef enum PPAnimationType { PPAnimationDefault, PPAnimationSlideLeft, PPAnimationNone, PPAnimationZoomIn,... PPAnimationModalUp, PPAnimationModalDown, PPAnimationModalLeft, PPAnimationModalRight } PPAnimationType; - 화면전환간의애니메이션설정. PPActionType typedef enum PPActionType { PPActionNewScreen, PPActionNoHistory, PPActionClearTop, // 이하내부화장 TODO PPActionGotoTop,... } PPActionType; - 플랫폼의화면 Stack 관리옵션. PPSupportOrientation typedef enum PPSupportOrientation { PPSupportOrientationDefault, PPSupportOrientationPortrait, PPSupportOrientationLandscape, PPSupportOrientationAll } PPSupportOrientation; - 화면의오리엔테이션설정.
플랫폼웹 (js)-native 간데이터공유 (1/3) - 3가지방식으로플랫폼웹 (js) Native 간데이터공유가가능함. - 공유가능한데이터포맷은 String. 구분설명 native 관련 class 파라미터데이터공유 (1/3) 전역데이터공유 (2/3) 영속데이터공유 (3/3) - 화면전환간에데이터가전달됨. - URL 의 key=value 파라미터전달방식 - memory 저장방식. - 앱 running 중 get/set 가능. - 앱 off 시 memory 에서사라짐. - storage 저장방식. - 앱 running 중 get/set 가능. PPParameters PPAppContext PPAppContext
플랫폼웹 (js)-native 간데이터공유 (2/3) 구분동작웹 (js) 식방식 ( 예제 ) native 방식 ( 예제 ) - 화면이동함수에서아래와같이 param 변수에값을설정. - PPParameters 객체를생성후화면이동함수의파라미터로전달. 파라미터데이터공유 (1/3) SET M.page.back({ param : {'key_a':'b','key_c':'d'} }); PPParameters* param = [[PPParameters alloc] init]; [param setobject:@"'key_a'" forkey:@"b"]; [param setobject:@"'key_c'" forkey:@"d"]; [self historybackwithparamobject:param animation:ppanimationdefault]; [param autorelease]; ( 알림 ) PPNativeViewController class 상속받은 class 에서만사용가능. GET var key_a = M.data.param("key_a"); NSString *key_a = [self.parameters objectforkey:@"'key_a'"]; ( 알림 ) PPNativeViewController class 상속받은 class 에서만사용가능.
플랫폼웹 (js)-native 간데이터공유 (3/3) 구분동작웹 (js) 식방식 ( 예제 ) native 방식 ( 예제 ) M.data.global( g_key, value ); _setglovalvalue(@ g_key, @ value ); 전역데이터공유 (2/3) SET var g_key = M.data.global( g_key ); (*) 알림. _setglovalvalue 는 PPAppContext.h 파일에정의된 macro NSString *g_key = _getglovalvalue(@ g_key ); GET (*) 알림. _getglovalvalue 는 PPAppContext.h 파일에정의된 macro M.data.storage( s_key, value ); _setstoragevalue(@ s_key, @ value ); 영속데이터공유 (3/3) SET var s_key = M.data.storage( s_key ); (*) 알림. _setstoragevalue 는 PPAppContext.h 파일에정의된 macro NSString *s_key = _getstoragevalue(@ s_key ); GET (*) 알림. _getstoragevalue 는 PPAppContext.h 파일에정의된 macro
플랫폼확장 WN Interface 함수개발 (1/6) - WN 확장 Interface? WIKI API 에정의되지않은 Native 함수의추가및사용을 WN 확장 interface 라한다. WN Interface 는 Web and Native Interface 의약어이다. Native 함수의추가는 ExtendWNInterface 파일에추가한다. Objective-C 의 Category 를이용하여소스의모듈화가가능하다. - Native 함수의동기 / 비동기방식의동작지원. 비동기 native 함수의결과값을 js함수 (cb js함수 ) 를통하여화면 (js) 로전달되는방식. 함수호출시 cb js함수의전달또는 prefix된 js함수로결과전달이가능함. 동기 native 함수의 return 값이화면 (js) 으로바로전달되는방식.
플랫폼확장 WN Interface 함수개발 (2/6) - Native 함수정의시, 제약사항. 함수의매개변수타입은 (NSString *) 타입만을지원. 함수의반환 (return) 타입은 (NSString * or void) 타입만을지원. 함수매개변수에적용되는 named parameter의 name은공백 ( ) 이어야함. * 확장 interface 함수개발함수의 proto type. - (void) somemethodwithfirstvalue:(nsstring *)value1 :(NSString *)value2; - (NSString *) somemethodwithfirstvalue:(nsstring *)value1 :(NSString *)value2; * 일반적인 Objective-C 함수의 proto type. named parameter (parameter s name) - (void) somemethodwithfirstvalue:(nsstring *)value1 secondvalue:(nsstring *)value2; - ExtendWNInterface 에서접근가능한객체. _viewctrl -> PPWebViewController(PPHybridViewController) 의 instance. _viewctrl.poperawebview -> UIWebView 의 instance.
플랫폼확장 WN Interface 함수개발 (3/6) - PPHybridViewController 의 _viewctrl 를이용한 javascript 함수호출하기. javascript call method 의 proto type. - (void) callcbfunction:(nsstring *)func withobjects:(nsobject*)fristobject,... NS_REQUIRES_NIL_TERMINATION; javascript call method 의사용예제. - (void) asynctest:(nsstring *)callback :(NSString *)param1 :(NSString *)param2 { [_viewctrl callcbfunction:callback withobjects:@"native set value", param1, param2, nil]; } - PPHybridViewController 의 _viewctrl.poperawebview 를이용한 javascript 함수호출하기. UIWebView 의 stringbyevaluatingjavascriptfromstring 의 proto type. - (NSString *)stringbyevaluatingjavascriptfromstring:(nsstring *)script; UIWebView 의 stringbyevaluatingjavascriptfromstring 의사용예제. NSString *calljavascriptstring = @ ; // TODO [_viewctrl.poperawebview stringbyevaluatingjavascriptfromstring:calljavascriptstring];
플랫폼확장 WN Interface 함수개발 (4/6) - 화면 (js) 에서 native 함수호출. WN2CommonAsync 함수 ( 비동기방식 ). native 의 Objective-C 함수를 async( 비동기 ) 방식으로호출하는 JS 함수. 함수의 prototype void WN2CommonAsync( native function name, [ param, [ param ]]); WN2CommonAsync 함수의사용예제. /* * WN2CommonAsync 함수를사용하는예제. * param1/2 : String * return_cb : javascript function */ function edu_native_callasync(param1, param2, return_cb) { // ExtendWNInterface.m 파일의 // - (void) asynctest:(nsstring *)callback :(NSString *)param1 :(NSString *)param2 함수를호출. WN2CommonAsync("asyncTest", M.buffer.on(return_cb), param1, param2); } // 테스트함수 (edu_native_callasync) 를호출하는함수. function dummy_callasync(param1, param2) { edu_native_callasync(param1, param2, function (native_p1, native_p2) { // javascript 익명함수. var rst = " 비동기응답값 p1 : " + native_p1 + ", p2 : " + native_p2; alert(rst); // 응답값확인. }); }
플랫폼확장 WN Interface 함수개발 (5/6) - 화면 (js) 에서 native 함수호출. WN2Common 함수 ( 동기방식 ). native 의 Objective-C 함수를 sync( 동기 ) 방식으로호출하는 JS 함수. 함수의 prototype [String] WN2Common( native function name, [ param, [ param ]]); WN2Common 함수의사용예제. /* * WN2Common 함수를사용하는예제. * param1/2 : String */ function edu_native_callsync(param1, param2) { // ExtendWNInterface.m 파일의 // - (NSString *) synctest:(nsstring *)param1 :(NSString *)param2 함수를호출후응답을 alert 으로확인. var rtn = WN2Common("syncTest", param1, param2); alert("synctest 리턴값 : " + rtn); }
플랫폼확장 WN Interface 함수개발 (6/6) - 예제 Objective-C Code ExtendWNInterface.m 의일부 /* * 동기방식으로동작하는함수. * param1 : javascript 함수에서넘어온 String. * param2 : javascript 함수에서넘어온 String. */ - (NSString *) synctest:(nsstring *)param1 :(NSString *)param2 { NSString *rtn = [NSString stringwithformat:@"%@%@", param1, param2 ]; return rtn ; } /* * 비동기방식으로동작하는함수. * param callback : 내부동작의응답을처리할 javascript 함수. * param p1 : javascript 함수에서넘어온파라미터 * param p2 : javascript 함수에서넘어온파라미터 * return : 없음. */ - (void) asynctest:(nsstring *)callback :(NSString *)param1 :(NSString *)param2 { NSString *msg = [NSString stringwithformat:@"%@%@", param1, param2 ]; // - (void) callcbfunction:(nsstring *)func withobjects:(nsobject*)fristobject,... NS_REQUIRES_NIL_TERMINATION; // 함수를사용하여화면의 java script 함수를호출. [_viewctrl callcbfunction:callback withobjects:@"native msg", msg, nil]; }
Network Manager Class 개발 (1/3) - WHAT? 플랫폼의 M함수또는 native activity에공통화된 http network interface를제공해주는편의클래스. 기본 network manager. HttpDefaultNetworkManager (site 특성에따라변경가능함.) custom network manager. site 특성에따라기본 network manager를이용하여생성. network manager diagram.
Network Manager Class 개발 (2/3) - HOW? parent class : PPAbstractHttpNetworkManager 구현해야할 protocol PPNetworkManager request 기능. PPHttpProviderDelegate response 기능. @protocol PPNetworkManager <NSObject> - (void) processwithviewctrl:(uiviewcontroller *)ctrl trcode:(nsstring *)trcode data:(nsobject *)data networkoption:(nsobject *)networkoption delegate:(id<ppnetworkmanagerdelegate>)delegate userinfo:(nsarray *)userinfo; @protocol PPHttpProviderDelegate <NSObject> - (void) didfinishhttpprovider:(id)provider header:(nsdictionary *)header body:(nsdata *)body encoding:(nsstringencoding)encoding userdata:(nsarray*)userdata; - (void) didfailhttpprovider:(id)provider errormsg:(nsstring*)errormsg userdata:(nsarray*)userdata;
Network Manager Class 개발 (3/3) - Network Manager 의 requset / response flow JSON Format Data
Native Controller 에서 Network Manager 사용하기 (1/2) - HOW? network request 함수. network request 함수의 proto type /*! 네트워크매니저를사용하여통신하는함수. @param target Manifest.xml에정의된 network name @param trcode 전문코드 @param request request data @param option {PPNetworkOption} 네트워크옵션 @param userdata extends datas */ - (void) netsearchwithtarget:(nsstring *)target trcode:(nsstring *)trcode request:(nsstring *)request option:(ppnetworkoption *)option userdata:(nsarray*)userdata; network request 함수의사용예제. PPNetworkOption* option = [[PPNetworkOption alloc] init]; [self netsearchwithtarget:@"'http_main'" request:@"{}" userdata:nil]; trcode:@"'appinfo'" option:option
Native Controller 에서 Network Manager 사용하기 (2/2) - HOW? parent class 부모 class를 PPNativeViewController로변경해야함. Network Manager 에서 response 를받기위해구현해야할 protocol PPNetworkManagerDelegate protocol @protocol PPNetworkManagerDelegate <NSObject> // (*) 서버와의통신이정상적으로이루어졌을경우 // network manager에서호출되는 call back method. - (void) didfinishnetworkmanager:(id<ppnetworkmanager>)manager targetserver:(nsstring*)targetserver trcode:(nsstring*)trcode response:(nsstring*)response cbfunction:(nsstring*)cbfunction tagid:(nsstring*)tagid jsonuserdata:(nsstring*)jsonuserdata userdata:(nsarray*)userdata; // (*) 서버와의통신에오류가발생하였을경우 // network manager에서호출되는 call back method. - (void) didfailnetworkmanager:(id<ppnetworkmanager>)manager targetserver:(nsstring*)targetserver trcode:(nsstring*)trcode tagid:(nsstring*)tagid jsonuserdata:(nsstring*)jsonuserdata errorcode:(nsstring*)errorcode errormsg:(nsstring*)errormsg userdata:(nsarray*)userdata;