2016년 3월 18일 금요일

안드로이드에 addJavascriptInterface --> iOS swift ( Native와 Web javascript의 연동 방법)

미션은 다음과 같았다. 본인 인증을 하는 웹사이트에 어떤 키값을 주고 페이지 요청을 하면
본인 인증 관련 웹페이지가 처리되고 처리 결과를 네이티브 코드에서 받아서 처리 해야 한다.

iOS에서 Native와 Web간에 연동을 하기 위한 방법이 존재 할 것이다.
근데 문제는 모른다! 시간도 없다.

나에게 주어진건 안드로이드에서 Java스크립트와 연동을 하는 아주 짧은 코드!

그리고 아래와 같은 설명을 주었다.

이하 설명 —-

 mWebAppInterface = new WebAppInterface(this, this); // (컨텍스트, 콜백 인터페이스)
- 웹뷰 선언
        mWebView = (WebView) findViewById(R.id.webview);
- 웹뷰에 자바스크립트와 인터페이스 설정
        mWebView.getSettings().setJavaScriptEnabled(true);// javascript를 실행할 수 있도록 설정, 사용시 취약점 (주의)
        mWebView.addJavascriptInterface(mWebAppInterface, "Android"); //---- 여기가 중요#### 자바스크립트와 연결되는 부분

- 다음은 자바스크립트 동작에 반응 호출 연결부 클래스 파일 부분
public class WebAppInterface {
    Context mContext;
    private TaskWebCallback mWebCallback; 

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c, TaskWebCallback webcallback) {
        this.mContext = c;
        this.mWebCallback = webcallback;
    }

/** Show a toast from the web page */ //다음은 인증후에 넘어오는 값
    @JavascriptInterface  
    public void showToast(String mycode, String mymsg, String requestnumber, 
    String responsenumber, String birthdate, String gender, String name, String nationalinfo) {
    //처리코드(고객idx),메시지,요청 번호,나신평응답 번호,생년월일(YYYYMMDD),성별(0:여성 / 1:남성),인증 고객 실명,국적 정보(0:내국인 / 1:외국인)

mWebCallback.mywebcallBack(mycode, mymsg, requestnumber, responsenumber, birthdate, gender, name, nationalinfo);   //이것은 웹뷰로 콜백 넘김

//나머지는 웹뷰에서 콜백으로 받아서 처리하면 끝. 
      }
}




위 내용을 안드로이드 개발자라면 팍하면 퍽하고 알아들을수 잇겠지만
난 모른다.! 난 자바도 모르고 안드로이드도 모른다.

 관련 내용은 

이런 사이트에서도 존재 하며 안드로이드와 자바 스크립트 간에 연결은 무척 쉬은듯 하다.

어째든 나의 미션은 자바 스크립트 속에 

showToast(String mycode, String mymsg, String requestnumber, 
    String responsenumber, String birthdate, String gender, String name, String nationalinfo)
의 형태의 함수가 불려지면 

네이티브에서 받아서 처리 해야 한다.

해결 방벙은 


이양반에 코드를 참고 해서 해결 하였다. 정말 고마운 분이다.
아래에 코드가 위 자바 코드에 showToast 인터페이스를 삽입하는 똑같은 모양이다.

import Foundation
import JavaScriptCore
import UIKit

@objc protocol MyExport : JSExport
{
    // 함수 이름과 함수 형태 그리고 _ 파라메터가 중요!
    func showToast(mycode :String, _ mymsg : String , _ requestnumber :String, _ responsenumber :String, _ birthdate :String, _ gender :String, _ name :String, _ nationalinfo :String)
}


class JSInterface : NSObject, MyExport
{
    func showToast(mycode: String, _ mymsg: String, _ requestnumber: String, _ responsenumber: String, _ birthdate: String, _ gender: String, _  name: String, _ nationalinfo: String) {
        print("\(mycode) \(mymsg) \(requestnumber) \(responsenumber) \(birthdate) \(gender) \(name) \(nationalinfo)”)
// 여긴 로직

}


import UIKit

class AuthViewController: UIViewController {
    
    var idx = ""  // 멤버 idx

    @IBOutlet weak var webView : KWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //노티 피케이션 등록 : 이 노티는 JSInterface에서 날리고 받으면 백 한다.
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "NotiAction", name: "AUTH_WEB_END", object: nil)


        
        let url = NSURL(string: "http://m.radeliver.co.kr/auth/app_checkplus_main.php")
        
        let request = NSMutableURLRequest(URL: url!)
        
        request.HTTPMethod = "POST"
        
        let userCredentials: String = "USERID=\(idx)"
        
        request.HTTPBody = userCredentials.dataUsingEncoding(NSUTF8StringEncoding)
        self.webView.addJavascriptInterface(JSInterface(), forKey: "Android")
        self.webView.loadRequest(request)
        
    }
}




여기에 살짝 로직을 넣어서 문제를 해결 하였다.

2016년 3월 16일 수요일

iOS swift GA (Google Analytics) 추가 하기

https://developers.google.com/analytics/devguides/collection/ios/v3/?ver=swift#get-config

여기 좀 친절 하게 설명 되어 있다.

CocoaPods 을 이용해서 일단 구글 SDK를 프로젝트에 추가 한다.

pod init
Open the Podfile created for your application and add the following:
pod 'Google/Analytics'
Save the file and run:
pod install
This creates an .xcworkspace file for your application. Use this file for all future development on your application.

컨피규 레이션 파일을 받아서 프로젝트에 추가 해야 하는데 
GoogleService-Info.plist

이걸 받으려면 먼저 

Google Analytics 사이트에서 보고서 계정을 만들어야 한다.

만든 다음 트랙킹 아이디를 복사해 두고 구글 디벨로퍼 계정에서 적당한 앱 이름과 번들
아이디를 입력하고 트랙킹 아디를 입력하면
GoogleService-Info.plist를 내려 받을수 있다.

AppDelegate 소스에 didFinishLanchingWithOptions 메서드에 아래 코드를 넣는다.
GoogleService-Info.plist 설정이 잘못 되면 ASSERT 된다.

        //GA
        // Configure tracker from GoogleService-Info.plist.
        var configureError:NSError?
        GGLContext.sharedInstance().configureWithError(&configureError)
        assert(configureError == nil, "Error configuring Google services: \(configureError)")
        
        // Optional: configure GAI options.
        let gai = GAI.sharedInstance()
        gai.trackUncaughtExceptions = true  // report uncaught exceptions
        gai.logger.logLevel = GAILogLevel.Verbose  // remove before app release


이제 추적 하는 모든 화면에 화면 이름을 코딩 하면 된다.
        // Google Analytics SCREEN TRACKING
        let tracker = GAI.sharedInstance().defaultTracker
        tracker.set(kGAIScreenName, value: "<#Code#>")
        
        let builder = GAIDictionaryBuilder.createScreenView()
        tracker.send(builder.build() as [NSObject : AnyObject])

스니핏으로 등록을 해두던 아니면 그냥 계속 복사 붙여 넣기를 하던
모든 ViewController에 viewWillAppear() 메서드에 위 코드를 적당한 화면 이름으로 추가 한다.

이제 이 앱이 구동 하면서 트래킹 정보를 구글에 날릴 것이고 
어느 화면을 많이 보는지 알 수 있다.





2016년 3월 9일 수요일

cocoapod 사용하기

https://cocoapods.org

github에서  좋은 라이브러리를 찾으면 pod install  이런 내용이 보이곤 했다.
머지? 하면서 그냥 무시하고 내려 받고 코드 확인 하고 그냥 내프로젝트에 끌어 놓기 하고
잡아 쓰고 그랬다.

그러다가...

GCM 구글 클라우드 메시지 이넘을 쓰려고 하니
https://developers.google.com/cloud-messaging/ios/start?ver=swift&hl=ko

cocoapods 으로 관련 SDK를 프로젝트에 추가 해야 한다.

그래서 나도 이제 cocoapods를 쓰게 됬다.

거두 절미 하고 나처럼 바로 쓰고 싶은 유저를 위해 간략한 사용방법을 기술 한다.

설치
$ sudo gem install cocoapods

$ pod setup

이제 본인의 xcode 프로젝트 경로에 가서
$ pod init

이렇게 하면 Podfile이 생성된다.

githup에서 사용하고 싶은 라이브러리를 찾았다. 거기에 이런 글이 보일 것이다.


platform :ios, '8.0'
use_frameworks!

target 'MyApp' do
    pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git'
end

Podfile을 위 처럼 편집 하면  SwiftyJSON 라이브러리를 사용하겠다. 는 것이다.

$ pod install

이렇게 하면 자동으로  workspace 파일이 생성되고 이제부터 프로젝트를 워크스페이스 파일로 열면 해당 라이브러가 포함되서 사용 할 수 있다.

GCM, SwiftyJSON, Alamofire 등등을 잡아 쓰는 내 프로젝트에 Podfile 되겠다.

platform :ios, '8.0'
use_frameworks!
source 'https://github.com/CocoaPods/Specs.git'

target 'myappname' do
    
pod 'Google/CloudMessaging'

pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git'

pod 'Alamofire', '~> 3.0'

pod 'Alamofire-SwiftyJSON', :podspec => 'https://raw.githubusercontent.com/pdutourgeerling/Alamofire-SwiftyJSON-Podspec/master/Alamofire3-SwiftyJSON.podspec'


end

2016년 3월 5일 토요일

요런 에러 해결 법 : The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

webView로 특정 URL을 표시 하려 했더니 표시가 되지 않는다. 이런 경우 어찌 해야 하나?

먼저 웹뷰 딜리게이트 함수들을 만들어서 에러를 출력 해보았다.
    func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        print("LOAD FAILED : \(error!.localizedDescription)\n")

    }

침착하게 출력된 것을 확인 하니

LOAD FAILED : The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

구글링을 하니 Info.plist에 항목을 추가 해야 한다.


<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>


모두 허용 하려면 위에 처럼 
난 귀찮으니 이렇게 해서 해결 봤다.

info.plist 를 source 코드로 열어서 위에 xml을 추가하면 끝

http://stackoverflow.com/questions/30731785/how-do-i-load-an-http-url-with-app-transport-security-enabled-in-ios-9

자세하게 처리 하고 싶으면 위 URL을 참고 하면 된다.