通知到来时需要3次振动

时间:2016-09-26 05:18:15

标签: ios objective-c iphone

当应用程序处于后台或未运行且通知到来时我想连续3次振动iPhone或改变振动模式

我在应用程序处于运行模式时执行代码,当时我使用NSTimer通知并使用下面的代码进行振动。

 AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

但在后台和应用程序中的应用程序关闭时无效。

如果有人有任何想法,请建议我。

2 个答案:

答案 0 :(得分:0)

由于NSTimer无法在后台运行,所以当app在后台时,它不会调用振动设备的方法。

以下是另一种不使用计时器振动设备的工作。

//Call Your method like this 
    self.vibrateCount = 0;
    [self vibrateDevice];

-(void)vibrateDevice{
    NSLog(@"Device Vibrate");
    AudioServicesPlaySystemSoundWithCompletion(kSystemSoundID_Vibrate, ^{
        AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate);
    });
    self.vibrateCount++;

    if (self.vibrateCount<3) {
//        [self performSelector:@selector(vibrateDevice) withObject:nil afterDelay:1.0];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:1 target:self  selector:@selector(vibrateDevice) userInfo:nil repeats:NO];

            [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode];

            [[NSRunLoop currentRunLoop] run];
        });
    }
}

这将在后台应用模式下工作,但您只有有限的时间(仅约10秒)在您收到通知时调用此功能,所以请小心调用它。

希望这会奏效!

答案 1 :(得分:0)

我尝试过

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void){            AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

这根本不起作用。 我的APNS有效载荷是

{
    "aps":{
        "alert":"YOUR MESSAGE",
        "content-available" : 1
    }
}

而且,我尝试了UNNotificationServiceExtension。我尝试过

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
}

它也不起作用。因此,我认为在后台进行远程推送时不可能多次振动。