2017-09-05 56 views
3

出於安全原因,我想在我的整個應用程序中禁用新的iOS 11拖放功能。更具體地說,拖動部分。如何在整個應用程序中禁用iOS 11拖動?

在iOS系統11它在默認情況下發生的在文本可以選擇所有地方的文字 - 彈出窗口,textviews,網頁視圖等

回答

2

找到了解決辦法。在你的應用可能需要的情況下,方法調用UIDragInteraction的isEnabled方法返回NO。請注意,方法調整通常不是一個好主意。

@implementation UIDragInteraction (TextLimitations) 
+ (void)load 
{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 

     Class class = [self class]; 

     SEL originalSelector = @selector(isEnabled); 
     SEL swizzledSelector = @selector(restrictIsEnabled); 

     Method originalMethod = class_getInstanceMethod(class, originalSelector); 
     Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); 

     BOOL didAddMethod = 
     class_addMethod(class, 
         originalSelector, 
         method_getImplementation(swizzledMethod), 
         method_getTypeEncoding(swizzledMethod)); 

     if (didAddMethod) { 
      class_replaceMethod(class, 
           swizzledSelector, 
           method_getImplementation(originalMethod), 
           method_getTypeEncoding(originalMethod)); 
     } else { 
      method_exchangeImplementations(originalMethod, swizzledMethod); 
     } 
    }); 
} 

-(BOOL)restrictIsEnabled 
{ 
    if (restrictedCondition) 
    { 
     return NO; 
    } 
    return [self restrictIsEnabled]; 
} 
3

我不知道的任何方式完全禁用拖動功能,但有一種方法可以將拖放會話限制在您自己的應用程序中。這在安全性方面應該已經有了很大的改進。請參閱sessionIsRestrictedToDraggingApplication

dragInteraction(_:sessionIsRestrictedToDraggingApplication :)

調用來要求你的應用程序拖拽會話是否應僅限於在它開始的應用程序。

1

將&降不默認啓用。您需要通過向視圖提供拖動交互委託來啓用它。所以如果你沒有實現它,你可能不需要禁用拖放操作。

注:
Text views and text fields automatically support drag and drop.但是,它的默認行爲以允許從一個源副本內容使用UIMenuController另一個來源。通過拖放&可以輕鬆複製粘貼文本輸入視圖的文本內容。與使用UIMenuController進行數據共享的當前穩定操作系統功能相比,拖放&刪除對數據安全性沒有影響。


這是蘋果的聲明相同。

Making a View into a Drag Source通過實施景觀的阻力 互動委託(UIDragInteractionDelegate),您 啓用以作爲在您的應用程序拖拽源。


啓用視圖,作爲拖動源
的UIView的任何實例或子類可以作爲拖動源起作用。你要做的第一步是:

  1. 創建一個拖動交互(一個UIDragInteraction實例)。
  2. 指定拖動交互的委託(符合UIDragInteractionDelegate協議的對象)。
  3. 將交互添加到視圖的交互屬性。

下面介紹如何使用自定義的helper方法,你通常會視圖控制器的viewDidLoad中調用做到這一點()方法:

func customEnableDragging(on view: UIView, dragInteractionDelegate: UIDragInteractionDelegate) { 
    let dragInteraction = UIDragInteraction(delegate: dragInteractionDelegate) 
    view.addInteraction(dragInteraction) 
} 



創建拖動項目
一拖動項目封裝了源應用程序的承諾,爲一個模型對象提供各種數據表示。
要創建一拖項目,實現你拖互動委託dragInteraction(_:itemsForBeginning:) 方法,如下所示在最小的形式:

func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] { 
    // Cast to NSString is required for NSItemProviderWriting support. 
    let stringItemProvider = NSItemProvider(object: "Hello World" as NSString) 
    return [ 
     UIDragItem(itemProvider: stringItemProvider) 
    ] 
} 

此實現使用的init(對象:)方便初始化。當你實例化一個拖動項目時,傳遞一個對象在你的應用程序的本地表示中,或者以你所支持的最高保真表示。通常,確保項目提供商的registeredTypeIdentifiers數組中的第一個元素表示您的拖動交互代理可以提供的最高保真度數據。

要向拖動項目添加更多數據表示,就像您在應用中的典型情況一樣,請按照從高到低的保真度順序添加它們。當添加的表示,你必須選擇:

  • 添加多個數據表示,以一拖項目的最佳選擇,在很多情況下,是採取在你的模型類的NSItemProviderWriting協議。使用這個協議,您將代碼放置在模型類中提供多個數據表示。
  • 您可以使用NSItemProvider類中的registerObject(_:visibility:)方法或相關方法顯式註冊數據表示形式。
+0

默認情況下,文本已啓用。 –

+0

我已經更新了我的答案。我希望瞭解它對數據安全的影響對您有所幫助。 – Krunal

+0

對不起,但這不是我的問題的答案。我需要禁用從我的應用程序拖動文本到另一個。我已經禁用了所有其他方式讓文本脫離應用程序。 –

相關問題