유 니 티 와 iOS 의 상호작용 에 대한 소감

본질은 oc 와 c 의 상호작용 c \ # 와 c 의 상호작용 이 매우 적 습 니 다. 그러나 자신 이 크로스 플랫폼 을 지원 해 야 할 때 다음 과 같은 방법 을 취 할 수 있 습 니 다. 물론 당신 이 어 쩔 수 없 을 때... 예 를 들 어 c c + 또는 c \ # 다른 플랫폼 에 기 존의 안정 적 인 라 이브 러 리 가 있 으 면 다른 플랫폼 은 직접 사용 하고 싶 습 니까?그러나 실시 하기 가 어렵 습 니 다. 컴 파일 러 라 는 관문 은 어 려 운 문제 이기 때 문 입 니 다. 그러나 플랫폼 을 뛰 어 넘 는 것 을 어떻게 하 는 지 생각 이 났 습 니 다. 이 업 무량 을 계획 하려 면 각 플랫폼 의 구 덩이 를 밟 아야 합 니 다. 어떤 특성 이 사용 할 수 있 는 지 알 고 사용 할 수 없 는 지 대량의 조사 연 구 를 해 야 합 니 다.다양한 유형의 변환 이 가능 합 니 다. 현 재 는 c \ # oc swift 자바 c 와 만 결합 되 어 있 습 니 다. 이러한 상호작용 도 c \ # oc 와 의 상호작용 의 핵심 은 C 와 자바 입 니 다. 여 기 는 AndroidJavaClass 와 AndroidProxy 를 사용 하지만 유지 가능 한 접속 방안 을 만 드 는 것 이 라면,자신 이 재 활용 할 수 있 는 도구 류 는 iOS 와 안 드 로 이 드 인터페이스 와 의 상호작용 을 통 해 한 동안 반복 적 으로 테스트 하고 string float int long bool 을 검증 할 수 있 습 니 다. 이러한 기본 유형 은 iOS 와 안 드 로 이 드 를 잘 지원 하지만 패 킷 과 프 록 시 함수 포인 터 를 지원 하 는 지 검증 하 는 방안 을 사용 할 때 iOS 의 패 킷 에 char * char 만 넣 을 수 있 습 니 다 * * * * *void (이것 은 가능 하지만 void * 는 임의의 형식 을 가 져 올 때 바 꿔 야 한 다 는 것 을 의미 합 니 다) 방식 의 매개 변 수 를 바 꾸 는 것 입 니 다. 따라서 유 니 티 쪽 에서 iOS 의 사용자 정의 데 이 터 를 응답 할 수 있 도록 json 문자열 로 바 꿉 니 다. 전체 프로 세 스 디 버 깅 은 번 거 로 운 일이 기 때문에 플랫폼 전환 테스트 에 많은 시간 을 투자 할 것 입 니 다.플랫폼 이 직접 안 드 로 이 드 를 분석 하 는 것 은 사용자 정의 대상 유형 을 지원 할 수 있 지만 조작 은 AndroidJavaObject 를 통 해 호출 실례 화 방법 명 반사 로 이 루어 진 iOS 쪽 에 있 는 구덩이 핵심 *[DllImport("__Internal")] // using System.Runtime.InteropServices; sdk c __ fuck* AOT.MonoPInvokeCallback static ,c# .mm typedef void (*yourcallbacl)(arg1s) demo .mm * Assetsm Plugins/IOS/ xxx.mm , c c# string .mm char *
/ / 물론 swift 를 사용 해 야 하 는 것 은 여기 서 도입 하면 됩 니 다.
xxx. mm 파일 을 사용 하면 mm 에서
//           oc        
extern "c"{
      //c    void  void* int char* char **  int long   
  //                    
  void  Ctest(            ){
                                      
   }
}

여기에 가장 간단 한 demo 가 있 습 니 다.
https://github.com/lotawei/IosUnityFrameTest 사용 방식 유 니 티 는 항목 을 열 고 직접 포장 하여. mm 실현 함수 와. cs 의 함 수 를 비교 하면 완전한 인쇄 정 보 를 xcode 에서 볼 수 있 습 니 다.
글 업데이트
swift 와 oc 와 유 니 티 의 상호작용 을 어떻게 사용 하 는 지 에 대한 세부 사항 은 Ccharp 전송 기본 유형 에 대한 설명 이 끝 났 습 니 다. sdk 차원 을 고려 할 때 Oc 는 유 니 티 를 통 해 포장 할 수 있 지만 자체 의 유 니 티 sendmsg 방법 으로 호출 할 수 있 습 니 다. 그러나 이런 것 은 sdk 차원 에서 적절 하지 않 습 니 다.본질 적 인 디 결합 은 유 니 티 에 도달 하 기 를 바 라 는 것 이기 때문에 저 는 SDK 를 호출 하고 받 기만 하면 처리 하고 배포 하 는 것 이 좋 습 니 다. 예 를 들 어 C - charp 이쪽 매개 변 수 는 리 셋 함수 이 고 oc 이쪽 은 리 셋 함수 주 소 를 받 을 수 있 습 니 다.처리 가 끝 난 후에 이 리 셋 을 주동 적 으로 실행 하면 c - charp 이쪽 이 더 잘 처리 되 지만 sdk 는 swift 든 oc 든 상호작용 의 실제 본질 이 든 c c + + 와 상호작용 을 해 야 합 니 다. 그러면 c + + 를 어떻게 사용 하여 oc 와 유사 한 protocol 과 패 킷 방식 을 정의 하 는 것 이 가능 한 방안 입 니 다.
여기 서 oc 를 예 로 들 면 swift 는 oc 폐쇄 방식 과 직접 상호작용 을 할 수 있 기 때 문 입 니 다. SDK 쪽 은 기본적으로 프로 토 콜 이나 block 방식 으로 처리 하기 때 문 입 니 다.
  • 사고방식 1: 프로 토 콜 프로 토 콜 과 c + + 상호작용 액 을 사용 해 보십시오. 이 현재 죽음 의 길 은 기본적으로
  • 사고 2: block 으로 c + 상호작용 을 통 해 자 료 를 찾 아 보 는 것 이 가능 하 다
  • .
      typedef void(^SDKProcesscall)(NSString*);#oc        
    

    c + + 에 대응 하 는 방법
    typedef void (*SDKProcesscall)(const char *data);
    

    그리고 mm 파일 에서 c \ # 저쪽 에 정 해진 방법 c \ # 저쪽 은 다음 과 같이 정 합 니 다.
        public delegate void iosMsgcallback(string datajson);
           [DllImport("__Internal")]
        public extern static void dealcallback(string params,iosMsgcallback callback);
        [AOT.MonoPInvokeCallback(typeof(iosMsgcallback))]
        public static void recieveCallBack(string result)
        {
            
                    //      sdk     
                   //       
    
        }
    

    . mm 파일
    extern "C"{
       void  sdkdealprocess(const char *params ,SDKProcesscall back){
                //char *    NSString     
                //     swift   oc  
                 [SDkProcess  sdkdealprocess:str delaprocessblock:^(NSString result)  {
                         //  const char * result = ;
                          back(result);
                  }];
            
            
        }
    }
    

    이렇게 완전한 인 터 랙 션 프로 세 스 를 사용 하면 좋 습 니 다. sdk 처리 가 필요 한 곳 에서 c \ # 여 기 는 aot 방식 으로 만 자신 이 쓴 sdk 를 처리 할 수 있 습 니 다. 이 반전 을 찾 을 수 없 기 때문에 [AOT. MonoPInvokeCallback (type: of (iosMsgcallback)] 표 시 된 형식 함수 로 결 과 를 처리 할 수 밖 에 없습니다.
     
     dealcallback("{\"username\":\"hitbit\"}", recieveCallBack)
    

    좋은 웹페이지 즐겨찾기