如何通过应用程序状态使UNUserNotification保持一致?

时间:2019-07-11 08:48:18

标签: ios swift

我这样发出UNUserNotification:

Label

它将显示一个带有标题和正文的通知,以及两个自定义操作按钮(接受和拒绝,这是一个来电)。它也可以播放声音,但由于某种原因,如果应用程序是前台,则不会。
我还尝试用它伪造一个持久性通知,就像Whatsapp通过每隔约4秒钟重复一次本地通知来做到这一点一样,但是第二次它显示通知时声音被切断了。这不是第一个声音,第二个声音是自己播放的,但是这次并没有完全播放。声音只有1-2秒。
我不明白为什么会有这些差异,如何使它始终播放声音(前景,背景,不运行),以及如何确保第二次显示通知时声音不会被切断?

1 个答案:

答案 0 :(得分:0)

在应用程序运行时收到通知时,通常会将通知静音,以便应用程序可以更本地化的方式处理它们。

如果我没记错的话,收到通知会打电话给

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class SessionsController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth')->except(['create', 'login']);
    }

    public function create()
    {
        $data = [
            'title' => 'Login',
            'body_class' => 'hold-transition login-page',
        ];

        return view('auth.login', $data);
    }

    public function login(Request $request)
    {
        $this->validate($request, [
            'username' => 'required',
            'password' => 'required',
        ]);

        $user = User::checkCredentials($request->username, $request->password);
        if (!$user) {
            return back()->with([
                'class' => 'alert-danger',
                'message' => 'Please check your credentials',
            ]);
        }

        // set session active flag to true
        $user->session_active = true;
        $user->save();

        auth()->login($user);
        return redirect()->route('dashboard');
    }

    public function destroy()
    {
        $user = auth()->user();
        $user->last_login = date('Y-m-d H:i:s');
        $user->session_active = false;
        $user->save();

        auth()->logout();

        return redirect()->route('login')->with([
            'class' => 'alert-success',
            'message' => 'You logged out successfully',
        ]);
    }
}

在收到通知时调用此方法,并且如果应用程序在前台运行,则通常将其静音。完成处理程序确定应采取的操作以及是否应显示通知或发出声音等。

在这种情况下,如果someCondition为true,则它应该像往常一样自然显示通知,否则不执行任何操作。

尝试在您的应用中使用此方法调用func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { if someCondition { completionHandler(.alert) } else { completionHandler(.init(rawValue: 0)) } } ,通知应显示

检出documentation here