Build · Mobile Try-On

Dodaj virtual try-on do aplikacji na iOS lub Androida

W jednym zdaniu

Przechowuj klucz Photta API na swoim backendzie; wystaw endpoint proxy (/mobile/try-on), który przyjmuje zdjęcie produktu oraz mannequin ID, przekazuje je do /api/v1/tryon/apparel, zapisuje ID generacji przypisane do użytkownika i udostępnia endpoint statusu, który aplikacja mobilna odpytuje (polling) co 3 sekundy, aż obraz będzie gotowy. Telefon nigdy nie dowiaduje się o istnieniu klucza Photta.

  • Credits: 5 credits w 2K · 6 credits w 4K
  • Typowy czas: 1.5–4 min
  • Przetwarzanie: asynchroniczne, polling

Każda liczba na tej stronie pochodzi z dokumentacji API Photta · sprawdzono

Twoje urządzenie nigdy nie komunikuje się bezpośrednio z Photta — łączy się z Twoim backendem, a Twój backend rozmawia z Photta. Ta granica chroni Twój klucz API przed wyciekiem z telefonu użytkownika, sprawia, że rate limity pozostają Twoją sprawą, a aplikacja bez problemu przechodzi weryfikację w każdym sklepie.

RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
  -H "Authorization: Bearer $PHOTTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "product_type": "top",
  "product_images": [
    "https://cdn.yourstore.com/products/shirt-front.jpg"
  ],
  "product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
  "product_category": "t_shirt",
  "mannequin_id": "mnk_f3a9b1",
  "pose_id": "pose_c2d4e5",
  "background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
  "lock_background": true,
  "resolution": "2K",
  "aspect_ratio": "3:4",
  "body_size": "M",
  "expression": "neutral",
  "user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')

Jak to działa

Urządzenie, backend, Photta — trzy warstwy, jeden przepływ

Pięć konkretnych decyzji, które musisz podjąć przed pierwszym zgłoszeniem do App Store.

  1. Krok 1

    Trzymaj klucz na swoim serwerze

    Nie dołączaj klucza Photta do pliku binarnego aplikacji, info.plist, AndroidManifest ani żadnego pliku środowiskowego czasu budowania — dekompilacja binarki jest trywialna i klucz wycieknie. Twój backend to jedyne miejsce, w którym powinien znajdować się klucz.

  2. Krok 2

    Zaprojektuj czysty endpoint proxy

    Udostępnij /mobile/try-on dla swojej aplikacji. Uwierzytelniaj żądanie przy użyciu własnej sesji użytkownika — nie przekazuj surowych kluczy API przez proxy. Proxy wywołuje następnie Photta w imieniu uwierzytelnionego użytkownika.

  3. Krok 3

    Odzwierciedlaj status zadania Photta w swojej bazie danych

    Gdy Photta zwróci ID generacji, wstaw wiersz do własnej tabeli zadań z kluczem user_id. Twoja aplikacja mobilna odpytuje TWÓJ /mobile/try-on/:id — a nie Photta — dzięki czemu rate limity skalują się zgodnie z TWOIM planem, a nie urządzeniem każdego użytkownika.

  4. Krok 4

    Cache'uj docelowy URL wyniku

    Gdy Photta zgłosi completed, skopiuj output_url do swojego wiersza z zadaniem i opcjonalnie pobierz bajty do własnego CDN. Użytkownicy mobilni płacą za każdy MB — nie linkuj bezpośrednio do CDN Photta przez cały cykl wyświetlania PDP.

  5. Krok 5

    Obsługuj tryb offline bez błędów

    Sieci mobilne zrywają połączenie w trakcie odpytywania. Pokaż stan „ponawianie próby” zamiast twardego błędu, ponawiaj żądania z wykorzystaniem exponential backoff i zapisuj ID zadania lokalnie, aby po zimnym starcie wznowić pracę w miejscu, w którym zakończyła się ostatnia sesja.

Trzy warstwy integracji

Kontrakt aplikacji, backend proxy, polling po stronie klienta — dokładnie taka separacja, jakiej potrzebujesz.

// Never ship your PHOTTA_API_KEY to the device. The mobile app
// calls YOUR API; your API calls Photta. Simple, safe, billable.
POST /mobile/try-on
{
  "productImageUrl": "...",
  "mannequinId": "...",
  "poseId": "..."
}
// → returns { jobId } immediately
const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "product_type": "top",
    "product_images": [
      "https://cdn.yourstore.com/products/shirt-front.jpg"
    ],
    "product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
    "product_category": "t_shirt",
    "mannequin_id": "mnk_f3a9b1",
    "pose_id": "pose_c2d4e5",
    "background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
    "lock_background": true,
    "resolution": "2K",
    "aspect_ratio": "3:4",
    "body_size": "M",
    "expression": "neutral",
    "user_instruction": "Keep the collar pattern crisp and centered."
  }),
});
const { data } = await res.json(); // data.id, data.status
// Store { id: data.id, user_id, status: "processing" } in your jobs table
// and return { jobId: data.id } to the device.
// App polls YOUR /mobile/try-on/:id — you poll Photta server-side
// and mirror status. This way rate limits are YOUR problem, not
// each device's, and you can add caching + analytics in one place.
async function pollJob(jobId: string) {
  while (true) {
    const { status, imageUrl } = await api.get(`/mobile/try-on/${jobId}`);
    if (status === "completed") return imageUrl;
    if (status === "failed") throw new Error("Try-on failed");
    await sleep(3000);
  }
}

Pytania zadawane przez programistów

Wdrożenie funkcji mobilnej opartej na Photta

Czy mogę wywołać Photta API bezpośrednio z urządzenia?

Technicznie tak — ale musiałbyś umieścić swój klucz API wewnątrz pakietu aplikacji, co oznacza wysłanie klucza na każde urządzenie, które ją zainstaluje. Przekieruj ruch przez własny backend, aby klucz pozostał na serwerze, nad którym masz kontrolę.

Jak radzić sobie z wolnymi sieciami mobilnymi?

Dwie zasady. Po pierwsze: zlecaj zadanie z backendu, nie z urządzenia — z telefonu przesyłasz jedynie zdjęcie produktu do własnego API. Po drugie: odpytuj własny endpoint statusu w 3-sekundowych odstępach, stosując exponential backoff w razie niepowodzenia. Jeśli użytkownik przełączy karty lub straci zasięg, zapisz ID zadania w pamięci lokalnej, aby mógł kontynuować po powrocie.

Czy Photta obsługuje webhooki?

Nie. Polling to jedyny sygnał ukończenia, jaki oferuje API, dlatego utrzymaj pętlę workera — i wyślij server-sent event na telefon w momencie, gdy Twój własny backend zarejestruje zakończenie zadania.

Czy mogę używać Photta z React Native lub Flutterem?

Tak — po stronie JavaScript / Dart wywołujesz po prostu API własnego backendu. Żadne szczegóły implementacyjne Photta nie przenikają na zewnątrz. Aplikacje we Flutterze pobierają dane przez fetch z /mobile/try-on dokładnie tak samo, jak aplikacje w React Native czy natywnym SwiftUI / Jetpack Compose.

Czy zespół weryfikacyjny Apple zwraca uwagę na tę integrację?

Nie — ponieważ Twoja aplikacja nie wywołuje bezpośrednio Photta. Łączy się z Twoim własnym backendem z Twoim własnym uwierzytelnianiem. Z perspektywy Apple jesteś zwykłą aplikacją opartą na REST. To samo dotyczy Google Play i Huawei AppGallery.

Wdróż virtual try-on w najbliższym wydaniu aplikacji

Trzy cienkie warstwy, zerowy narzut SDK na urządzeniu. Pobierz klucz API i skonfiguruj proxy w jedno popołudnie.