web-dev-qa-db-ja.com

アプリがiOSのローカル通知からフォアグラウンドに入ったときに特定のアクションをトリガーしますか? (Swiftを使用)

新しい言語のSwiftを使用してiOSアプリを作成しています。これは、UIWebViewを使用してHTMLコンテンツを表示するHTML5アプリです。アプリにはローカル通知があり、アプリがローカル通知をクリック(タッチ)してフォアグラウンドに入ったときに、UIWebViewで特定のjavascriptメソッドをトリガーする必要があります。

私はこれを見てきました question が、私の問題を解決していないようです。私もこれに遭遇しました question これは、UIApplicationStateの使用について教えてくれます。これは、アプリが通知からフォアグラウンドに入ったことを知るのに役立つので、良いことです。しかし、アプリが再開したとき、アプリが再開したときに表示されるビューのviewControllerでメソッドを呼び出すにはどうすればよいですか?

私がしたいのは、ViewControllerのインスタンスを取得し、そのプロパティをtrueに設定することです。次のようなもの

class FirstViewController: UIViewController,UIWebViewDelegate { 
  var execute:Bool = false;
  @IBOutlet var tasksView: UIWebView!
}

そして私のAppDelegateに私はメソッドがあります

func applicationWillEnterForeground(application: UIApplication!) {
    let viewController = self.window!.rootViewController;
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    var setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("FirstView") as FirstViewController
    setViewController.execute = true;


}

アプリがフォアグラウンドに戻ったときに実行したいのは、実行変数を見て、次のようにメソッドを実行することです。

if execute{
 tasksView.stringByEvaluatingJavaScriptFromString("document.getElementById('sample').click()");
}

WebviewからJavaScriptをトリガーするロジックのコードをどこに配置すればよいですか?それはviewDidLoadメソッド、またはwebViewデリゲートメソッドの1つですか?そのコードをviewDidLoadメソッドに配置しようとしましたが、ブール実行の値は、アプリがフォアグラウンドに入ったときにデリゲートに設定された値ではなく、初期値に設定されています。

21
cptdanko

アプリがフォアグラウンドに戻ったときにビューコントローラーに通知する場合は、_UIApplication.willEnterForegroundNotification_通知に登録するだけです(アプリのデリゲートメソッドを完全にバイパスします)。

_class ViewController: UIViewController {

    private var observer: NSObjectProtocol?

    override func viewDidLoad() {
        super.viewDidLoad()

        observer = NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: .main) { [unowned self] notification in
            // do whatever you want when the app is brought back to the foreground
        }
    }

    deinit {
        if let observer = observer {
            NotificationCenter.default.removeObserver(observer)
        }
    }
}
_

注:完了クロージャには_[unowned self]_を含めて、ブロック内でselfを参照した場合にビューコントローラーが割り当て解除されないようにする強い参照サイクルを回避しています(おそらく、クラス変数を更新するか、実質的に興味深いことを実行します)。

また、removeObserverdocumentation のカジュアルな読み取りによって不要と結論付ける可能性がありますが、オブザーバーを削除することにも注意してください。

アプリがiOS 9.0以降またはmacOS 10.11以降をターゲットにしている場合、deallocメソッドでオブザーバーの登録を解除する必要はありません。

ただし、このブロックベースのレンディションを使用する場合は、通知センターのオブザーバーを削除する必要があります。として ドキュメント for addObserver(forName:object:queue:using:)は言う:

観測の登録を解除するには、このメソッドによって返されたオブジェクトを removeObserver(_:) に渡します。 removeObserver(_:)で指定されたオブジェクトの割り当てを解除する前に、 removeObserver(_:name:object:) または addObserver(forName:object:queue:using:) を呼び出す必要があります。

58
Rob

ViewControllerに以下のコードを追加

override func viewDidLoad() {
super.viewDidLoad()
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector:#selector(appMovedToForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
   }

  @objc func appMovedToForeground() {
  print("App moved to foreground!")
  }
0
ShigaSuresh