ios open dev のロゴ テンプレートを使用して微調整を行っていますが、既存のフレームワークのすべてのヘッダー ファイルを調べたところ、誰かが電話をかけた後に呼び出されるメソッドを持つ正しいヘッダーが見つかりません。誰がそれがどれであるか知っていますか? Cydiaで利用できる「AskToCall」のようなことをしようとしています。これは、緑色のボタンが押されたときに、電話がかけられたときにUIAlertViewを表示します。
ありがとうございました!
1) まず、プライベート フレームワーク CoreTelephony にリンクする必要があります。ロゴ プロジェクトの Makefile に、必ず yourprojectname_PRIVATE_FRAMEWORKS = CoreTelephony を含めてください。また、MobileSubstrate .plist ファイルが「com.apple.mobilephone」をフィルター処理していることを確認してください。
2) iPhone の電話アプリケーションは、CoreTelephony の CTCallDialWithID 関数を使用して電話をかけます。関数をフックするだけで、代わりに自分のことを行うことができます。
#import "substrate.h" // for MSHookFunction definition
extern "C" void CTCallDialWithID(NSString *numberToDial); // function declaration
static void (*original_CTCallDialWithID)(NSString *numberToDial); //define a function pointer on which you'll assign the original call later
static void replaced_CTCallDialWithID(NSString *numberToDial){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Verify New Call" message:[NSString stringWithFormat:@"Are you sure you want to call %@",numberToDial]
delegate:YOUR_OBJECT cancelButtonTitle:@"No" otherButtonTitles:@"Yes,please",nil];
[alert show];
[alert release];
}
あなたのコンストラクターで:
%ctor{
%init();
MSHookFunction((void *)CTCallDialWithID,(void *)replaced_CTCallDialWithID,(void **)&original_CTCallDialWithID);
// Replace original function implementation with your replaced_ one.
}
関数の実装を置き換えた後、最終的に (たとえば、alertview のデリゲートで) 実際に番号をダイヤルするには、次を使用します。
CTCallDial(NSString *number);
CTCallDialWithID は {...} パラメータを想定しており、正しく機能しないためです。
これは、CTCallDialWithID の Phone.app のグローバル フックであることに注意してください (最近の通話をタップしてダイヤルしたり、お気に入りなどをタップしたりするなど、すべての発信通話に対して機能します。
コールボタンを押したときだけのフックが必要な場合:
%hook DialerController
-(void)_callButtonPressed:(id)pressed{
UIView *dialerView=MSHookIvar<UIView *>(self,"_dialerView");
UILabel *lcd=MSHookIvar<UILabel *>(dialerView,"_lcd");
NSString *numberToBeDialed=[lcd text];
// do your thing with the number in here.
}
%end
この方法を以前に見つけて、うまくいかなかったとおっしゃっていました。MobilePhone.app に注入していないため、おそらくうまくいきませんでした。
theos プロジェクトの .plist ファイルは次のようになります。
Filter = { Bundles = ("com.apple.mobilephone");};
これを行うには、iPhone または復号化された ipsw ファイルのファイルシステムから MobilePhone.app (/Applications/MobilePhone.app にあります) ヘッダーをダンプする必要があります。次に、これらのヘッダーを調べる必要があります。あなたが探しているものがそこにあるはずです。このレポから必要なヘッダーclass-dump
または(推奨)ヘッダーをダンプするには:class-dump-z
ininjas.com/repo/
次に、 Mobile Terminal (Cydia から)をインストールして実行する必要があります。
class-dump-z -H /Applications/MobilePhone.app/MobilePhone -O /var/mobile/somefolder (これは iPod touch 4 でも動作するはずです)
/var/mobile/somefolder のヘッダーを取得するには
次に、すべてのヘッダーを /var/theos/include/MobilePhone に配置する必要があります (theos フォルダーがどこにあっても、私の場合はデバイス上にあるため、/var/theos/include)
その後、行を追加する必要があります
#import <MobilePhone/MobilePhone.h>
あなたのtweak.xmで
OK、うまくいけば、私はあなたの質問を理解しています.
「本当に電話をかけますか?」という警告ポップアップを表示したいだけです。はいといいえボタンで。
これはあなたがそれを行う方法です:
// View Controller Header File (.h file)
@interface MyViewController <UIAlertViewDelegate>
{
UIButton *callButton;
}
// View Controller Implementation File (.m file)
-(void)viewDidLoad
{
...
[callButton addTarget:self selector:@selector(confirmCall) forControlEvent:UIControlTouchUpInside];
...
}
-(void)confirmCall
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Confirm Call"
message:@"Really make call?"
delegate:self
cancelButtonTitle:@"No"
otherButtonTitles:@"Yes", nil
];
[alert show];
[alert release];
}
// UIAlertViewDelegate callback method
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// ---------------------------------------------------------------------------
// Alert view button indexes starts from 0 (left most button)
// and increments for the next button.
//
// In our case, "No" button would have index 0 because it is the first button
// followed by the "Yes" button having an index 1
//
// So what we're saying below is if user presses on the "Yes" button
// for an alert that has the title "Confirm Call", then call that number
// ---------------------------------------------------------------------------
if([alertView.title isEqualToString:@"Confirm Call"] && buttonIndex == 1)
{
[self callNumber];
}
}
-(void)callNumber
{
NSString *rawNumber = [[NSString alloc] initWithString:@"+61 8 9123 4567"];
NSString *cleanedString = [[NSString alloc] initWithString:[[rawNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""]];
NSString *escapedPhoneNumber = [[NSString alloc] initWithString:[cleanedString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSString *properPhoneNumber = [[NSString alloc] initWithFormat:@"tel://%@",escapedPhoneNumber];
NSURL *telURL = [[NSURL alloc] initWithString:properPhoneNumber];
// prevent non phone iOS device from trying to making calls (iPod, iPad)
if([[UIApplication sharedApplication] canOpenURL:telURL])
{
// make call now
[[UIApplication sharedApplication] openURL:telURL];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Device Cannot Call"
message:@"This device cannot make phone calls. Would you like to send an email instead ?"
delegate:self
cancelButtonTitle:@"No"
otherButtonTitles:@"Yes", nil];
[alert show];
[alert release];
}
[telURL release];
[properPhoneNumber release];
[escapedPhoneNumber release];
[cleanedString release];
[rawNumber release];
}