피드백
React Native·Expo 앱에 피드백 위젯을 설치하고 앱 제출을 확인합니다.
CRM의 피드백 → 위젯 설정에서 위젯을 켜고 공개 키(fbw_공개키)를 확인합니다. 허용 앱에 앱 ID를 등록하세요. Expo 프로젝트의 app.json에서 ios.bundleIdentifier와 android.package를 확인할 수 있습니다. iOS와 Android의 ID가 다르면 두 값을 모두 등록하고, appId에는 실행 중인 플랫폼의 ID를 넘깁니다.
import { Platform } from "react-native";
const appId = Platform.select({ ios: "com.example.app", default: "com.example.android" });npx expo install @the-seeker/feedback-react-nativeExpo가 아닌 React Native 앱은 npm i @the-seeker/feedback-react-native를 사용합니다. 네이티브 모듈이 없어 Expo Go에서도 동작합니다.
앱 루트에서 Provider로 화면을 감쌉니다. 기본 baseUrl은 https://crm.theseeker.io입니다.
import { TheSeekerFeedbackProvider } from "@the-seeker/feedback-react-native";
export default function App() {
return (
<TheSeekerFeedbackProvider widgetKey="fbw_공개키" appId="com.example.app" screen="/home">
<RootNavigator />
</TheSeekerFeedbackProvider>
);
}CRM의 표시 방식에 따라 앱 UI가 달라집니다.
launcher: 기본값이며 화면 아래에 피드백 버튼을 표시합니다.
inline: 원하는 화면에 <TheSeekerFeedbackInline />을 배치합니다.
manual: 버튼 없이 useTheSeekerFeedback().open()으로 엽니다. launcher={false}로 런처 버튼을 숨길 수 있습니다.
const { open, ready } = useTheSeekerFeedback();
<Button title="피드백 보내기" onPress={open} disabled={!ready} />screen은 현재 화면 경로이며 CRM 설문의 pathPattern과 비교합니다. 제출 pageUrl에도 사용되므로 화면 이동 때 setScreen(path)을 호출하거나 Provider의 screen prop을 갱신하세요.
Provider의 userId에 로그인 사용자 ID를 전달합니다. 로그인 상태가 바뀌면 setUser(id)로 갱신하고 로그아웃할 때 setUser(null)을 호출합니다.
CRM에서 이미지 업로드를 켜고 pickImages 어댑터를 전달합니다. expo-image-picker를 이미 설치했다면 다음 예시처럼 연결하세요.
import * as ImagePicker from "expo-image-picker";
import type { PickImages } from "@the-seeker/feedback-react-native";
const pickImages: PickImages = async () => {
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ["images"],
allowsMultipleSelection: true,
selectionLimit: 4,
quality: 0.8,
});
if (result.canceled) return [];
return result.assets.map((asset, index) => ({
uri: asset.uri,
mimeType: asset.mimeType ?? "image/jpeg",
fileName: asset.fileName ?? `image-${index + 1}.jpg`,
fileSize: asset.fileSize,
}));
};PNG, JPEG, GIF, WebP를 지원하며 최대 4장, 장당 2MB까지 첨부할 수 있습니다.
기본 저장소는 메모리라 앱을 다시 시작하면 설문 쿨다운이 초기화됩니다. 유지하려면 getItem과 setItem을 제공하는 key-value 저장소를 연결합니다. 동기·비동기 구현을 모두 지원합니다.
const storage = {
getItem: (key: string) => AsyncStorage.getItem(key),
setItem: (key: string, value: string) => AsyncStorage.setItem(key, value),
};
<TheSeekerFeedbackProvider widgetKey="fbw_공개키" appId="com.example.app" storage={storage}>
<RootNavigator />
</TheSeekerFeedbackProvider>;locale은 ko, en, auto를 받으며 기본값은 ko입니다. auto는 기기 언어가 영어로 시작하면 영어, 그 외에는 한국어를 선택합니다. 테마, 문구, 색상은 CRM 설정을 따르며 자동 테마는 기기 다크 모드를 따릅니다.
앱은 Origin 없이 X-TheSeeker-App 헤더를 보냅니다. 앱 ID를 허용 목록에 등록한 뒤 config 요청이 200인지 확인하세요.
curl -i 'https://crm.theseeker.io/api/feedback/widget/config?key=fbw_공개키' \
-H 'X-TheSeeker-App: com.example.app'403 APP_NOT_ALLOWED이면 요청의 앱 ID와 CRM 허용 앱 목록을 확인합니다. iOS와 Android ID가 다르면 모두 등록하세요.
앱 ID는 도메인처럼 공개되는 값이며 비밀 정보가 아닙니다. 앱 ID와 위젯 공개 키를 앱에 포함할 수 있지만, 요청에는 서버 rate limit이 적용됩니다.
이 페이지가 도움이 되었나요?