제목: Freshchat iOS SDK 통합 단계
이미지: 0개
Freshchat SDK는 arm64 아키텍처에 대한 슬라이스를 포함하고 있으며 iOS 8.0 이상만 지원합니다. 아래 단계를 따라 iOS 앱에 Freshchat을 통합하세요.
APP ID, APP Key, 및 도메인 받기
귀하의 Freshchat 계정은 모바일 SDK를 Freshchat과 통합하는 데 사용되는 고유한 APP ID 및 APP Key와 연결되어 있습니다.
관리자 설정 > 모바일 SDK로 이동하여 APP ID, APP Key, 및 도메인을 찾을 수 있습니다.
1. 프로젝트에 Freshchat SDK 추가
프로필을 업데이트하여 Freshchat을 포함시킴으로써 한 단계로 프로젝트에 Freshchat을 추가하세요.
```plaintext
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'Your project target' do
pod 'FreshchatSDK'
end
```
Objective C
AppDelegate.m 파일에 "FreshchatSDK.h"를 가져옵니다.
Swift
브리징 헤더 파일에 "FreshchatSDK.h"를 가져옵니다.
또는 cocoapods를 사용하지 않는 경우 여기(https://github.com/freshworks/freshchat-ios)에서 Freshchat SDK를 추가한 다음 FreshchatSDK.xcframework 폴더를 프로젝트에 드래그 앤 드롭할 수 있습니다. 드래그 앤 드롭에 필요한 프레임워크는 "Foundation", "AVFoundation", "AudioToolbox", "CoreMedia", "CoreData", "ImageIO", "Photos", "SystemConfiguration", "Security", "WebKit", "CoreServices"입니다.
프로젝트 설정, 일반 > 빌드 설정 > 기타 링커 플래그에서 "-all_load", "-objC" 플래그를 설정하세요.
2. SDK 초기화
AppDelegate.m 또는 AppDelegate에서 각각 ObjC 및 Swift에 대해 didFinishLaunchingWithOptions에 다음 스니펫을 붙여넣어 Freshchat을 초기화하세요.
Objective C
```objective-c
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Freshchat 초기화
FreshchatConfig *config = [[FreshchatConfig alloc]initWithAppID:@"YOUR-APP-ID" andAppKey:@"YOUR-APP-KEY"];
config.domain = @"YOUR-DOMAIN";
[[Freshchat sharedInstance] initWithConfig:config];
return YES;
}
```
Swift
```swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let freshchatConfig: FreshchatConfig = FreshchatConfig.init(appID: "YOUR-APP-ID", andAppKey: "YOUR-APP-KEY")
config.domain = "YOUR-DOMAIN"
Freshchat.sharedInstance().initWith(freshchatConfig)
return true
}
```
2.1. 구성 옵션 초기화
초기화 시 사진 메시징과 같은 기능을 켜거나 끌 수 있습니다. 필요한 경우 Freshchat 기능을 구성하기 위해 initWithConfig: 메서드를 호출하기 전에 아래 스니펫을 사용하세요.
Objective C
```objective-c
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/* Freshchat 초기화 */
FreshchatConfig *config = [[FreshchatConfig alloc]initWithAppID:@"YOUR-APP-ID" andAppKey:@"YOUR-APP-KEY"];
config.domain = @"YOUR-DOMAIN";
config.gallerySelectionEnabled = YES; // 갤러리를 통한 메시징을 위한 사진 선택을 비활성화하려면 NO로 설정
config.cameraCaptureEnabled = YES; // 카메라를 통한 메시징을 위한 사진 선택을 비활성화하려면 NO로 설정
config.teamMemberInfoVisible = YES; // 팀 멤버 아바타 표시를 끄려면 NO로 설정. 표시할 아바타를 사용자 정의하려면 테마 파일 사용
config.showNotificationBanner = YES; // 앱이 열려 있을 때 새 메시지를 받을 때 앱 내 알림 배너를 표시하지 않으려면 NO로 설정
config.responseExpectationVisible = YES; // 주제에 대한 응답 기대를 숨기려면 NO로 설정
[[Freshchat sharedInstance] initWithConfig:config];
return YES;
}
```
Swift
```swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let freshchatConfig: FreshchatConfig = FreshchatConfig.init(appID: "YOUR-APP-ID", andAppKey: "YOUR-APP-KEY")
config.domain = "YOUR-DOMAIN"
freshchatConfig.gallerySelectionEnabled = true; // 갤러리를 통한 메시징을 위한 사진 선택을 비활성화하려면 FALSE로 설정
freshchatConfig.cameraCaptureEnabled = true; // 카메라를 통한 메시징을 위한 사진 선택을 비활성화하려면 FALSE로 설정
freshchatConfig.teamMemberInfoVisible = true; // 팀 멤버 아바타 표시를 끄려면 FALSE로 설정. 표시할 아바타를 사용자 정의하려면 테마 파일 사용
freshchatConfig.showNotificationBanner = true; // 앱이 열려 있을 때 새 메시지를 받을 때 앱 내 알림 배너를 표시하지 않으려면 FALSE로 설정
freshchatConfig.responseExpectations = true; // 주제에 대한 응답 기대를 숨기려면 FALSE로 설정
Freshchat.sharedInstance().initWith(freshchatConfig)
return true
}
```
3. 사용자 정보
3.1 사용자 정보 업데이트
지원 에이전트가 사용자와 메시지를 주고받을 때 사용자에 대한 더 많은 컨텍스트를 제공하기 위해 언제든지 기본 사용자 정보를 얻을 수 있습니다.
```objective-c
// 사용자 객체 생성
FreshchatUser *user = [FreshchatUser sharedInstance];
// 사용자의 식별 가능한 이름 설정
user.firstName = @"John";
// 사용자의 식별 가능한 성 설정
user.lastName = @"Doe";
// 사용자의 이메일 ID 설정
user.email = @"john.doe.1982@mail.com";
// 사용자의 전화번호 설정
user.phoneCountryCode=@"00";
user.phoneNumber = @"9999999999";
[[Freshchat sharedInstance] setUser:user];
```
Swift
```swift
// 사용자 객체 생성
let user = FreshchatUser.sharedInstance();
// 사용자의 식별 가능한 이름 설정
user?.firstName = "John"
// 사용자의 식별 가능한 성 설정
user?.lastName = "Doe"
// 사용자의 이메일 ID 설정
user?.email = "john.doe.1982@mail.com"
// 사용자의 전화번호 설정
user?.phoneCountryCode="00"
user?.phoneNumber = "9999999999"
Freshchat.sharedInstance().setUser(user)
```
3.2 사용자 속성 업데이트 (메타 데이터)
앱 내 사용자 및 이벤트에 대한 추가 메타데이터를 캡처하고 전송할 수 있으며, 이는 나중에 사용자에게 메시지를 푸시하는 방법으로도 사용됩니다.
Objective C
```objective-c
// 특정 사용자에 대한 사용자 정의 속성 설정
[[Freshchat sharedInstance] setUserPropertyforKey:@"customerType" withValue:@"Premium"];
// 사용자 인구 통계 정보 설정
[[Freshchat sharedInstance] setUserPropertyforKey:@"city" withValue:@"San Bruno"];
// 사용자가 앱 사용 여정에서 어디에 있는지에 따라 세분화 가능
[[Freshchat sharedInstance] setUserPropertyforKey:@"loggedIn" withValue:@"true"];
// 사용자가 앱에서 수행한 작업을 포함한 사용자 상태 캡처 가능
[[Freshchat sharedInstance] setUserPropertyforKey:@"transactionCount" withValue:@"3"];
```
Swift
```swift
// 특정 사용자에 대한 사용자 정의 속성 설정
Freshchat.sharedInstance().setUserPropertyforKey("customerType", withValue: "Premium")
// 사용자 인구 통계 정보 설정
Freshchat.sharedInstance().setUserPropertyforKey("city", withValue: "San Bruno")
// 사용자가 앱 사용 여정에서 어디에 있는지에 따라 세분화 가능
Freshchat.sharedInstance().setUserPropertyforKey("loggedIn", withValue: "true")
// 사용자가 앱에서 수행한 작업을 포함한 사용자 상태 캡처 가능
Freshchat.sharedInstance().setUserPropertyforKey("transactionCount", withValue: "3")
```
3.3 타임라인에서 사용자 이벤트 기록
사용자 이벤트를 추적하면 애플리케이션 내 사용자에 대한 더 많은 통찰력과 컨텍스트를 제공할 수 있습니다. 사용자 동작 및 실패/오류 사례와 같은 이벤트는 이 API를 사용하여 추적할 수 있습니다. 추적된 이벤트는 에이전트 측의 이벤트 타임라인에 나열됩니다.
Objective C
```objective-c
[[Freshchat sharedInstance] trackEvent:"Event_Name" withProperties:PropertiesDictionary];
```
Swift
```swift
Freshchat.sharedInstance()?.trackEvent("Event_Name", withProperties: PropertiesDictionary)
```
참고:
1. Freshchat은 계정당 121개의 고유 이벤트만 허용합니다.
2. 이벤트 이름은 문자열 값(최대 32자)을 허용합니다.
3. 속성 키 이름은 문자열 유형이어야 합니다(최대 32자).
4. 속성 값은 모든 기본 객체 유형일 수 있습니다(최대 256자).
5. Freshchat은 이벤트당 최대 20개의 속성 전송을 허용합니다.
3.4 사용자 데이터 재설정
로그아웃 시 또는 앱 내 사용자 동작에 따라 적절하다고 판단될 때 resetUser API를 호출하여 사용자 데이터를 재설정합니다.
Objective C
```objective-c
[[Freshchat sharedInstance] resetUserWithCompletion:^ {
// 완료 블록 코드
}];
```
Swift
```swift
Freshchat.sharedInstance().resetUser(completion: { () in
// 완료 코드
})
```
3.5 브라우저/디바이스 간 사용자 대화 복원
디바이스/세션/플랫폼 간 채팅 메시지를 유지하려면 모바일 앱이 사용자에 대해 동일한 외부 ID 및 복원 ID 조합을 전달해야 합니다. 이를 통해 사용자는 Android, iOS 및 웹과 같은 지원 플랫폼 중 어느 곳에서나 대화를 원활하게 이어갈 수 있습니다.
외부 ID - 이는 (이상적으로) 사용자 ID 또는 이메일 ID 등과 같은 시스템에서 사용자를 위한 고유 식별자여야 하며, identifyUserWithExternalID: API를 사용하여 설정됩니다.
참고: 외부 ID는 사용자에 대해 설정된 후 변경할 수 없습니다.
복원 ID - 이는 외부 ID가 설정된 경우 현재 사용자에 대해 Freshchat이 생성하며, [FreshchatUser sharedInstance].restoreID API를 사용하여 언제든지 검색할 수 있습니다.
참고: 복원 ID는 백엔드에 저장해야 하며, 대화를 복원하기 위해 이를 검색하는 로직을 구현할 수 있습니다.
앱은 동일한 디바이스 또는 다른 디바이스 및 플랫폼에서 세션 간 대화를 계속하기 위해 Freshchat SDK에 외부 ID 및 복원 ID 조합을 저장합니다.
참고: 알림은 한 번에 하나의 모바일 디바이스에서만 지원됩니다. 현재는 마지막으로 복원된 디바이스 또는 마지막으로 업데이트된 푸시 토큰이 있는 디바이스입니다.
Objective C
```objective-c
// 외부 ID 설정
[[Freshchat sharedInstance] identifyUserWithExternalID:@"externalId" restoreID:nil];
// 외부 ID 및 복원 ID로 사용자 조회 및 복원
[[Freshchat sharedInstance] identifyUserWithExternalID:@"externalId" restoreID:@"restoreId"];
// 복원 ID 검색
[FreshchatUser sharedInstance].restoreID;
// 복원 ID 생성 이벤트 수신 대기
// 로컬 알림 등록
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(userRestoreIdReceived:)
name:FRESHCHAT_USER_RESTORE_ID_GENERATED
object:nil];
- (void)userRestoreIdReceived:(NSNotification *)notification {
NSLog(@"Your restore id is - %@", [FreshchatUser sharedInstance].restoreID);
NSLog(@"Your query external id is - %@", [FreshchatUser sharedInstance].externalID);
}
// 등록 해제
[[NSNotificationCenter defaultCenter] removeObserver:self name:FRESHCHAT_USER_RESTORE_ID_GENERATED object:nil];
```
Swift
```swift
Freshchat.sharedInstance().identifyUser(withExternalID: "externalId", restoreID: nil)
// 외부 ID 및 복원 ID로 사용자 조회 및 복원
Freshchat.sharedInstance().identifyUser(withExternalID: "externalId", restoreID: "restoreId")
// 복원 ID 검색
FreshchatUser.sharedInstance().restoreID
// 복원 ID 생성 이벤트 수신 대기
// 로컬 알림 등록
NotificationCenter.default.addObserver(self, selector: #selector(userRestoreIdReceived), name: NSNotification.Name(rawValue: FRESHCHAT_USER_RESTORE_ID_GENERATED), object: nil)
func userRestoreIdReceived() {
print("Your restore id is - \(FreshchatUser.sharedInstance().restoreID)")
print("Your query external id is - \(FreshchatUser.sharedInstance().externalID)")
}
// 로컬 알림 등록 해제
NotificationCenter.default.removeObserver(FRESHCHAT_USER_RESTORE_ID_GENERATED)
```
4. 지원 경험 시작
앱 내에서 FAQ 또는 대화 기반 지원 경험으로 진입하기 위해 다음 스니펫을 사용하세요. 진입점은 화면상의 버튼이나 메뉴 항목일 수 있습니다.
4.1 대화
언제든지 Freshchat의 대화 목록 또는 단일 대화 오버레이를 표시하려면 showConversations: API를 사용해야 합니다.
예를 들어, 버튼을 눌렀을 때 피드백 오버레이를 표시하려면 ViewController 클래스의 대상 메서드는 다음과 같이 보일 수 있습니다.
Objective C
```objective-c
- (IBAction)showFeedbackOverlay:(id)sender {
[[Freshchat sharedInstance] showConversations:self];
}
```
Swift
```swift
func presentConversation(sender: Any) {
Freshchat.sharedInstance().showConversations(self)
}
```
4.1.1 주제 필터링
다른 유형의 사용자 또는 다른 화면에 다른 주제 세트를 표시하려면 태그를 사용하여 주제를 필터링할 수 있습니다. 이는 ConversationsOptions() 메서드에 구성하여 전달할 수 있습니다.
Objective C
```objective-c
ConversationOptions *options = [ConversationOptions new];
[options filterByTags:@[@"all", @"paiduser"] withTitle:@"Filter_View_Title"];
[[Freshchat sharedInstance] showConversations:self withOptions:options];
```
Swift
```swift
let options = ConversationOptions.init()
let tags: [String] = ["all", "paidUser"] // 필터 태그
options.filter(byTags: tags, withTitle: "Filter_View_Title")
Freshchat.sharedInstance().showConversations(self, with: options)
```
contactUsTags는 사용자가 셀프 헬프 섹션에서 올 때 다른 주제 세트를 표시하는 데에도 사용할 수 있습니다.
참고: 일치하지 않는 주제의 경우 사용자는 기본 주제로 리디렉션됩니다.
4.1.2 읽지 않은 메시지 수
사용자에게 받은 편지함에 읽지 않은 메시지가 있음을 알리고 싶다면 읽지 않은 메시지 수를 검색하여 표시할 수 있습니다. 블록은 사용자의 읽지 않은 메시지 수를 나타내는 int를 반환합니다.
Objective C
```objective-c
[[Freshchat sharedInstance] unreadCountWithCompletion:^(NSInteger count) {
NSLog(@"your unread count : %d", (int)count);
}];
```
Swift
```swift
Freshchat.sharedInstance().unreadCount { (count: Int) ->Void in print("읽지 않은 메시지 수 (비동기) :\(count)") } 앱은 또한 앱이 열려 있을 때 읽지 않은 메시지 수의 변경 사항을 수신하도록 선택할 수 있습니다. Objective C [[NSNotificationCenter defaultCenter]addObserverForName:FRESHCHAT_UNREAD_MESSAGE_COUNT_CHANGED object:nil queue:nil usingBlock:^(NSNotification *note) { [[Freshchat sharedInstance]unreadCountWithCompletion:^(NSInteger count) { NSLog(@"읽지 않은 메시지 수 : %d", (int)count); }]; }]; Swift // 알림 등록 NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name(FRESHCHAT_UNREAD_MESSAGE_COUNT_CHANGED), object: nil) //처리 메서드 - func methodOfReceivedNotification(notification: Notification) { Freshchat.sharedInstance().unreadCount { (count:Int) -> Void in print("읽지 않은 메시지 수 (비동기) :\(count)") } } 참고: SDK v1.5.0부터 읽지 않은 메시지 수 이벤트 이름이 FRESHCHAT_UNREAD_MESSAGE_COUNT에서 FRESHCHAT_UNREAD_MESSAGE_COUNT_CHANGED로 변경되었습니다. 4.2. FAQ 언제든지 Freshchat의 FAQ 오버레이를 표시하려면 showFAQs() API를 사용하세요. 예를 들어, 버튼을 눌러 피드백 오버레이를 표시하려면 ViewController 클래스의 대상 메서드는 다음과 같을 수 있습니다. Objective C - (IBAction)showFeedbackOverlay:(id)sender { [[Freshchat sharedInstance] showFAQs:self]; } Swift func presentFAQ(sender: Any) { Freshchat.sharedInstance().showFAQs(self) } 4.2.1 FAQ 옵션 FAQ 흐름의 사용자 정의는 showFAQs() API에 전달된 FaqOptions 인스턴스에 관련 옵션을 지정하여 수행할 수 있습니다. Objective-C : FAQOptions *options = [FAQOptions new]; options.showFaqCategoriesAsGrid = YES; // FAQ를 그리드 형식으로 표시, 목록 보기로는 NO options.showContactUsOnFaqScreens = YES; // FAQ 섹션에서 채팅 옵션 표시 options.showContactUsOnFaqNotHelpful = YES; // 사용자가 도움이 되지 않음을 선택할 때 기사 세부 정보에 연락처 표시 options.showContactUsOnAppBar = YES; // FAQ 카테고리 보기 또는 기사 목록 보기에서 탐색 바 위에 채팅 옵션 표시 [[Freshchat sharedInstance]showFAQs:self withOptions:options]; Swift : let options = FAQOptions.init() options.showFaqCategoriesAsGrid = true // FAQ를 그리드 형식으로 표시, 목록 보기로는 false options.showContactUsOnFaqScreens = true // FAQ 섹션에서 채팅 옵션 표시 options.showContactUsOnFaqNotHelpful = true // 사용자가 도움이 되지 않음을 선택할 때 기사 세부 정보에 연락처 표시 options.showContactUsOnAppBar = true // FAQ 카테고리 보기 또는 기사 목록 보기에서 탐색 바 위에 채팅 옵션 표시 Freshchat.sharedInstance().showFAQs(self, with: options) 4.2.2 FAQ 필터링 특정 화면에서 또는 방문자와 같은 일부 사용자에게만 특정 용어로 태그된 FAQ만 필터링하여 표시할 수 있습니다. 이러한 태그는 대시보드에서 설정할 수 있습니다. 예를 들어, 결제 실패와 관련된 FAQ를 해당 페이지에만 표시하려면 특정 FAQ에 "payment" 및 "billing"으로 태그를 지정할 수 있습니다. 그런 다음 필터링하여 사용자에게 표시할 수 있습니다. 기사로 FAQ 필터링 Objective C FAQOptions *options = [FAQOptions new]; [options filterByTags:@[ @"payment", @"billing" ] withTitle:@"Filtered_View_title" andType: ARTICLE]; [[Freshchat sharedInstance]showFAQs:self withOptions:options]; Swift let options = FAQOptions.init() let tags: [String] = ["payment","billing"] options.filter(byTags: tags, withTitle:"Filtered_View_title", andType :ARTICLE) Freshchat.sharedInstance().showFAQs(self, with: options) 카테고리로 FAQ 필터링 태그로 카테고리를 필터링할 수도 있습니다. 이렇게 하면 카테고리의 필터링된 보기가 표시됩니다(해당 카테고리 아래에 기사가 나열됨). 이는 서로 다른 고객에게 서로 다른 카테고리 세트를 표시하는 데 유용합니다(예: 유료 고객 대 무료 고객). Objective C FAQOptions *options = [FAQOptions new]; [options filterByTags:@[ @"payment", @"billing" ] withTitle:@"Filtered_View_Title" andType: CATEGORY]; [[Freshchat sharedInstance]showFAQs:self withOptions:options]; Swift let options = FAQOptions.init() let tags: [String] = ["payment", "billing"] options.filter(byTags: tags, withTitle:"Filtered_View_Title", andType :CATEGORY) Freshchat.sharedInstance().showFAQs(self, with: options) 참고: 기사를 태그로 필터링할 때, 기사가 속한 카테고리의 태그도 적용됩니다. 4.2.3 FAQ에서 "문의하기" 클릭 시 표시되는 주제 필터링 FAQ 화면에서 사용자가 "문의하기"를 클릭할 때 특정 용어로 태그된 주제만 필터링하여 표시하려면, 아래와 같이 showFAQs() API에 전달된 FAQOptions 인스턴스에서 filterContactUsByTags API를 사용하세요. 참고: FAQ 흐름 내에서 "문의하기"의 기본 동작은 showConversations()를 호출하는 것과 동일합니다. 즉, filterContactUsByTags API에 태그를 전달하여 주제 필터링이 활성화되지 않는 한 "모든 사용자에게 표시"로 표시된 모든 주제를 표시합니다. Objective C FAQOptions *options = [FAQOptions new]; [options filterContactUsByTags:@[@"filter_tags"] withTitle:"Filtered_Message_Us_View_title"]; [[Freshchat sharedInstance]showFAQs:self withOptions:options]; Swift let options = FAQOptions.init() options.filterContactUs(byTags: ["filter_tags"], withTitle: "Filtered_Message_Us_View_title") Freshchat.sharedInstance().showFAQs(self, with: options) 5. 메시지 전송 API 앱은 sendMessage: API를 사용하여 사용자를 대신하여 메시지를 보낼 수 있습니다. 이는 메시지를 조용히 보내고 Freshchat SDK UI를 실행하지 않습니다. 이 API는 대화를 시작하기 전에 고객에게 더 많은 컨텍스트를 설정하는 데 유용할 수 있습니다. Objective C NSString *message = @"여기에 메시지를 입력하세요"; FreshchatMessage *userMessage = [[FreshchatMessage alloc] initWithMessage:message andTag:@"single_match_tag"]; [[Freshchat sharedInstance] sendMessage:userMessage]; Swift let message = "여기에 메시지를 입력하세요" let freshchatMessage = FreshchatMessage.init(message: message, andTag: "single_match_tag") Freshchat.sharedInstance().send(freshchatMessage) 참고: 일치하는 주제가 없으면 메시지는 기본 주제로 전송됩니다. 여러 일치하는 주제가 있는 경우 메시지는 가장 오래된 주제로 전송됩니다. 6. 푸시 알림 Freshchat은 사용자 메시지 또는 캠페인에 대한 푸시 알림을 보내기 위해 .p12 인증서만 지원합니다. 몇 단계만으로 iOS 푸시 인증서를 생성할 수 있습니다. Freshchat SDK는 모든 사용자 대화에 대한 푸시 알림을 받을 수 있습니다. 이를 활성화하려면 setPushRegistrationToken API를 앱 대리자의 didRegisterForRemoteNotificationsWithDeviceToken 메서드에 추가하세요. Objective C [[Freshchat sharedInstance] setPushRegistrationToken:devToken]; Swift Freshchat.sharedInstance().setPushRegistrationToken(deviceToken) 활성 또는 백그라운드 상태에서 푸시 알림 메시지를 처리하려면 didReceiveRemoteNotification 또는 didFinishLaunchingWithOptions 대리자 메서드에 다음 메서드를 추가하세요. Objective C if ([[Freshchat sharedInstance]isFreshchatNotification:info]) { [[Freshchat sharedInstance]handleRemoteNotification:info andAppstate:app.applicationState]; } Swift if Freshchat.sharedInstance().isFreshchatNotification(userInfo) { Freshchat.sharedInstance().handleRemoteNotification(userInfo, andAppstate: application.applicationState) } 참고: isFreshchatNotification은 BOOL을 반환합니다. 원격 알림이 Freshchat에 의해 전송되지 않은 경우 NO를 반환하며, 이 확인을 기반으로 다른 알림을 처리할 코드를 삽입할 수 있습니다. 6.1 UNUserNotification 프레임워크 이는 iOS 10.1부터 푸시 알림을 구성하는 새로운 방법입니다. 이전 접근 방식은 작동하지만 더 이상 사용되지 않습니다. UserNotifications.framework를 사용하여 알림을 처리하는 경우, Freshchat 알림을 willPresent 및 didReceive 메서드에서 처리하고 있는지 확인하세요. Objective C /* iOS 10 이상에서 실행되는 장치용 */ - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^) UNNotificationPresentationOptions options))completionHandler { if ([[Freshchat sharedInstance]isFreshchatNotification:notification.request.content.userInfo]) { [[Freshchat sharedInstance]handleRemoteNotification:notification.request.content.userInfo andAppstate:[[UIApplication sharedApplication] applicationState]]; completionHandler( UNAuthorizationOptionSound ); } else { completionHandler( UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge ); } } /* iOS 10 이상에서 실행되는 장치용 */ - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { if ([[Freshchat sharedInstance]isFreshchatNotification:response.notification.request.content.userInfo]) { [[Freshchat sharedInstance]handleRemoteNotification:response.notification.request.content.userInfo andAppstate:[[UIApplication sharedApplication] applicationState]]; completionHandler(); } else { completionHandler(); } } Swift //@available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent: UNNotification, withCompletionHandler: @escaping (UNNotificationPresentationOptions)->()) { if Freshchat.sharedInstance().isFreshchatNotification(willPresent.request.content.userInfo) { Freshchat.sharedInstance().handleRemoteNotification(willPresent.request.content.userInfo, andAppstate: UIApplication.shared.applicationState) // Freshchat 알림 처리 완료 withCompletionHandler([.sound]) } else { withCompletionHandler([.alert, .sound, .badge]) // 다른 알림에 대한 처리 } } //@available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive: UNNotificationResponse, withCompletionHandler: @escaping ()->()) { if Freshchat.sharedInstance().isFreshchatNotification(didReceive.notification.request.content.userInfo) { Freshchat.sharedInstance().handleRemoteNotification(didReceive.notification.request.content.userInfo, andAppstate: UIApplication.shared.applicationState) // Freshchat 알림 처리 완료 withCompletionHandler() } else { withCompletionHandler() // 다른 알림에 대한 처리 } } 7. 언어 현지화 7.1 오른쪽에서 왼쪽으로 쓰는 언어 지원 Freshchat SDK는 RTL 언어(아랍어)를 지원합니다. 대화 메시지에서 RTL 언어를 지원하려면 UserMessageTextStyle/TeamMemberMessageTextStyle의 textAlignment 값을 'NSTextAlignmentNatural'로 설정하세요. 7.2 런타임 로케일 변경 앱이 런타임 로케일 변경을 지원하는 경우, 로케일 변경 메서드에 FRESHCHAT_USER_LOCALE_CHANGED 이벤트라는 로컬 알림 이름을 추가하세요. Objective C [[NSNotificationCenter defaultCenter] postNotificationName:FRESHCHAT_USER_LOCALE_CHANGED object:self]; Swift NotificationCenter.default.post(name: NSNotification.Name(rawValue: FRESHCHAT_USER_LOCALE_CHANGED), object: self, userInfo: nil) 7.3 문자열 현지화 Freshchat SDK UI에서 사용되는 모든 문자열은 여러 언어로 사용자 정의 및 현지화할 수 있습니다. SDK를 사용자 정의하려면 다음을 수행하십시오. 번들 생성 FreshchatSDK pod에서 FCLocalization.bundle을 찾거나 여기에서 FCLocalization.bundle을 다운로드하세요. 파일 이름을 사용자 정의 이름으로 변경할 수 있습니다. 번들 폴더의 구조는 다음과 같습니다. 영어, 프랑스어 및 독일어 문자열을 포함하는 샘플 번들 구조. YouCustomBundle.bundle -en.Iproj - FCLocalizable.strings -fr.Iproj - FCLocalizable.strings -de.Iproj - FCLocalizable.strings 문자열 변경 SDK UI에서 사용되는 특정 문자열을 변경하려면 FCLocalizable.strings의 적절한 키를 업데이트하세요. 파일의 키 이름은 UI별로 분류되어 있으며 사용된 키는 자명합니다. 지원하려는 모든 언어에 대해 동일하게 수행하십시오. 현재 SDK에는 영어만 포함되어 있지만 원하는 모든 언어에 대한 번역을 사용할 수 있습니다. 프로젝트에 연결 지원하는 언어에서 필요한 모든 문자열을 변경한 후 "Build Phases" > "Copy Bundle Resources" 아래에 연결하세요. SDK를 초기화할 때 번들 이름을 Freshchat 구성의 일부로 지정하세요. 사용자 정의 번들 리소스 정의 Objective C config.stringsBundle = @"MyCustomBundle"; Swift config.stringsBundle = "MyCustomBundle" 참고: 1. 번들 이름은 대소문자를 구분합니다 2. 확장자 .bundle은 필요하지 않습니다 8. 커스터마이징 8.1 UI 커스터마이징 옵션 인터페이스를 사용자 정의하려면 기본 테마 파일 FCTheme.plist를 수정하거나 다음 스니펫을 사용하여 SDK에 사용자 정의 테마 파일을 연결할 수 있습니다. Objective C [config setThemeName:@""]; Swift config.themeName = "" 개별 구성 요소 수준의 사용자 정의에 대해서는 테마 가이드를 따르십시오. 테스트 변경 사항을 적용한 후 앱을 실행하여 SDK UI에서 변경 사항을 확인하십시오. 8.2 앱 내에서 Freshchat이 아닌 링크 가로채기 및 처리 Freshchat은 앱에서 모든 Freshchat이 아닌 하이퍼링크 클릭을 처리하는 방법을 제공합니다. Freshchat 지원을 시작하는 뷰 컨트롤러 또는 AppDelegate 클래스에 아래 코드를 추가하세요. Objective C : [Freshchat sharedInstance].customLinkHandler = ^BOOL(NSURL * url) { // 앱 내에서 링크를 처리하는 코드, 링크를 다른 뷰 컨트롤러로 전달 return YES; // 링크를 Safari와 같은 기본 브라우저에서 열고 싶다면 "NO"를 반환하세요. }; Swift : Freshchat.sharedInstance().customLinkHandler = ({ (url) in // 앱 내에서 링크를 처리하는 코드, 링크를 다른 뷰 컨트롤러로 전달 return true // 링크를 Safari와 같은 기본 브라우저에서 열고 싶다면 "false"를 반환하세요. }) 9. 기타 참고 사항 9.1 출시를 위한 체크리스트 최신 SDK를 사용하고 있는지 확인하십시오. didFinishLaunchingWithOptions: 함수에서 애플리케이션 시작 시 SDK를 초기화하고 있는지 확인하십시오. 앱이 포그라운드, 백그라운드 및 종료 상태일 때 푸시 알림이 제대로 작동하는지 확인하십시오. 앱의 나머지 부분과 경험을 일치시키기 위해 테마 및 커스터마이징 문서를 참조하십시오. 다른 주제를 사용하지 않더라도 기본 주제 이름과 환영 메시지를 올바르게 구성하십시오. SDK를 사용하여 고유 사용자 식별자, 이메일, 전화번호 또는 기타 고유 고객 식별자를 캡처하여 API를 원활하게 사용하고 대시보드에서 "스마트 플러그" 기능을 최적화하여 사용하십시오. 새 설치 및 이전 버전에서 업그레이드할 때 푸시 알림이 작동하는지 확인하십시오. 9.2 iOS 10 호환성 iOS 10부터 Apple은 개발자가 사전에 개인 정보 보호가 필요한 제어에 대한 액세스를 선언하도록 요구합니다. 이 새로운 개인 정보 보호 요구 사항을 준수하기 위해 개발자는 Info.plist에 필요한 키를 추가해야 합니다. "NSPhotoLibraryUsageDescription" 및 "NSCameraUsageDescription" 또한, 필요한 키를 추가하지 않은 경우 XCode 콘솔에 경고 메시지를 기록합니다. 경고! 이를 준수하지 않으면 사용자가 마이크, 카메라 또는 사진 라이브러리의 제어에 액세스하려고 할 때 iOS 10이 앱을 충돌시켜 종료합니다. 자세한 내용은 여기를 클릭하십시오. 9.3 iOS 10 시뮬레이터 문제 Freshchat SDK는 키체인 서비스에 의존합니다. Xcode 8.0 (8A218a) / iOS 10 시뮬레이터는 키체인 서비스에 문제가 있어 "자격"이 설정되지 않은 경우 SDK가 저장소에서 데이터를 검색할 수 없습니다. 프로젝트의 기능 페이지에서 푸시 알림 기능을 켜고(문제가 발생하면 "문제 해결"을 선택) 이를 해결하십시오. 이는 프로젝트에 유효한 자격 파일이 있어야 시뮬레이터가 올바르게 작동할 수 있는 해결 방법이며, 테스트가 완료되면 이러한 변경 사항을 폐기할 수 있습니다. SDK API를 시도해 볼 수 있는 샘플 프로젝트를 호스팅했습니다. 다음 링크에서 액세스할 수 있습니다: https://github.com/freshdesk/freshchat-ios/tree/master/Sample