10

アプリから呼び出しを行った後、アプリに戻る必要があるため、次のコードを使用します。

NSURL *url = [NSURL URLWithString:@"telprompt://123-4567-890"]; 
[[UIApplication  sharedApplication] openURL:url]; 

ユーザーがボタンを押してこのコードを実行すると、「Call」と「Cancel」の 2 つのボタンでアラートが表示されます。

ユーザーが「通話」ボタンを押したかどうかを確認するにはどうすればよいですか?

4

6 に答える 6

12

これはSwift 4.2用のiOS 10+ソリューションで、iOS 12 でテストされており、[キャンセル] ボタンと [通話] ボタンの両方を検出します。

CallKit をインポートして、クラスを に準拠させることを忘れないでくださいCXCallObserverDelegate!

let callObserver = CXCallObserver()

var didDetectOutgoingCall = false

func showCallAlert() {
    guard let url = URL(string: "tel:+36201234567"),
        UIApplication.shared.canOpenURL(url) else {
            return
    }

    callObserver.setDelegate(self, queue: nil)

    didDetectOutgoingCall = false

    //we only want to add the observer after the alert is displayed,
    //that's why we're using asyncAfter(deadline:)
    UIApplication.shared.open(url, options: [:]) { [weak self] success in
        if success {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                self?.addNotifObserver()
            }
        }
    }
}

func addNotifObserver() {
    let selector = #selector(appDidBecomeActive)
    let notifName = UIApplication.didBecomeActiveNotification
    NotificationCenter.default.addObserver(self, selector: selector, name: notifName, object: nil)
}

@objc func appDidBecomeActive() {
    //if callObserver(_:callChanged:) doesn't get called after a certain time,
    //the call dialog was not shown - so the Cancel button was pressed
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in
        if !(self?.didDetectOutgoingCall ?? true) {
            print("Cancel button pressed")
        }
    }
}

func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
    if call.isOutgoing && !didDetectOutgoingCall {
        didDetectOutgoingCall = true

        print("Call button pressed")
    }
}
于 2018-06-23T08:45:46.713 に答える
9

これは完璧ではありませんが、UIApplicationSuspendedNotification をリッスンすることで、「キャンセル」ではなく「呼び出し」が押されたことを識別できます (誰かが「ホーム」キーを押したとき、または着信を受け入れる...おそらく、電話番号が表示されているロジックの周りにオブザーバーを追加/削除することによって):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(suspended:) name:@"UIApplicationSuspendedNotification" object:nil];

-(void)suspended:(NSNotification *) notification
{
    NSLog(@"Suspended");
}
于 2012-12-06T12:46:49.113 に答える
2

iOSの用語によると、それは不可能です。通話を完了すると、アプリケーションにリダイレクトできません。

脱獄した電話でのみ可能です。

于 2012-12-06T12:22:43.677 に答える
1

アプリケーションが上記のコードを実行すると、現在のアプリケーションを終了し、iPhone の呼び出しアプリケーションに移動します。そのため、アプリケーションは、ユーザーが呼び出しまたはキャンセルを押したかどうかを識別することができません。願っています、それはあなたを助けるでしょう。

于 2012-12-06T12:24:35.687 に答える
0

これを試してください、私はこの問題を次のように扱います:

以下を-(void)viewDidLoad追加します。

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

[center addObserverForName:UIApplicationDidBecomeActiveNotification
                    object:nil
                     queue:[NSOperationQueue mainQueue]
                usingBlock:^(NSNotification *note)
 {
     // use instance flag to know
     if (self.isBeginCallPhone)
     {
         //do some thing
         self.isBeginCallPhone = NO;
     }
 }];

忘れないでください:</p>

- (void)dealloc{
    [[NSNotificationCenter defaultCenter]removeObserver:self];
  }
于 2013-10-30T12:07:10.897 に答える