11

今日の拡張機能を含むアプリを作成しています。今日の拡張機能はタイマーのリストを表示します。ユーザーがタイマーの 1 つを選択した場合、そのタイマーのローカル通知を作成してスケジュールしたいと思います。

私の問題は、通知のスケジューリングが次のコード行で行われることです:

UIApplication.sharedApplication().scheduleLocalNotification(notification)

UIApplication.sharedApplication()残念ながら、拡張機能からアクセスできないことに依存しています。

私の質問は次のとおりです。Today 拡張機能内からローカル通知をスケジュールするにはどうすればよいですか?

おかしなことに、アプリと拡張機能の間で共有されるコードを使用してフレームワークを作成し、そのフレームワークで次を呼び出すことができます。

func schedule() {
    // ...
    let settings = UIUserNotificationSettings(forTypes: .Sound | .Alert, categories: nil)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)
    // ...
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
    // ...
}

次に、そのフレームワークを拡張機能からインポートして呼び出すschedule()と、次の出力が得られます。

Failed to inherit CoreMedia permissions from 13636: (null)

Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7feaf3657a00>{fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, user info = (null)} with an alert but haven't received permission from the user to display alerts

Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7feaf3657a00>{fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, user info = (null)} with a sound but haven't received permission from the user to play sounds

したがって、UIApplication.sharedApplication()このコードは実際に通知をスケジュールしようとするため、拡張機能で実行されているモジュールはアクセスできますが、システムは拡張機能がアラートを表示する許可を求める準備ができていないため、失敗します (とにかくそう見えます)。

どうすればこれを解決できますか?

また、URL を使用してアプリを起動し、通常どおりアプリからの通知をスケジュールすることもできますが、それはユーザーの気まぐれではありません。今日の拡張機能を使用する目的は、ユーザーが通知をスケジュールするためにアプリを開く必要がないようにすることです。インタラクションは迅速、シンプル、透過的である必要があり、数行のコードを実行するためだけに、ユーザーがいるアプリからユーザーを引っ張り出し、それを完了することは、私がやりたいことではありません。

4

3 に答える 3

5

これを行うと、これが可能になると思います:

  1. ローカル通知をスケジュールする場合は、today 拡張機能で通知を作成し、その情報を共有コンテナー内のファイルに書き込みます。

  2. (サーバーが必要です) 今日の拡張機能からサーバーに連絡し、サーバーに slient プッシュ通知 (コンテンツ利用可能: 1) を送信するように依頼します。これにより、メイン アプリが起動します。

  3. アプリがリモート通知によって起動されると、ステップ 1 で作成されたファイルを共有コンテナーから読み取り、ローカル通知をスケジュールしてからスリープ状態に戻ります。

于 2014-12-25T09:58:56.910 に答える
3

これが機能する可能性は非常に低いです。アプリ拡張機能は にアクセスできませんsharedApplication。コンパイラがそうしていることに気付かないようにすることが可能であるという事実は、それを変えません。デバッガーでこれを試してみると、sharedApplication実際には nil が返されており、これがコードが失敗している理由だと思います。

それを機能させる方法を見つけることができる場合は、それに頼らないでください。Apple はほぼ確実にそれをバグと見なし、将来のリリースで修正して、警告なしに拡張機能を壊します。

于 2014-11-04T17:56:35.820 に答える