iOS2020. 1. 23. 11:19

생체인증(지문, 얼굴)등으로 인증을 구축하고 할 때 활용하여 사용이 가능하다.

 

지문이나 얼굴일식을 통한 인증관련 모듈이 하드웨어로 되어 있으며 LocalAuthentication.framework를 통해서는 True/False만을 리턴한다.

 

canEvaluatePolicy로 현재 단말이 사용가능한 정책을 확인하고 evaluateEvaluate로 인증수행한다.

 

해당 프레임웍으로 간편인증등에 다양하게 적용이 가능할것이다.

Posted by 삼스

댓글을 달아 주세요

Android2019. 11. 10. 16:57

https://medium.com/ionic-and-the-mobile-web/how-to-write-cordova-plugins-864e40025f2

 

How to write Cordova Plugins

Cordova Plugins are one of the dark arts of hybrid app development, helping web apps running natively access the full power of the device…

medium.com

두가지 방법이 있다. 첫번째는 plugman toole로 빠르게 만들수 있고 또는 기존 플러그인을 복제하여 수정하는 방법이다.

여기서는 복제하여 수정하는 방법을 설명한다.

 

Cordova Device plugin이 선택되었다.

 

 

plugin.xml에 중요한 정보들이 기술된다. src 폴더에는 네이티브 코드가 플랫폼별로 있고 www폴더는 javascript코드가 있다. 

 

이제 나만의 플러그인을 만들기 위해 위코드를 작업을 하기 위한 폴더로 모두 옮겨보자

 

먼저  plugin.xml을 열어서 플러그인아이디를 변경한다. 

여기서는 my-cordova-plugin으로 정했다.

 

javascript code의 위치도 기술한다.

js-module은 실행된 js code에 대해 기술하며 clobber는 window변수를 의미한다. 여기서는 www/plugin.js가 로드되면 이 때 부터 window.MyCordovaPlugin으로 플러그인에 접근가능해진다.

 

다음으로는 지원한 플랫폼에 대해 기술한다.

 

config파일에서 안드로이드 패키지명과 플러그인에서 사용한 코도바 심볼에 대해서 기술하게 되는데 이 경우 MyCordovaPlugin이며 자바코드와 연결된다.

 

iOS의 경우는 

안드로이드와 비슷하다. 플러그인은 swift로 개발이 가능하나 코도바가 objc이어서 인터페이스하는데 비용이 좀 든다.

 

 

자바스크립트의 작성

www/plugin.js의 코드를 살펴보자

echo, getDate를 함수로 갖는 간단한 객체를 정의하고 있다. 실행 시 에 개발자는 다음과 같이 플러그인을 호출할 수 있다.

 

window.MyCordovaPlugin.echo('hello!', function() { // callback

});

 

이코드가 실행되는 순간 마법이 있어나게 되며 안드로이드 혹은 iOS의 네이티브 코드가 실행되어지고 그 결과를 콜백으로 받을 수 있다.

 

 

iOS 네이티브 작성

objc code파트이다. 헤더를 먼저 보자

 

이 헤더파일은 m파일과 대응된다.

 

이 메서드들은 js의 exec()가 실행될 때 호출된다. CDVInvokedUrlCommand 인자가 js로부터 전달한 인자를 넘겨주게 된다. 콜백은 한번만 사용할 지 반복적으로 사용([result setKeepCallbackAsBool]을 호출하여)할지 정할 수 있다.

 

결과를 반환해주려면 CDVPluginResult 객체를 만들고 commandDelegate로 넘겨주면 js까지 전달된다.

 

Android 플러그인 작성

iOS와 컨셉은 동일하다 문법적으로 약간 다를뿐. 다음 코드를 보자 src/android/com/example/MyCordovaPlugin.java

execute메서드 하나에서 action인자로 echo와 getDate메서드를 분기하여 처리하고 있다. 결과를 반환하는 방식은 비슷하다.

 

플러그인 테스트

타이핑 끝났으면 테스트를 하자. 

코도바플러그인을 테스트하려면 Cordova/PhoneGap/Ionic앱이 실행하기 위해 있어야 한다. 단독으로 동작하지 않는다.

 

Cordova 앱이 있다고 가정하면 다음과 같이 로컬에서 플러그인을 추가할 수 있다.

 

cordova plugin add --link ~/git/echo-plugin

 

--link플래그는 심볼릭링크로 플러그인을 추가하는것이며 플러그인을 다시 추가하지 않고 코드를 수정하고 빌드하고 실행할 수 있다는것을 의미한다. 하지만 javascript파트의 코드는 자동으로 업데이트 되지 않을수 있다. 이 때는 cordova rm my-cordova-plugin으로 빠르게 삭제하고 다시 추가하면 된다.

 

여기까지 기존 플러그인을 수정하여 적용하는 방법을 알아 봤다.

이는 좀 해키한 방법이며 권장하는 방법은 아니다.. 따라서 별로 이렇게 하고 싶지는 않다. 일을 빨리 하기 위해서는 이 방법도 괜찮겠지만 plugman으로 하는 방법에 대해서도 정리해서 포스팅할 생각이다!!

 

 

 

Posted by 삼스

댓글을 달아 주세요

Android/App개발2019. 6. 10. 14:15

대거2를 적용하는 3 가지 방법이 있다.

 

1번은 Component, Module, Scope으로 직접 모두 기술하는 방법이고

2번은 DispatchingAndroidInjector로 제공하는 방법

3번은 안드로이드에서 제공하는 기반클래스(DaggerActivity, DaggerFragment, ...)로 제공하는 방법이 있다.

 

여기서는 1번 방식으로 작업하는 방식을 설명한다.

여러가지 구성을 하는 방법이 있겠지만 내가 작업한 방식을 설명한다. 틀린 부분이 있다면 누구든 지적을 해주었으면 한다.

 

안드로이드에서 대거는 전역 및 로컬범위로 다양하게 scope을 지정하여 객체를 주입할 수 있다.

Application레벨은 보통 전역 객체를 Activity레벨은 로컬객체를 주입한다.

 

전역에서 GuiManager를 로컬에서 ItemAdapter를 주입할것이다. 

 

Module을 정의한다.

 

in AppModule.java

 

@Module

public class AppModule {

  private MyApplication mApp;

  public AppModule(MyApplication app) { mApp = app; }

  

  @Provides

  @Singletone

  GuiManager provideGuiManager() { return new GuiManager(); }

}

 

MyApplication을 멤버로 가지고 있으며 Scope을 Singletone으로 GuiManager를 주입하기 위한 Provider를 구현한다.

provide를 prefix로 하여 메서드를 정의하며 해당 클래스의 인스턴스를 생성하여 반환한다.

 

Component를 구현한다.

 

in AppComponent

 

@Singletone

@Component(modules = { AppModule.class }

public interface AppComponent {

  void inject(MyApplication app);

  void inject(MainActivity activity);

}

 

Application에서 GuiManager를 주입하는 예이다.

in MyApplication.java

 

public class MyApplication extends Application {

 

  AppComponent mComponent;

 

  @Inject

  protected GuiManager mGuiManager;

 

  @Override

  public void onCreate() {

    super.onCreate();

    mComponent = DaggerAppComponent.builder().appModule(new AppModule()).build();

    mComponent.inject(this);

  }

 

  public AppComponent getComponent() {

    return mComponent;

  }

 

대거는 주석을 기반으로 코드를 생성하며 Dagger를 prefix로하여 Component builder로 객체를 생성할 수 있다. 이렇게 만들어진 ㅡㅐ여component의 inject()를 호출하면 Module에서 provide prefix로 노출한 객체들이 바인딩되어 진다. 

 

이번에는 액티비티 스콥의 주입예이다. ItemAdapter를 MainActivity에서 주입하여 사용할것이다.

 

ActivityModule을 정의한다.

 

@Module

public class ActivityModule {

  private Activity mActivity;

  public ActivityModule(Activity activity) {
    mActivity = activity; 

  }

  

  @Provides @ActivityScope

  Activity activity() { return mActivity; }

 

  @Provides @ActivityScope

  ItemAdapter provideItemAdapter() {

    return new itemAdapter();

  }

}

 

provide prefix로 itemAdapter를 노출하고 있다.

ActivityComponent를 구현한다.

 

@ActivityScope

@Component(dependencies={AppComponent.class}, modules={ActivityModule.class})

public interface ActivityComponent {

  void inject(Activity activity);

}

 

dependencies를 추가하였다. AppComponent를 정의하여 GuiManager도 사용이 가능하다.

MainActivity에서 주입을 시전한다.

 

public class MainActivity extends AppCompatActivity {

  @Inject

  GuiManager guiManager;

  @Inject

  ItemAdapter itemAdapter;

 

  @Override

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

 

    ((MyApplication)getApplication()).getComponent().inject(this);

    DaggerActivityComponent activityComponent = DaggerActivityComponent.builder().appComponent(new AppComponent()).build();

    activityComponent.inject(this);

 

    guiManager.showAlert("hi!");

    itemAdapter.setDataSource(new MySource()); 

  }

  ...

}

 

MyApplication의 getComponent()를 가져와서 inject함으로써 GuiManager가 주입되었고 DaggerActivityComponent를 build하여 ItemAdapter를 주입하였다.

이 후 guiManager.showAlert("hi")나 itemAdapter.setDataSource(new MySource()) 같이 주입된 객체를 사용할 수 있다.

guiManager는 singletone의 스콥을 가지며 itemAdapter는 ActivityScope을 가진다.

 

ActivityScope이 무엇인가 싶을텐데.. 아래와 같이 정의된다.

 

@Scope

@Retention(RUNTIME)

public @interface ActivityScope {}

 

Scope을 하나 정의했는데 저리하면 액티비티에 종속되는 범위를 갖는 스콥 아노테이션이 만들어진다. 아노테이션 세계는 참..

 

의존성을 여러개로 나누어서도 관리할 수 있다. 모듈과 콤포넌트를 용도에 맞게 구성하여 사용하면 된다.

이번에는 UserData를 주입하기 위한 예제를 살펴보겠다.

 

@Module

public class UserModule {

  private Activity mActivity;

  public UserModule(Activity act) { mActivity = act; }

 

  @Provides @ActivityScope

  Activity activity() { return mActivity; }

 

  @Provides @ActivityScope

  UserData provideUserData() { reutrn new UserData(); }

}

UserData를 주입하기 위해 provideUserData메서드가 정의되었다.

 

@ActivityScope

@Component(dependencies={AppComponent.class}, modules={ActivityModule.class, UserModule.class})

public interface UserComponent {

  void inject(Activity activity);

}

 

AppComponent, ActivityModule등의 의존성도 포함하고 있으며 주입을 위해 inject가 정의되어 있다.

이 모듈을 사용하기 위해 SubActivity는 다음과 같이 구현된다.

 

public class SubActivity extends Activity {

  @Inject

  ItemAdapter itemAdapter;

  @Inject

  UserData userData;

 

  @Override

  public onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    DaggerActivityComonent.builder().appComponent((MyApplication)getApplication()).getComponent()).build().inject(this);

    DaggerUserData.builder().appComponent((MyApplication)getApplication()).getComponent()).build().inject(this);

  }

  ...

}

 

itemAdapter를 사용하기 위해 DaggerActivityComponent.builder()를 사용했고 userData를 사용하기 위해 DaggerUserData.builder()를 사용했다.

 

이와 같이 전역 및 지역적으로 객체를 주입해서 사용하는 일반적인 방법을 알아 보았다.

 

이 방법은 GuiManager, ItemAdapter, UserData등에 대해 모두 정확히 알고 있어야 하며 코드도 많다. 이 보다 적은 코드로도 적용이 가능한데 위에서 말한대로 두가지 방법이 더 있다. 이 에 대해서는 추가로 공부하여 정리하도록 할것이다.

 

 

 

Posted by 삼스

댓글을 달아 주세요