외부 앱과 통신(AOS, iOS)

Android

  • 다른 앱으로 사용자보내기

    1. Intent를 사용하여 앱이 실행하려는 작업, 즉 '의도'를 정의

    2. startActivity()와 같은 메서드로 시스템에 Intent를 전달

    private val paymentAppPackageName = "com.test.app"
    private val paymentAppClassName = "$paymentAppPackageName.className"
    
    fun onCall() {
    		var intent = Intent(Intent.ACTION_MAIN)
    		
    		intent.addCategory(Intent.CATEGORY_LAUNCHER)
    		var compName = ComponentName(paymentAppPackageName, paymentAppClassName)
    		intent.setComponent(compName)
    		
    		try {
    		    startActivityForResult(intent, 1)
    		} catch (e: ActivityNotFoundException) {
    		     var downloadIntent = Intent(Intent.ACTION_VIEW, Uri.parse("<https://play.google.com/store/apps/details?id=$paymentAppPackageName>"))
    		     startActivity(downloadIntent)
    		}
    }
  • 활동으로부터 결과 가져오기

    1. BroadCast Receiver를 사용하여 결과값을 수신

    // AndroidManifest.xml
    <receiver
        android:name=".Receiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.test.app.broadcast" />
        </intent-filter>
    </receiver>
    
    // Receiver.kt
    class Receiver : BroadcastReceiver() {
        private var onListener: ReceiverListener? = null
    
        fun setOnListener(_onListener: ReceiverListener?) {
            onListener = _onListener
        }
    
        override fun onReceive(context: Context, intent: Intent) {
            val b: Bundle? = intent.extras
            val iter: Iterator<String> = b!!.keySet().iterator()
            while (iter.hasNext()) {
                val key = iter.next()
                val value: Any? = b.get(key)
                Log.e("[BroadcastReceiver]", "[$key] $value")
            }
            if (onListener != null) onListener!!.GetIntent(intent)
        }
    }
    
    // ReceiverListener.kt
    interface ReceiverListener {
        fun GetIntent(intent: Intent?)
    }
    
    // MainActivity.kt
    private val paymentAppPackageName = "com.test.app"
    private val paymentAppBroadcastReceiverName = "$paymentAppPackageName.broadcast"
    private var receiver: Receiver? = null
    
    fun onCall() {
    		receiver = EasyCheckReceiver()
    		receiver!!.setOnListener(object : EasyCheckReceiverListener {
    		    override fun GetIntent(intent: Intent?) {
    		        Log.d("DEBUG", "broadcast getintent")
    		
    		        val jsonObject = JSONObject()
    		        val extras: Bundle? = intent!!.extras
    		        for (key in extras!!.keySet()) {
    		            jsonObject.put(key, extras.get(key))
    		            Log.e("[BroadcastReceiver]", "[$key] ${extras.get(key)}")
    		        }
    		    }
    		})
    		var filter = IntentFilter(paymentAppBroadcastReceiverName)
    		this.registerReceiver(receiver, filter)
    }
    
    override fun onDestroy() {
        super.onDestroy()
        this.unregisterReceiver(receiver)
    }
    
  • 다른 앱이 내 활동을 시작하도록 허용

iOS

Troubleshooting

  • Error Domain=NSOSStatusErrorDomain

    • URL 포맷 확인 {URL scheme}://?{파라미터}&{파라미터}…

    • Info.plist에서 LSApplicationQueriesSchemes 확인

  • custom scheme

앱이 지원하는 커스텀 URL 스키마를 정의합니다.

CFBundleURLTypes 키의 값은 배열로 구성되며, 각 요소는 앱이 지원하는 URL 스키마에 대한 정보를 제공하는 딕셔너리입니다. 위 코드에서는 **linksample**이라는 URL 스키마를 지원하도록 정의되어 있습니다.

  • CFBundleURLSchemes : URL 스키마를 정의하는데 사용되는 키입니다. 해당 스키마를 사용하여 앱의 기능을 호출할 수 있습니다.

  • CFBundleURLName : URL 스키마의 이름을 정의하는데 사용되는 키입니다. 일반적으로 앱의 번들 ID와 URL 스키마 이름을 조합하여 사용합니다.

Last updated