如何在不使用非公共 API 的情况下禁用 UITextView 上的共享并被苹果拒绝?

Posted

技术标签:

【中文标题】如何在不使用非公共 API 的情况下禁用 UITextView 上的共享并被苹果拒绝?【英文标题】:How to disable sharing on UITextView without using non-public APIs and Rejected by apple? 【发布时间】:2016-01-21 07:00:35 【问题描述】:

我对苹果的最新版本被拒绝,回复如下。

您的应用使用或引用以下非公共 API,这是 违反 App Store 审核指南:

_分享:

App Store 不允许使用非公共 API,因为 如果这些 API 发生变化,可能会导致糟糕的用户体验。

我已经在 XCode 中彻底搜索了我的应用程序中的 _share: 方法。我正在使用它来禁用这样的 UITextView 之一的共享。

@implementation UITextViewDisableShare : UITextView

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender

    if (action == @selector(_share:))
        return NO;
    return [super canPerformAction:action withSender:sender];

@end

有很多关于堆栈溢出的问题,建议使用上述代码以编程方式禁用复制、粘贴或共享选项,例如THIS。我只需要禁用共享选项,所以我不能简单地设置userInteractionEnabled=NO

我的一个应用程序版本已被 App Store 接受,其中包含上述代码。我应该如何在我的 UITextView 上禁用共享,这样它才不会与苹果的任何审查指南和非公共 API 冲突?

【问题讨论】:

【参考方案1】:

转一转(没有_share的api):

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender

    if (action == @selector(paste:) 
      || action == @selector(copy:) 
      // ... selectors that allow except _share.
    )
    
        return YES;
    

    return NO;

【讨论】:

return YES 不正确,应该是return [super ...【参考方案2】:

这种担心可能是没有根据的,但可能会从 canPerformAction:withSender: 返回 NO,除了我们知道的显式选择器之外的任何东西都可能导致意想不到的后果。例如,我们知道 UIResponderStandardEditActions 中声明的方法,但我们也知道该标题中未列出其他方法,例如提示初始问题的方法;此外,在某些情况下,ios 运行时可能会执行其他不为人知的操作。

如果您不需要允许可能由所选文本产生的任何其他操作(例如“复制”或“查找”),则禁止您的 UITextField 执行“选择:”或“全选:”的操作会给你想要的结果。

【讨论】:

【参考方案3】:

斯威夫特:

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool 
    if action == #selector(cut(_:))
        || action == #selector(copy(_:))
        || action == #selector(select(_:))
        || action == #selector(selectAll(_:))
        || action == #selector(paste(_:))
        || action == #selector(delete(_:)) 
        return super.canPerformAction(action, withSender: sender)
    
    return false

【讨论】:

以上是关于如何在不使用非公共 API 的情况下禁用 UITextView 上的共享并被苹果拒绝?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不涉及 Android 客户端应用程序的开发人员的情况下为某些网站构建公共/私有 API [关闭]

您能否在不要求用户允许的情况下使用 Graph API 获取公共 Facebook 页面的提要?

如何在不重写所有路由的情况下禁用 Express 中单个路由的 CORS?

如何在不禁用整个控件的情况下禁用 TextArea 的鼠标滚轮?

如何在不更改颜色的情况下禁用 Vuetify 按钮

如何在不使用 redux 中间件的情况下禁用/隐藏自适应卡片/操作按钮?