4

電話をかけたいので、以下のコードを使用します。

- (void)callPhoneNumber:(NSString *)phoneNumber
{
    UIWebView * webView2 = [[UIWebView alloc] init];

    // Remove non-digits from phone number
    phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];

    // Make a call
    NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", phoneNumber]];
    [webView2 loadRequest:[NSURLRequest requestWithURL:url]];
    [self.view addSubview:webView2];
}

電話をかける前に、ユーザーに を使用してオプションを選択するように求めますUIActionSheet。ユーザーがオプションを選択すると、それに基づいて電話をかけます。

問題は、表示せずUIActionSheetに直接電話をかけると、上記のコードが正常に機能することです。ユーザーに電話をかけることの確認を求めるアラートが表示されます。しかし、UIActionSheet上記のメソッドを呼び出すと表示された後、確認アラートは表示されません。

奇妙なことは、この後 Xcode からアプリを停止すると、アプリが必要に応じてイオン バックグラウンドに配置されることです。しかし、デバイスのホーム画面にも確認アラートが表示されます。アプリではなく、デバイスのホーム画面にどのように表示されますか?

誰かが前にそれに直面したことがありますか?その理由は何ですか?

編集:私も以下のコードを試しました。しかし、同じ問題があります。上記の webview コードが機能するときはいつでも、以下のコードも機能します。動かない時も同様。

NSString *phoneNumberURL = [NSString  stringWithFormat:@"telprompt:%@", phoneNumber];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumberURL]];

編集:アクションシートとデリゲートのコードを追加。

最初にアラートを表示します。アラートボタンを押すと、アクションシートが表示されます。そして、アクションシートからオプションを選択して電話をかけます。

# pragma mark - ALERT VIEW DELEGATE

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(alertView.tag == MY_TAG)
    {
        // Ask to select option
        UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select Option" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Option1", @"Option2", nil];
        actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
        [actionSheet showInView:self.view];   
    }
}


#pragma mark - UIActionSheet Methods

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    // If not pressed cancel button.i.e. selected one of the options
    if (buttonIndex != actionSheet.cancelButtonIndex)
    {
        // Place a call
        [self callPhoneNumber:@"1234567890"];
    }
}
4

6 に答える 6

1

番号に空白がある場合は機能しないため、これを使用する場合にも削除する必要がありtel:、余分な.telprompt:tel://telprompt:////

他にコメントが必要な場合は、各ステップの説明をコードにコメントしました。詳細を提供します。

- (void)callPhoneNumber:(NSString *)phoneNumber
{
    // If statement to check we actually have something
    if(phoneNumber) {
        // Remove any unwanted whitespace, if there is any whitespace it will not work
        phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
        // Create an NSURL instance of your number
        // Note the extra `//` in the string
        // Also note you can also use: `telprompt://` instead of `tel://`
        NSURL *urlPhoneNumber = [NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", phoneNumber]];
        // Check to make sure we can open this because iPad and iPod will not respond to phone calls
        if([[UIApplication sharedApplication] canOpenURL:urlPhoneNumber]) {
            // If we can (So if iPhone really) make the call.
            [[UIApplication sharedApplication] openURL:urlPhoneNumber];
        }
    }
}

付記の編集

これに関するAppleのドキュメントをここで読んでください

Apple のドキュメントには、tel:andtelprompt:は機能するはずであり、extra は不要であると//記載されていますが、extra を使用しても機能することがわかりました//tel:これは技術的に少し混乱しますtelprompt:が、「URL スキーム」にURL Schemesは追加のものが必要です。これは、 iPhone Development 101//によるそれらに関する優れたチュートリアルです。

ここに少し追加情報があります

于 2014-05-12T10:42:27.437 に答える
0

現在の更新ループの完了後[self callPhoneNumber ... ]に呼び出す代わりに、次を使用してみてください。callPhoneNumber

[self performSelector:@selector(callPhoneNumber:) withObject:@"1234567890" afterDelay:0];

また、UIActionSheet参照ドキュメントには次のように記載されています。

iOS 4.0 以降では、アプリケーションがバックグラウンドに移動したときにアクション シートが自動的に閉じられません。

applicationWillResignActiveそのため、 が表示されているかどうかをチェックインし、actionSheetプログラムで閉じる必要があります。

于 2014-05-12T10:04:35.437 に答える
0

を呼び出してみdidDismissWithButtonIndex:て、UIActionSheet が既に閉じられているようにします。何かをブロックしている可能性があります。

于 2014-05-18T21:38:00.600 に答える