본문 바로가기

Transistorsoft Background Geolocation 대체제

Capacitor 8을 위한 무료 오픈 소스 Transistorsoft background geolocation 대안: 기능, 라이선스, 설정, geofencing 및 마이그레이션 가이드.

Capacitor 백그라운드 지오로케이션 플러그인 비교용 지도 핀 및 위치 추적 일러스트

Capacitor를 위한 Transistorsoft background geolocation 대안을 찾고 있다면, 가장 가까운 무료 옵션은 @capgo/background-geolocation입니다. MIT 라이선스로 제공되며 Capacitor 8을 지원합니다. iOS와 Android에서 백그라운드 위치를 추적하고 네이티브 geofencing을 지원하며, 네이티브 code에서 서버로 위치를 POST할 수 있습니다. Transistorsoft의 모든 기능을 그대로 복제한 것은 아니므로, 이 가이드에서는 얻는 것과 포기하는 것, 그리고 마이그레이션 방법을 다룹니다.

팀들이 Transistorsoft 대안을 찾는 이유

Transistorsoft SDK는 수년간 플릿, 배달, 피트니스 앱을 지원해 온 성숙한 제품입니다. 제품이 망가져서 떠나는 경우는 드뭅니다. 보통 다음과 같은 이유로 전환합니다:

이제 양쪽 플랫폼 모두 Release build에 키가 필요함

Transistorsoft changelog에 따르면, 9.0.0 버전부터 JWT 기반 라이선스 키로 전환하고 iOS에서도 키를 요구하기 시작했습니다. v9 이전에는 Android Release build만 잠겨 있었습니다. v8 이하의 키는 v9에서 작동하지 않으므로, 플러그인을 업그레이드하려면 대시보드에서 새 키를 생성해야 합니다.

이들의 스토어는 앱 식별자당 영구 라이선스를 판매하며, 1개부터 최대 100개까지 선택 가능하고 1년간의 업데이트가 포함됩니다. polygon geofencing 같은 애드온은 이제 동일한 키에 포함됩니다. 앱 하나라면 합리적인 가격이지만, 20개의 화이트 라벨 앱을 운영하는 에이전시나 스테이징과 프로덕션의 bundle ID를 분리해 배포하는 기업에게 라이선스는 매년 누군가 관리해야 하는 비용 항목이 됩니다.

코어 엔진은 바이너리입니다

Capacitor 래퍼는 오픈 소스이지만, 위치 엔진은 빌드된 iOS framework와 Maven의 Android library 형태로 제공됩니다. 특정 Android OEM 기기에서 문제가 발생해도, 기록 시점을 결정하는 code을 읽거나 패치할 수 없습니다. 어떤 팀은 이를 수용하지만, 엄격한 감사 요구 사항이 있거나 Xcode에서 code를 직접 디버깅하고 싶은 팀은 대개 그렇지 않습니다.

설정 범위

이 플러그인은 모션 감지, 스케줄링, 주행거리계, SQLite 영구 저장, HTTP 동기화 템플릿, 헤드리스 태스크 등 매우 방대한 설정 객체를 노출합니다. 이 모든 게 필요하다면 아주 좋습니다. 하지만 “운전자가 근무 중일 때 30초마다 위치를 전송”만 필요하다면 이해해야 할 설정이 너무 많습니다.

@capgo/background-geolocation의 기능

Capgo 플러그인은 Cordova background geolocation 포크의 긴 역사와 가벼운 커뮤니티 Capacitor 플러그인에서 시작되었습니다. 목표는 라이선스 없이 정확한 위치 측정, 안정적인 백그라운드 동작, 네이티브 지오펜싱을 제공하는 것입니다.

8.x 버전의 현재 기능:

  • 콜백이 있는 단일 호출을 통한 start() 포그라운드 및 백그라운드 위치 업데이트.
  • distanceFilter 및 minIntervalMs 위치 포인트 수신 간격을 제어합니다.
  • 모든 위치 데이터를 지정한 곳으로 url 네이티브 HTTP POST로 전송하며, 사용자 정의 헤더로 headers 및 updateHeaders() 토큰 로테이션을 지원합니다.
  • 진입 및 이탈 이벤트를 지원하는 네이티브 원형 지오펜스, 그리고 전환을 위한 네이티브 웹훅.
  • checkPermissions() 및 requestPermissions() iOS의 '사용 중'과 '항상' 권한을 구분하는
  • openSettings() 권한을 거부한 사용자를 위한
  • setPlannedRoute() 사용자가 계획된 경로를 벗어날 때 소리를 재생합니다.
  • 선택 사항: Android networkFallback 네트워크 위치로 GPS 공백을 채웁니다.
  • 개발 및 브라우저 테스트용 웹 구현체입니다.

기능 비교

기능 Transistorsoft (v9) @capgo/background-geolocation
라이선스 릴리스 빌드용 유료 키 (앱 ID당) MIT, 무료
출처 래퍼 오픈, 엔진 바이너리 완전한 오픈 소스
Capacitor 8 지원 지원
백그라운드 추적 지원 지원
모션 감지 상태 머신 지원 아니요
네이티브 HTTP 업로드 네, SQLite 큐 및 배치 처리 지원 네, best effort POST, 디스크 큐 없음
지오펜싱 네, 애드온으로 폴리곤 지원 iOS 및 Android 원형 지오펜스 지원
지오펜스 이벤트를 서버로 전송 네, HTTP 동기화 지원 네, 네이티브 webhook 지원
앱을 스와이프로 종료한 후 트래킹 (Android) 지원 네, 설정 시 url 설정
재부팅 후 트래킹 예 (startOnBoot) 아니요
스케줄링, 주행 거리계 지원 아니요

솔직한 요약: 앱이 스스로 트래킹 시점을 결정하고, 재부팅 후에도 살아남으며, 몇 주치 위치 포인트를 오프라인에서 버퍼링해야 한다면 Transistorsoft가 더 적합합니다. 사용자나 앱이 명시적으로 트래킹을 시작하고, 라이선스 없이 정확한 위치 정보와 읽기 쉬운 code을 원한다면 Capgo 플러그인이 더 나은 선택입니다.

설치 및 설정

bun add @capgo/background-geolocation
bunx cap sync

iOS

usage string과 백그라운드 위치 모드를 추가하세요. ios/App/App/Info.plist:

<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show your route.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>We use your location in the background to record your route while the phone is locked.</string>
<key>UIBackgroundModes</key>
<array>
  <string>location</string>
</array>

2026년 4월부터 App Store 업로드에는 Xcode 26이 필요합니다. CI 이미지가 구버전이면 빌드가 성공해도 업로드가 거부됩니다. Capgo 빌드 Mac을 직접 관리하고 싶지 않다면 최신 Xcode 이미지에서 실행됩니다.

Android

이 플러그인은 백그라운드에서 트래킹하는 동안 상시 알림을 표시하는 포그라운드 서비스를 사용합니다. Android 13 이상에서는 POST_NOTIFICATIONS 위치 권한이 허용된 후 알림을 표시할 수 있도록 권한을 요청합니다.

설정 useLegacyBridge 에서 capacitor.config.ts. 이 기능이 없으면 백그라운드에서 약 5분 후 WebView로의 위치 콜백이 중단될 수 있습니다:

import type { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'com.example.tracker',
  appName: 'Tracker',
  webDir: 'dist',
  android: {
    useLegacyBridge: true,
  },
};

export default config;

알림 채널 이름, 아이콘, 색상은 다음을 통해 커스텀할 수 있습니다: strings.xml 에 문서화된 키 플러그인 문서.

추적 시작

import { BackgroundGeolocation } from '@capgo/background-geolocation';

export async function startShift(token: string) {
  await BackgroundGeolocation.start(
    {
      backgroundTitle: 'Shift in progress',
      backgroundMessage: 'Your location is shared with dispatch until you end the shift.',
      requestPermissions: true,
      stale: false,
      distanceFilter: 25,
      url: 'https://api.example.com/v1/locations',
      headers: { Authorization: `Bearer ${token}` },
      minIntervalMs: 30_000,
    },
    (location, error) => {
      if (error) {
        if (error.code === 'NOT_AUTHORIZED') {
          BackgroundGeolocation.openSettings();
        }
        console.error(error);
        return;
      }
      if (location) {
        // Update the UI while the WebView is alive
        console.log(location.latitude, location.longitude, location.accuracy);
      }
    },
  );
}

export async function endShift() {
  await BackgroundGeolocation.stop();
}

두 가지 옵션이 겉보기보다 더 중요합니다:

  • backgroundMessage 백그라운드 업데이트를 활성화하는 설정입니다. 이 설정이 없으면 업데이트는 포그라운드에서만 보장됩니다. Android에서는 이 값이 포그라운드 서비스 알림의 텍스트로도 사용됩니다.
  • url 각 포인트를 네이티브 code에서 다음을 포함하여 전송합니다: "source": "native" 바디의 필드입니다. 이 경로는 WebView에 의존하지 않으므로, Android가 WebView를 스로틀링하거나 iOS가 JavaScript를 일시중지해도 데이터가 계속 흐릅니다. Android에서 url 을 설정하면 서비스가 스티키(sticky)가 되어 앱이 스와이프되어도 포인트가 서버에 계속 도달합니다. 안정적인 백그라운드 추적을 위해 두 옵션 모두 필요합니다.

액세스 토큰이 만료되면 세션을 재시작하지 않고 토큰을 회전(rotate)하세요:

await BackgroundGeolocation.updateHeaders({
  headers: { Authorization: `Bearer ${newToken}` },
});

지오펜싱

Transistorsoft 사용자는 지오펜싱에 많이 의존합니다. Capgo 플러그인은 두 플랫폼 모두에서 네이티브 API를 사용해 원형 영역을 지원합니다:

import { BackgroundGeolocation } from '@capgo/background-geolocation';

await BackgroundGeolocation.setupGeofencing({
  url: 'https://api.example.com/v1/geofence-events',
  headers: { Authorization: 'Bearer <token>' },
  notifyOnEntry: true,
  notifyOnExit: true,
  payload: { driverId: 'd-381' },
  backgroundLocation: true, // Android only, needs ACCESS_BACKGROUND_LOCATION in your manifest
});

await BackgroundGeolocation.addGeofence({
  identifier: 'depot-north',
  latitude: 48.8584,
  longitude: 2.2945,
  radius: 200,
  payload: { depotId: 'north' },
});

await BackgroundGeolocation.addListener('geofenceTransition', (event) => {
  console.log(event.identifier, event.transition, event.payload);
});

iOS 지오펜싱에는 '항상' 권한이 필요합니다. Android 10 이상에서는 백그라운드 지오펜싱에 ACCESS_BACKGROUND_LOCATION이 필요하며, 플러그인이 이를 자동으로 추가하지 않습니다. 앱이 백그라운드 위치 정보에 대한 Google Play 승인을 받은 경우에만 추가하세요. iOS에서 지오펜스가 이상하게 동작한다면 다음 가이드를 읽어보세요: iOS에서 지오펜스가 트리거되지 않는 이유.

Transistorsoft에서 마이그레이션하기

API가 다르므로, 검색 후 치환 대신 위치 서비스의 소규모 재작성을 계획하세요.

Transistorsoft 개념 Capgo 대응 기능
ready(config) + start() start(options, callback)
onLocation listener 이 start() callback
stop() stop()
distanceFilter distanceFilter
url, headers HTTP 동기화 url, headers, updateHeaders()
addGeofence / onGeofence addGeofence / geofenceTransition
removeGeofence(s) removeGeofence / removeAllGeofences
getGeofences getMonitoredGeofences
권한 헬퍼 checkPermissions / requestPermissions
모션 감지, 스케줄, 오도미터 앱 로직 또는 서버에서 구현하세요

실무에서 효과적인 단계는 다음과 같습니다:

  1. 앱에서 위치 접근을 작은 서비스로 감싸세요 (startTracking, stopTracking, onPoint). 대부분의 앱은 이미 이를 갖추고 있습니다.
  2. 피처 플래그나 별도 빌드를 통해 Capgo 플러그인으로 해당 서비스를 구현하세요.
  3. 백엔드가 플러그인의 위치 JSON을 받아들이도록 하세요. 바디는 다음 Location 타입 (latitude, longitude, accuracy, speed, bearing, time 등)과 일치하며, 추가로 source.
  4. Transistorsoft 플러그인, 해당 라이선스 키, 추가 Gradle 변수 및 더 이상 필요 없는 background modes를 제거하세요.
  5. 최소 Pixel, Samsung, iPhone 각 한 대씩, 화면을 잠근 상태로 30분 이상 실제 기기에서 테스트하세요.

네이티브 플러그인 변경은 새로운 스토어 빌드가 필요합니다. 해당 빌드가 배포된 후에는 트래킹 UI에 JavaScript 수정 사항을 계속 배포할 수 있습니다. Capgo Live Update 사용하기 추가 리뷰 사이클 없이.

Capgo 플러그인만으로 부족할 때

전환하기 전에 다음 사항들을 명확히 하세요:

  • 지속적 큐 없음. 네이티브 POST는 best effort 방식입니다. 기기가 오프라인 상태면 실패한 포인트는 로그에 기록된 후 삭제됩니다. 포인트 유실이 허용되지 않는다면 콜백에서 포인트를 로컬에 저장(예: SQLite)하고 앱에서 동기화하거나, Transistorsoft를 계속 사용하세요.
  • 재부팅 후 재시작 없음. 사용자가 앱을 다시 열 때 추적이 재개됩니다.
  • 자동 모션 감지 없음. 앱이 시작과 종료 시점을 결정합니다.
  • iOS 강제 종료. iOS에서 사용자가 앱을 강제 종료하면 표준 위치 업데이트가 중단됩니다. 이는 플러그인 한계가 아니라 OS 규칙입니다.

앱이 백그라운드일 때 Capacitor가 실행할 수 있는 작업에 대한 자세한 내용은 Capacitor에서 백그라운드 태스크가 어떻게 작동하는지 읽어보시고.

문제 해결

Android에서는 몇 분 후 업데이트가 중단됩니다. 체크 항목 useLegacyBridge: true, 포그라운드 서비스 알림이 표시되는지 확인하고, 배터리 최적화가 강한 OEM에서 테스트할 때는 앱의 배터리 최적화를 비활성화하세요. 다음 url 옵션을 사용하면 WebView에 의존하지 않고 전달됩니다.

iOS에서는 백그라운드 업데이트가 지원되지 않습니다. 확인 UIBackgroundModes 포함 location, 전달했는지 backgroundMessage, 그리고 호출했는지 start() 앱이 포그라운드에 있을 때. 가이드 iOS가 백그라운드 위치 업데이트를 중단하는 이유 모든 원인을 자세히 설명합니다.

NOT_AUTHORIZED error를 반환합니다. 사용자가 위치 권한을 거부했습니다. 호출하세요 openSettings() 앱이 왜 필요한지 설명한 후.

실내에서 점들이 튀는 현상. 높이기 distanceFilter, 값이 큰 점은 무시하고 accuracy Android에서는 대략적인 위치만 허용되는 경우에만 networkFallback: true 사용하세요.

배달 앱에서 모의 위치 사용. 각 Location 에 simulated 플래그가 있습니다. 더 엄격한 검사가 필요하면 @capgo/capacitor-mock-location-detector.

선택하기

모션 기반 자동 시작, 재부팅 후 유지, 오프라인 큐, 폴리곤 지오펜스가 필요하고 라이선스 비용이 부담되지 않는다면 Transistorsoft를 선택하세요. 그렇지 않다면 @capgo/background-geolocation 세션 기반 추적, 가독성 좋은 code, 앱별 라이선스 없이 앱에서 큐잉을 직접 관리하는 것을 원하신다면 적합합니다. 여러 유료 네이티브 SDK를 한 번에 대체하는 경우, Ionic Enterprise 플러그인 대안 페이지에서 다른 Capgo 대체재를 확인하세요.

Capacitor 앱용 Live updates

웹 레이어 버그가 라이브 상태라면, 앱 스토어 승인을 며칠씩 기다리지 말고 Capgo를 통해 수정 사항을 배포하세요. 네이티브 변경 사항은 정상 리뷰 절차를 그대로 따르는 반면, 사용자는 백그라운드에서 업데이트를 받습니다.

블로그 최신 글

Capgo는 정말 프로페셔널한 모바일 앱을 만드는 데 필요한 최고의 인사이트를 제공합니다.