从中国商店禁用Callkit 最佳方法?

2024-04-11

我们正在使用 CallKit 框架来促进 Voip 功能的本机使用。用户可以在我们的 Messenger 应用程序中进行语音和视频通话。

但由于中国政府的原因,苹果公司从中国删除了 CallKit 应用程序。

对于像我们这样的 CallKit 应用程序来说,目前最好的方法是什么?

我们不想从中国删除我们的应用程序,也不会因为中国而从我们的应用程序中删除所有 CallKit 功能。


我同意 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”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从中国商店禁用Callkit 最佳方法? 的相关文章

  • 你如何在react-native中实现捏合缩放?

    我一直在研究 PanResponder 我当前的工作假设是 我将检测是否有两个触摸正在向外移动 如果是 则增加元素大小onPanResponderMove功能 这似乎是一种混乱的方法 有没有更顺畅的方法呢 如果您只需要简单的捏缩放功能 只需
  • ShareKit + Facebook 身份验证不起作用

    我正在使用 ShareKit 从我正在开发的 PhoneGap 应用程序发布到 Facebook 我在 Facebook 中创建了该应用程序 并在我的项目中安装了该插件 Twitter 工作正常 但当我尝试在 Facebook 上分享时出现
  • 使用prepareForSegue传递数据

    我试图将数据从viewController 1传递到viewController2 我有2个按钮和1个segue 因此有一个segue标识符 这2个按钮 按下时每个按钮应显示 1个标签用于显示标题 1个textView用于显示定义 我很难显
  • 如何更改 UINavigationController 后退按钮名称?

    我有一个UIViewController我正在从第一个视图控制器导航到第二个视图控制器 我想更改显示在navigationcontroller为了回去 SecondViewController secondController Second
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 所有针对 iTunes Connect 的构建,导入此构建时出错 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我将构建上传到应用程序商店 之后它在活动中显示错误 任何人都可以帮帮我 SOLVED 转到构建设置 gt 搜索 bitcode gt 转启
  • 使用 nib 作为带有 nib 类的表节标题

    我想创建一个加载 nib 文件并将其设置为标题 UIView 的节标题 这个 nib 文件还将有一个关联的类 其中插座和操作连接到 因此我想像平常一样使用 nib 加载该类 我在网上搜索并找到了几个类似的答案 但我找不到任何适合我的答案 经
  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • 如何在 iOS 中将 Firebase 对象持久保存到磁盘?

    看起来Firebase http www firebase comiOS 实现不支持客户端模型的离线缓存 这在实践中意味着 对于需要身份验证的 Firebase 应用程序 您需要首先进行身份验证并等待 Firebase 完成登录 检查用户身
  • 如何在 Swift 中使用 CoreBluetooth 更新 BLE 设备的电池电量?

    func peripheral peripheral CBPeripheral didDiscoverCharacteristicsFor service CBService error Error for c in service cha
  • 如何组合两个 SwiftyJSON 对象

    我有一个 swiftyJSON 对象 例如 location http img http commentCount 0 timestamp 1432460217550 我希望能够向其附加另一个 swiftyJSON 对象 使其看起来像 lo
  • 保存来自 TrueDepth 相机的深度图像

    我正在尝试保存 iPhone X TrueDepth 相机的深度图像 使用AVCam照片滤镜 https developer apple com library content samplecode AVCamPhotoFilter Lis
  • 将 Armadillo C++ 库导入 Xcode

    我是 Mac 用户 正在尝试安装和导入 C Armadillo 库 以下是我到目前为止所采取的步骤 1 我从其网站下载了犰狳库 2 我仔细阅读了下载文件中的 Readme txt 文件 解释了如何安装它 3 我使用CMake将犰狳下载文件制
  • TTTAttributedLabel 可点击截断标记

    我有一个 TTTAttributedLabel 并为其指定了一个自定义属性截断标记 NSAttributedString atributedTruncationToken NSAttributedString alloc initWithS
  • UILabel 中的文本未垂直居中

    我使用以下代码创建了一个标签 func setupValueLabel valueLabel numberOfLines 1 valueLabel font UIFont name Avenir Black size 50 valueLab
  • cameraOverlayView 防止使用 allowedEditing 进行编辑

    在我的应用程序中 使用以下行在拍摄照片后对其进行编辑 移动和缩放 效果很好 imagePicker setAllowsEditing YES 但如果我还使用cameraOverlayView 则编辑模式将不再起作用 屏幕出现 但平移和捏合手
  • 如何在Sprite Kit中实现鼠标关节?

    我已经在 iOS 上用 Cocos2d Box2d 编写了拖放功能的工作实现 我需要将它移植到 Sprite Kit 逻辑非常基本 当用户触摸屏幕时 找到手指下的精灵 在找到的精灵和场景的物理体之间创建鼠标关节 将关节的目标设置为触摸位置
  • 在 UITableView 的部分标题文本下方添加一些边距

    我已经设计了标题文本的样式 func tableView tableView UITableView cellForRowAtIndexPath indexPath NSIndexPath gt UITableViewCell let ce
  • 当 ViewController 从 UIStoryboard 实例化时,isMemberOfClass 返回 no

    我有一个 OCUnit 测试类 PatientTestViewControllerTests 下面是界面 interface PatientTestViewControllerTests SenTestCase property nonat
  • 如何观察UserDefaults的变化?

    我有一个 ObservedObject在我看来 struct HomeView View ObservedObject var station Station var body some View Text self station sta

随机推荐

  • 在 iOS 中以编程方式清空缓存

    有谁巧合地知道我如何清空我正在开发的iOS应用程序的缓存内存 在它进入后台 applicationDidEnterBackground 的那一刻 我已经调查了 NSCache 但我仍然无法理解如何检索缓存以基本上删除 释放它 你说的是这个吗
  • powerpoint vba将某些幻灯片导出为pdf

    我试图在调用此函数时将选定的幻灯片导出为 pdf 这段代码运行得非常好 但给我的是整个幻灯片的 PDF 格式 Sub Export to PDF ActivePresentation ExportAsFixedFormat ActivePr
  • 最小购物车金额(WooCommerce 中的特定产品除外)

    我只允许在我的网站上进行最低价值 15 欧元的订单 但希望对一种产品进行例外处理 如果有人知道如何在这方面帮助我 我将非常感激 最小订单值的编码如下 有人知道我如何调整它以通过产品 ID 排除一种产品吗 add action woocomm
  • 内存中的方法表示是什么?

    在思考一下 Java C 编程时 我想知道属于对象的方法如何在内存中表示 以及这一事实如何涉及多线程 是为内存中的每个对象单独实例化一个方法还是执行 同一类型的所有对象共享该方法的一个实例 如果是后者 执行线程如何知道哪个对象是 要使用的属
  • PHP 发送的 ZIP 存档已损坏

    我正在使用 php ZipArchive 即时创建 zip 文件并将其发送回用户 我将压缩文件暂时存储在文档根目录上方的文件夹中 然后将其与代码一起发回 header Content type application zip header
  • 何时使用 $ 何时不使用

    我使用以下变量选择了一个控件 var txt text1 现在 当我必须处理文本框上的事件时 我是否必须将其引用为 txt 或 txt 即可 txt keydown function or txt keydown function 有什么好
  • 为什么 File::isDirectory 作为 FileFilter 可以正常工作?

    Why 文件 是目录在下面的示例中 作为 FileFilter 工作正常吗 File files new File listFiles File isDirectory listFiles方法需要一个FileFilter作为参数 publi
  • Android ActionBar 重新创建选项菜单

    在Android中使用ActionBar时 如何刷新选项菜单 我尝试隐藏和显示该栏 并使用 getSupportActionBar 获取它的新实例 我正在尝试实现一个登录 注销按钮 该按钮将根据用户的状态动态更改 这是我的 onCreate
  • Google Big-query api 403-禁止异常

    当我使用 Big Query API 的 java 应用程序执行查询时 出现以下 JSON 异常 以下是我得到的异常 error errors domain global reason accessDenied message Access
  • 使用 regexp_substr 选择逗号之间的单词(不包括双引号)

    我试图从逗号分隔列表中返回字符串列表 但是 我仍然想返回字符串中出现在双引号之间的逗号 这是我目前的声明 SELECT regexp substr one two three four five six seven eight nine n
  • Jquery Draggables:删除元素会更改其他删除元素的位置

    当放置 放置元素 通过从一个 DIV 拖动到另一个 DIV 然后删除放置的 DIV 中的一个元素时 其中一些元素会更改位置 这是一个测试场景 http jsfiddle net TcYHW 8 http jsfiddle net TcYHW
  • 你已经从颠覆转向善变了吗?值得付出努力吗?

    我正在更好地了解 Mercurial 版本控制系统 并且正在考虑从 SVN 进行转换 有人已经转换了吗 对于您和您的团队来说 转变是否困难 您能否给出一些建议 是继续使用 SVN 还是选择 Mercurial 一旦开始 你就永远不想回去 优
  • Gnuplot脚本创建后消失

    我有一个 gnuplot 脚本 我的系统是ubuntu 14 04 当我在终端输入gnuplot myPlot 剧情将会消失 它不会保留在屏幕上 我在这个堆栈中看到了类似的question https stackoverflow com q
  • 如何在更新宏变量的数据步骤中调用宏并立即使用该值?

    下面的例子非常简单 可能可以用更简单的方式解决 不过 我有兴趣让它发挥作用 以下示例基于 sashelp library 的 cars dataset 首先 我有一个名为 fun 的宏 proc contents data sashelp
  • 如何在 Jinja 中对齐 Pandas DataFrame 列号文本

    我通过 Jinja 将 Pandas Dataframe 渲染到网页 但注意到数字列左对齐 当我尝试在特定列上应用下面的代码以右对齐并加载网页时 df df style set properties subset col1 col2 tex
  • 使用 pickle 反序列化大型 numpy 数组比使用 numpy 慢几个数量级

    我正在反序列化大型 numpy 数组 本例中为 500MB 我发现不同方法的结果存在数量级差异 以下是我计时的 3 种方法 我正在接收来自multiprocessing shared memory包 所以数据作为一个memoryview目的
  • 对通过 OpenXML 与 Microsoft Word 通信的应用程序进行单元测试

    我正在修改一个与 Microsoft Word 进行大量 对话 的应用程序 现在 使用 COM 互操作 但我需要将其更改为 Open XML 我想为此引入单元测试 但我不知道如何做到这一点 这是例如操作之一 模板word文档包含一些书签 该
  • Swiftmailer 配置:使用 gmail 发送邮件

    我可以使用 swiftmailer 从我的电脑发送电子邮件 但邮件未在服务器中发送 我正在使用 swiftmailer 5 0 1 项目详细信息是 Netbeans 中的一个简单的 php 项目 迅捷邮递员 5 0 1 树枝1 13 1 我
  • 包含范围内的随机浮点双精度

    我们可以很容易地得到所需范围内的随机浮点数 X Y 请注意 X 是包含在内的 Y 是不包含的 具有下面列出的函数 因为Math random 和大多数伪随机数生成器 AFAIK 产生数字 0 1 function randomInRange
  • 从中国商店禁用Callkit 最佳方法?

    我们正在使用 CallKit 框架来促进 Voip 功能的本机使用 用户可以在我们的 Messenger 应用程序中进行语音和视频通话 但由于中国政府的原因 苹果公司从中国删除了 CallKit 应用程序 对于像我们这样的 CallKit