결함 #14018
[3T][Talk][#20982][MO] Kolon Talk_연락처가 2개 이상 등록되어 있는 경우 MO에서 노출되는 연락처와 PC에서 노출되는 연락처 번호가 상이함
100%
설명
[재현경로]
대화방 > + 버튼 선택 > 2개 이상 등록된 연락처 선택 > 전송
[문제점]
연락처가 2개 이상 등록되어 있는 경우 MO에서 노출되는 연락처와 PC에서 노출되는 연락처 번호가 상이함
[기대결과]
연락처가 동일하게 노출되어야 함
연결된 일감
이력
#1 조정후이(가) 10일 전에 변경
- 상태을(를) 신규에서 의견(으)로 변경되었습니다.
- 담당자을(를) 조경천에서 박수민(으)로 변경되었습니다.
PC의 연락처 노출 정책과 노출 정책을 통일해야 합니다.
연락처는 VCard 포멧을 전달하는 방식으로 구현되어 있으며, Vcard를 생성할 때 또는 조회할 때 어떤 데이터를 취할 것이냐를 통일 시켜야 합니다.
예를 들어 아이폰의 홍길동 연락처에 휴대번호가 010-1111-2222, 010-2222-3333, 집 번호가 02-999-9999가 존재한다고 할때 Vcard 포멧 생성시 어떤 번호만을 취할것이냐의 문제와
화면에 보여줄때 어떤 값을 취할 것이냐를 통일시켜야 합니다. PC 구현로직과의 통일이 필요한 상황입니다.
#2 조정후이(가) 10일 전에 변경
추가 확인 결과 안드로이드, 아이폰의 경우 기기의 연락처 정보 전체를 VCard 포멧으로 변환하여 서버로 전송하고 있습니다. 따라서 보여주는 부분을 PC, 안드로이드, 아이폰 통일하면 될 것 같습니다.
아이폰의 경우 첫번째 전화번호를 취해서 보여주고 있습니다.
case .contact:
// 연락처뷰 추가 후 변경.
if let data = message.content.data(using: .utf8) {
if let contacts = try? CNContactVCardSerialization.contacts(with: data), let contact = contacts.first {
vcardImageView.contentMode = .scaleAspectFill
if let imageData = contact.imageData, contact.imageDataAvailable {
vcardImageView.image = UIImage(data: imageData)
} else {
vcardImageView.image = UIImage(named: "profilePhotoNone")
}
vcardNameLabl.text = "(contact.familyName)(contact.givenName)"
var description: String = ""
if contact.phoneNumbers.count > 0 {
for number in contact.phoneNumbers {
if number.label == "_$!<Mobile>!$_" {
description.append(contentsOf: number.value.stringValue)
break
}
}
if description == "" {
if let number = contact.phoneNumbers.first?.value.stringValue {
description = number
}
}
}
if let email = contact.emailAddresses.first?.value {
description.append(contentsOf: "\n")
description.append(contentsOf: email as String)
}
vcardContentLabel.text = description
vcardContentLabel.setLineSpacing(lineSpacing: 7, alignment: .left)
}
#5 조정후이(가) 9일 전에 변경
PC javascript 로직 - VCARD의 TEL;로 시작하는 전화번호 중 첫번째 번호를 추출하도록 되어 있음.
안드로이드, 아이폰을 이와 동일하게 맞춤.
const parseVCard = (input) => {
const Re1 = /version|fn|title|org|TEL|tel:(.+)$/i;
const Re2 = /[:;]+;([:]+):(.+)$/;
const Re3 = /(START|END)/;
const ReKey = /item\d{1,2}./;
const fields = {};
let prevKey = null;
input.split(/\r|\n|\r\n/).forEach((line) => {
let results;
let key;
try {
if (Re1.test(line)) {
results = line.match(Re1);
key = results[1].toLowerCase();
fields[key] = results[2];
prevKey = null;
} else if (Re3.test(line)) {
prevKey = null;
} else if (Re2.test(line) || ReKey.test(line)) {
results = line.match(Re2);
if (!empty(results)) {
key = results[1].replace(ReKey, '').toLowerCase();
let meta = {};
results[2].split(';')
.map((p, i) => {
const match = p.match(/([a-z]+)=(.*)/i);
if (match) return [match[1], match[2]];
return [TYPE${(i === 0 ? "" : i)}, p];
})
.forEach((p) => {
meta[p[0]] = p[1];
});
if (!fields[key]) fields[key] = [];
fields[key].push({
meta,
value: results[3].split(';')
});
prevKey = key;
}
} else if (prevKey && fields[prevKey] && fields[prevKey][fields[prevKey].length - 1]) {
// 이미지의 경우는 뒤에 계속 붙임
if (!empty(line)) {
_.assign(fields[prevKey][fields[prevKey].length - 1], {
value: prevKey === 'photo' ? ${fields[prevKey][fields[prevKey].length - 1].value}\n${line} :
${fields[prevKey][fields[prevKey].length - 1].value}${line}
});
}
} else {
prevKey = null;
}
} catch(e) {
console.error(e);
prevKey = null;
}
});
return fields;
};
#6 정도영이(가) 9일 전에 변경
현상 및 원인
BEGIN:VCARD
VERSION:2.1
X-PRODID:ez-vcard 0.12.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=EC=A1=B0;=EC=A0=95=ED=9B=84
FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=EC=A1=B0=EC=A0=95=ED=9B=84
TEL;TYPE=CELL:01026336512
TEL;TYPE=CELL:01033331234
TEL;TYPE=WORK;TYPE=PREF:01022226666
EMAIL;TYPE=WORK:junghuya@gmail.com
END:VCARD
일 경우 PC처리 방식이 TEL 라인들 중에 젤 처음 나온 01026336512를 표시함
iOS의 경우 type이 CELL인 경우 우선 표시함.
하여 VCARD가
가본값: CELL
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=EC=97=90=EC=9D=B4;;;
FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=EC=97=90=EC=9D=B4
TEL;WORK:01012345678
TEL;CELL;PREF:01000001111
END:VCARD
일 경우 PC : 01012345678, Android :010000001111 를 표시하여 상이함.
대책 : PC기준으로 안드로이드(CELL type우선 표시 조건삭제), 아이폰 표시 처리 맞춤.