2017-07-31 7 views
0

UIApplicationをサブクラス化し、sendEvent関数のリスナーを設定することができました。ユーザーがキーボードの特定のボタンに触れたときに、どうすれば通知を受け取ることができますか? sendEventのタッチ位置を取得できます。この位置を選択した文字に変換できますか?キーボードプレス通知を聞きます

import Foundation 
import UIKit 

    @objc(Scale) class Scale: UIApplication { 

     override func sendEvent(_ event: UIEvent) { 
      if event.type != .touches { 
       super.sendEvent(event) 
       return 
      } 

      if let touches2 = event.allTouches { 
       for touch in touches2.enumerated() { 
        if(touch.element.view == ViewController.self().forceLabel){ 
         print("text touched ") 
        } 
        if(touch.element.phase == UITouchPhase.began) { 
         //Stuff 
         //print("=====================================") 
         //print (touch.element.view as Any) 
         print("**********************") 
         print(touch.element.location(in: touches2.first?.view)) 
         print("**********************") 
        } 
        if(touch.element.phase == UITouchPhase.ended) { 
         //Stuff 
         print(";") 
        } 
        //print(touch.element.phase) 
       } 
       if let touch = touches2.first { 

       } 
      } 
      super.sendEvent(event) 
     } 
    } 
+0

あなたの間違ったキーを返します英語の文章は、期間を分けることなく、ひどく壊れてしまいます。 iOSアプリケーションをサブクラス化することが何を意味するのか分かりません。 –

+0

そのような有用性は、建設的な、非常にうわー。 @ElTomato – LinusGeffarth

答えて

0

私はこの方法が唯一のデフォルトのキーボード と私の携帯電話7プラスのために動作します をキーに場所を変換することで、キーを取得するために疥癬と、いくつかの回を完璧ではない、それは

func getKeyFromLocation(location : CGPoint) -> String{ 
    var keysLocation = [String: CGPoint]() 
    keysLocation["q"] = CGPoint(x: 29, y: 29) 
    keysLocation["w"] = CGPoint(x: 68, y: 29) 
    keysLocation["e"] = CGPoint(x: 107, y: 29) 
    keysLocation["r"] = CGPoint(x: 146, y: 29) 
    keysLocation["t"] = CGPoint(x: 185, y: 29) 
    keysLocation["y"] = CGPoint(x: 224, y: 29) 
    keysLocation["u"] = CGPoint(x: 263, y: 29) 
    keysLocation["i"] = CGPoint(x: 302, y: 29) 
    keysLocation["o"] = CGPoint(x: 351, y: 29) 
    keysLocation["p"] = CGPoint(x: 390, y: 29) 
    keysLocation["a"] = CGPoint(x: 60, y: 80) 
    keysLocation["s"] = CGPoint(x: 99, y: 80) 
    keysLocation["d"] = CGPoint(x: 138, y: 80) 
    keysLocation["f"] = CGPoint(x: 177, y: 80) 
    keysLocation["g"] = CGPoint(x: 216, y: 80) 
    keysLocation["h"] = CGPoint(x: 255, y: 80) 
    keysLocation["j"] = CGPoint(x: 294, y: 80) 
    keysLocation["k"] = CGPoint(x: 333, y: 80) 
    keysLocation["l"] = CGPoint(x: 372, y: 80) 
    keysLocation["z"] = CGPoint(x: 99, y: 140) 
    keysLocation["x"] = CGPoint(x: 138, y: 140) 
    keysLocation["c"] = CGPoint(x: 177, y: 140) 
    keysLocation["v"] = CGPoint(x: 216, y: 140) 
    keysLocation["b"] = CGPoint(x: 255, y: 140) 
    keysLocation["n"] = CGPoint(x: 294, y: 140) 
    keysLocation["m"] = CGPoint(x: 333, y: 140) 

    var selectedkeycode = "" 
    var minDistance = CGFloat(1000.0) 

    for (keycode, point) in keysLocation { 
     let distance = hypot(location.x - point.x, location.y - point.y) 
     if(distance < minDistance){ 
      minDistance = distance 
      selectedkeycode = keycode 
     } 

    } 

    print(minDistance) 

    if(minDistance > CGFloat(50.0)){ 
     return "" 
    } 
    else{ 
     return selectedkeycode 
    } 



} 
0

あなたは単純にできません。

開発者とそのアプリがユーザーのパスコードにアクセスできるようにすると、セキュリティ上の大きなリスクになります。プライベートAPIを使用してキーヒット(私が考えている限り不可能である)に関するキーボード通知を聞くことができたとしても、あなたのアプリケーションは決してAppStoreには届かず、却下されます。

独自のキーボードを作成すると、アプリケーション外のキーヒットに関する情報のみを受け取ることができますが、それでもシステムはすべてのパスワードとパスコードにデフォルトのキーボードを使用します。

+0

実際には、アプリはリサーチ用で、アプリストアには公開されません –

+0

公開されていなくても、これを達成するために使用できるプライベートAPIはありません。私が知っている唯一の方法は、iPhoneのパスコードを壊すことができたのは、モーションセンサーと機械学習を使用していたことです。あなたはそれについて読むことができます[http://www.idownloadblog.com/2017/04/12/researchers-demonstrate-携帯電話を使用するパスコード検出方法 - モーションセンサー/) –

関連する問題