我同意 txulu 的观点,似乎 CallKit 只需要对中国用户禁用/不使用 - 请参阅此有用的回复苹果开发者论坛 https://forums.developer.apple.com/thread/103083#320740.
普遍的共识似乎是,只要你能向 App Review 解释如何为中国用户禁用 CallKit 功能,这应该是可以接受的,除非/直到 Apple 发布具体指南。
对于您的特定问题 Ahmet,听起来 CallKit 可能会提供您的应用程序的一些核心功能。如果是这种情况,并且您确实需要支持中国的用户,您可能需要考虑使用另一个 VOIP 框架来重建您的应用程序来拨打电话(VOIP 在中国仍然允许......只是不使用 CallKit)。或者,如果用户位于中国,您可以禁用并隐藏应用程序中的通话功能。
我的应用程序仅使用 CallKit 来观察从我的应用程序发起的呼叫何时结束,因此我能够设计一种解决方法。对于中国用户,我现在观察到UIApplicationDidBecomeActiveNotification
并根据呼叫开始后经过的时间来最好地猜测从应用程序发起的电话呼叫是否已结束。它不如使用 CallKit 的好CXCallObserver
,但它似乎足以满足我的目的。
更新!我的应用程序通过了 App Store 审核并进行了描述的修复。
- 昨天提交了新版本。
- 在审阅者信息部分包含一条短消息,内容为“在此版本及更高版本中,我们不会为中国用户使用 CallKit 功能。我们使用 NSLocale 检测用户所在的区域。”
- 应用程序在大约 12 小时后获得批准,应用程序审核团队没有提出任何问题或评论。
检测中国用户
为了确定用户是否在中国,我使用 NSLocale 来获取用户的 currentLocale 和 CountryCode。如果国家/地区代码包含中国的 ISO 代码之一(CN、CHN),我会设置一个标志以表明我无法使用 CallKit,也无法在我的应用程序中初始化或使用 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"
.
Swift 5
实用功能
func isCallKitSupported() -> Bool {
let userLocale = NSLocale.current
guard let regionCode = userLocale.regionCode else { return false }
if regionCode.contains("CN") ||
regionCode.contains("CHN") {
return false
} else {
return true
}
}
主视图控制器
class MainViewController: UIViewController {
...
var callObserver = CXCallObserver()
...
override func viewDidLoad() {
super.viewDidLoad()
if isCallKitSupported() {
callObserver.setDelegate(self, queue: nil)
}
...
}
...
}
Note: countryCode
is now regionCode
并且仅返回“US”、“CN”等。国家/地区代码之前没有语言,例如“en_CN”。