Мой подход к этой проблеме был вдохновлен этим ответом на форумах разработчиков Apple .Похоже, что в настоящее время общий консенсус разработчиков заключается в том, что App Review не дает конкретных рекомендаций, и в настоящее время они не объясняют или не требуют конкретного технического решения.Я думаю, что до тех пор, пока вы сможете объяснить App Review, как отключить CallKit для пользователей в Китае, это будет приемлемо.
Я обновлял свое приложение, как я обсуждаю ниже, и оно прошло App Storeсначала попробуйте, и мы переиздали в Китае 24 июля 2018 года.
Когда я отправил свое обновленное приложение в App Store, я включил короткое сообщение в рецензентВ информационном разделе говорится:
" В этой версии и далее мы не используем функции CallKit для пользователей в Китае. Мы определяем регион пользователя с помощью NSLocale. "
Мое приложение было одобрено через 12 часов без каких-либо вопросов или комментариев от команды обзора приложений.
Обнаружение пользователей в Китае
В своем приложении я использую NSLocale, чтобы определить, находится ли пользователь в Китае.Если это так, я не инициализирую и не использую функции CallKit в своем приложении.
- (void)viewDidLoad {
[super viewDidLoad];
NSLocale *userLocale = [NSLocale currentLocale];
if ([userLocale.countryCode containsString: @"CN"] || [userLocale.countryCode containsString: @"CHN"]) {
NSLog(@"currentLocale is China so we cannot use CallKit.");
self.cannotUseCallKit = YES;
} else {
self.cannotUseCallKit = NO;
// setup CallKit observer
self.callObserver = [[CXCallObserver alloc] init];
[self.callObserver setDelegate:self queue:nil];
}
}
Чтобы проверить это, вы можете изменить регион в Настройки> Общие> Язык и регион> Регион.Когда я установил «Регион» на «Китай», но оставил язык «Английский», [NSLocale currentLocale]
вернул "en_CN"
.
. Я использовал CXCallObserver
для наблюдения за состоянием вызова, инициированного из моего приложения.Мой общий обходной путь, когда я не мог использовать CallKit для мониторинга вызова, был:
- сохранить NSDate, когда вызов начинается
- наблюдатель для
UIApplicationDidBecomeActiveNotification
с UIBackgroundTask с обработчиком истечения срока действия (мойв приложении уже включены фоновые режимы) - когда приложение возвращается из фона, проверьте истекшее время и, если оно прошло менее 5 с и менее 90 минут, предположите, что вызов завершен, и сохраните его (мне нужно было отследитьдлительность звонка).
- Если вызывается backgroundTaskExpirationHandler, предположим, что вызов завершен, и сохраните время окончания.
- Я решил подождать, пока не истечет хотя бы 5 секунд, потому что я заметил, что
-applicationDidBecomeActive
часто вызывается один раз илиКак только звонок начался, обычно в течение первых 1-3 секунд.