iOS SDKを調べお、文曞化されおいないAPIを䜿甚する

この章ずこの本党䜓から、iOSプログラミングのほずんどの情報が公開フレヌムワヌクに含たれおいるこずは明らかですが、SDKには含たれおいたせん。 これに関するAppleの非公匏のポリシヌは単玔です。これはすべお䜿甚できたすが、ご自身の危険ずリスクがある堎合に限りたす。 次のファヌムりェア曎新䞭にコヌドが砎損する堎合がありたす。 あなた自身がリスクず利益の劥協点を芋぀けなければなりたせん。

゚リカ・サダン、iPhone開発者の料理本
オリゞナル
この章および本曞で説明したように、iPhoneプログラミングの最も優れた郚分のいく぀かは、公開のiPhoneフレヌムワヌクに含たれおいたすが、SDKには含たれおいたせん。 これに関するAppleの非公匏のポリシヌは明確ですこれらのアむテムはプログラムで䜿甚できたすが、䜿甚するのは自己責任で行い、ファヌムりェアのリリヌスごずにコヌドが砎損する可胜性がありたす。 リスクず報酬のバランスをずるのはあなた次第です。


免責事項





SDKのクむック怜玢ガむド



公匏文曞の範囲を超える䜕かをする必芁があるずしたしょう。 たずえば、バックラむトレベルを倉曎したすiOS 5より前は、これはSDKの文曞化された郚分にありたせんでした。 Appleプログラマヌは通垞、関数ず倉数に意味のある衚珟力豊かな名前を付けるこずが知られおいたす。これはSDKの怜玢に䜿甚したす。 これを行うには、トピックに関連するいく぀かの単語明るさ、レベル、画面などを遞択したす。 スクリプトLookSDKForSymbol.shこれはnm



ラッパヌです。このスクリプトず䜿甚される他のツヌルに぀いおは、「 ツヌル」セクションで埌述したす をキヌワヌドずしおパラメヌタヌずしお実行したす。 スクリプトは、オブゞェクトファむルで芋぀かった文字クラス、関数、倉数の名前を返したす。 問題の䟋

$ LookSDKForSymbol.shラむトレベル

U _UIBacklightLevelChangedNotification

./System/Library/CoreServices/SpringBoard.app/SpringBoardにありたす



001b43c4 t-[UIApplicationバックラむトレベル]

001b4360 t-[UIApplication setBacklightLevel]

0025ce54 t-[UIDevice _backlightLevel]

0025ce40 t-[UIDevice _setBacklightLevel]

...さらに数十文字



たずえば、ほずんどの結果はすぐに砎棄できたす。たずえば、 -[UIApplication backlightLevel]



はバックラむト倀を返したすが、蚭定したせん。



残りの数十個以䞋の堎合は、Googleにフィヌドを詊行できたす。 誰かが既に芋぀かったキャラクタヌに関連するAPIを調査しおおり、この堎合、問題が解決したず考えおいたす。 より耇雑なケヌスでは、リバヌス゚ンゞニアリングを実行する必芁がありたす。぀たり、芋぀かった機胜がどのように機胜するか、芋぀かったアラヌトを䜿甚する方法などを芋぀ける必芁がありたす。



ナヌティリティによっお発行される文字列は、次のカテゎリに分類されたす。

  1. Objective-CおよびC ++の関数、クラス、構造など。 Objective-Cに関連するものにはすべお、角括匧[]たたはドル蚘号$が含たれおいたす。 C ++関数は通垞、いく぀かの名前空間に含たれおいるため、名前には名前空間解決文字である2぀のコロン:)が含たれおいたす。
  2. Objective-Cブロック。 これらの䞀般的な倖芳は次のずおりです。

      ___{}{   }_block_invoke_{2}
          
          





    䟋

      ___22-[AXSystemServer init]_block_invoke_0
          
          



  3. 玔粋なC関数。
  4. Objective-Cアラヌト。 _SBMenuButtonPressedNotification



    などの通知で終了したす。
  5. キヌ/定数。 通垞、kで始たりたす䟋_ kCFUserNotificationAlternateButtonTitleKey



    。


以降のアクションは、シンボルのカテゎリによっお異なりたす。

  1. このフレヌムワヌクのヘッダヌファむルを生成したす。

    class-dump-z Foundation> $ / iOS_private_headers / Foundation.h


    ほずんどの堎合、生成されたヘッダヌファむルで十分です。クラスの継承階局、構造、メ゜ッドなどは十分に説明する必芁がありたす。そのため、少し時間を割いおAPIを把握し、提案で䜿甚できたす。



    残念ながら、ヘッダヌファむルに含たれる情報ではコヌドを機胜させるのに十分でない堎合があり、otoolで生成されたアセンブラコヌドを分析する必芁がありたす。



    Objective-Cコヌドを逆アセンブルするためのヒントほが確実に、objc_msgSendオブゞェクトぞのメッセヌゞの送信などの関数呌び出しが発生したす。 最初のパラメヌタヌは垞にオブゞェクトぞのポむンタヌであり、2番目のパラメヌタヌはセレクタヌぞのポむンタヌです。 メ゜ッドの名前である文字列ぞのポむンタ「通垞の」匕数の残りは3番目、4番目などの匕数です。 この堎合に送信されるメッセヌゞのhexdump



    を刀断するには、 hexdump



    が圹立ちたす。

  2. すぐに忘れるこずができたす。 ブロックは通垞ロヌカルであり、コヌドから呌び出すこずはできたせん。
  3. 最も難しいオプション。 最も単玔なケヌスでは、関数のシグネチャを遞択できたすが、それ以倖の堎合は逆アセンブリのみです。 この詳现に぀いおは、 「䞍明な関数のシグネチャを芋぀ける方法」セクションをご芧ください。
  4. 3぀の䞻芁なアラヌトセンタヌLocal、Darwin、およびCoreTelephonyのいずれかでアラヌトをキャッチしようずするこずから始めたしょう。 このタむプのアラヌトが届かない堎合、次の2぀のいずれかがありたす。

    -このタむプのアラヌトは、別の特別なアラヌトセンタヌに送られたす。 芋぀かったアラヌトが属する同じフレヌムワヌクで、そのような通知センタヌのトレヌスを怜玢する必芁がありたす。

    -アラヌト配信は無効です。 このタむプのアラヌトの配信を有効にするメカニズムを芋぀けおください。

  5. この堎合、ほずんどの堎合、この定数をパラメヌタヌずしお受け入れる関数、たたはこの定数をキヌずする蟞曞がありたす。 いずれにしおも、名前が同じ単語で始たる関数たたはメ゜ッドを探す必芁がありたす䟋constant kLockdownDeviceColorKey



    > function lockdown_copy_value(...)



    ;



未知の関数のシグネチャを芋぀ける方法は



1.むンタヌネット䞊で怜玢したす。これは䞀般的ではありたせん。 私は非垞に頻繁に䞭囜のサむトに出くわしたした、非垞に有甚な情報を持぀韓囜語ず日本語のサむトがありたした。 通垞、コヌド自䜓は、䜕が起こっおいるのか、この関数、このクラスなどがどのように䜿甚されるのかを理解するのに十分です。 Objective-Cの冗長性ず衚珟力に感謝したす

2.倚くの単玔な関数では、眲名を掚枬するこずができたす。 泚意 、これは非垞に危険です。

GSEventSetBackLightLevelなどのいく぀かの単玔な関数の䜿甚は自明です。

void GSEventSetBackLightLevelfloatレベル;



他の倚くの堎合、次のトリックを䜿甚したしたSBGetRingerSwitchState関数の䟋を䜿甚。



  SInt32 ret = 5, out1 = 1, out2 = 2, out3 = 3, out4 = 4; void *libHandle = dlopen(SPRINGBOARD_SERVICES_PATH, RTLD_LAZY); SInt32 (*SBGetRingerSwitchState)(SInt32*,SInt32*,SInt32*,SInt32*) = dlsym(libHandle, "SBGetRingerSwitchState"); ret = SBGetRingerSwitchState(&out1, &out2, &out3, &out4); NSLog(@"%x %x %x %x %x", ret, out1, out2, out3, out4);
      
      





このコヌドの結果、次のこずが刀明したした

1関数は、スむッチの実際の䜍眮に0x10000003



、 0x10000003



倀を返したした。

2倉数out2



はその倀をselfに倉曎したした。 戻り倀もスむッチに䟝存したせん。

3残りの倉数は倀を倉曎しおいたせん。



1から、0x10000003はMACH_SEND_INVALID_ DEST



システム゚ラヌに察応しおいるため、関数はkern_return_t



型の倀を返すず結論付けたした。 どうやら、゚ラヌは間違ったポヌトを指しおいた[この堎合、ポヌトはマッハカヌネルマッハカヌネルの抜象化であり、プロセスの暩利ず優先床を特城づけおいたす]。 原則ずしお、関数呌び出しでポヌト番号が䜿甚される堎合、それは最初の匕数です。 2から、2番目の匕数を通じお、関数は参照によっお特定の倀を返したす。



これらの単玔なアクションの結果ずしお、次の眲名が取埗されたす。

  kern_return_t SBGetRingerSwitchState(mach_port_t port, SInt32 *state);
      
      







ずころで、getずいう名前にgetずいう単語が含たれおいる堎合、Objective-Cの呜名芏則に埓っお、この関数は参照によっお倀を返す必芁がありたす。 これは䞊蚘の䟋からも明らかです。



3.分解。 同じSBGetRingerSwitchStateの䟋。 otoolを䜿甚したす。



$ otool -p _SBGetRingerSwitchState -t​​V -arch armv6 SpringBoardServices | 少ない

000038cc b5f0 push {r4、r5、r6、r7、lr}

000038ce af03 add r7、sp、12

000038d0 b092 sub sp、72

000038d2 aa06 add r2、sp、24 //レゞスタr2の倀が䞊曞きされたす

000038d4 9205 str r2、[sp、20]

000038d6 ac08 add r4、sp、32 // ...およびレゞスタr4

000038d8 ab0f add r3、sp、60 // ...およびr3

000038da 9304 str r3、[sp、16]

000038dc 9103 str r1、[sp、12] // r1の倀はスタックに保存されたす

000038de 4925 ldr r1、[pc、148]0x3974

000038e0 6011 str r1、[r2、0]

000038e2 6020 str r0、[r4、0] // r0の倀もスタックに保存されたす

...





このコヌドから、アヌムアセンブラの衚面的な知識さえ䜿甚しお、関数が単語型の2぀の匕数を受け入れるず仮定できたす。

関数には2぀の匕数があるこずがわかりたす。 さらに最埌たで行きたす。



...

00003964 9e04 ldr r6、[sp、16]

00003966 6836 ldr r6、[r6、0]

00003968 9903 ldr r1、[sp、12]

0000396a 600e str r6、[r1、0]

//ほが察応したすC蚀語の芳点から* r1 = r6; ぀たり r1に保存されおいるアドレスに、r6の倀が曞き蟌たれたす。

//これは、関数が参照によっお倀を返すこずを意味したす

0000396c 462e mov r6、r5

0000396e 4630 mov r0、r6

//関数の結果はr0に配眮されたす

00003970 b012 SPを远加、72

00003972 bdf0 pop {r4、r5、r6、r7、pc}

...





䞀番䞋の行は次のずおりです。

 int SBGetRingerSwitchState(int arg1, int* arg2);
      
      







このアセンブリコヌドの分析を続け、型を明確にしお最終バヌゞョンに到達したす。

 kern_return_t SBGetRingerSwitchState(mach_port_t port, SInt32 *state);
      
      







異なるファヌムりェアず異なるデバむス䜕が壊れるか、どのように修正するか


文曞化されおいないAPIがすべおのデバむスで必ずしも同じように機胜するわけではないこずは明らかです。 私の経隓では、ほずんどの堎合䜕も倉わらず、APIはすべおのデバむスずすべおのファヌムりェアで同じように機胜したす。 したがっお、たずえば、 UIDevice-IOKitExtensions拡匵機胜のすべおの機胜IMEIの定矩を陀くは、すべおのデバむスおよびすべおのファヌムりェアで同等に機胜したす。 iOSの曎新時にどのような倉曎が発生したすか

以䞋に実甚的なオプションを瀺したす。





互換性の問題を回避するために、単玔なルヌルに埓いたす関数たずえば-[NSObject respondsToSelector:]



を䜿甚をチェックし、クラス SomeClass



堎合SomeClass



NSClassFromString(@"SomeClass")



はnil



を返したすなど。たた、APIが欠萜しおいる堎合にプログラムが䜕をすべきかを事前に考えおください。 ラむブラリラむブラリの動的リンクを䜿甚する堎合は、dlsym...およびdlopen...の戻り倀でNULLが等しいかどうかも垞に確認する必芁がありたす。



䟋
䟋1
サむドバむブレヌションスむッチ別名リング/サむレントスむッチ、ミュヌトスむッチの䜍眮の決定



私が盎面したタスクの1぀は、サむドスむッチの䜍眮を決定するこずでした。これは、元々はリング/サむレントスむッチず呌ばれおいたした。 このスむッチは、iPhoneおよびiPadで「静か」モヌドず通垞/「倧音量」モヌドを切り替えるために䜿甚されたす。 StackOverflowを怜玢するず、解決策が埗られたした。



 #import <AudioToolbox/AudioToolbox.h> ... /*  : 0:   1:   */ int switchState() { // ... //    ,  //    kAudioSessionCategoryAmbient // ... UInt32 size = sizeof(CFStringRef)); CFStringRef route; AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &route); //     CFIndex len = CFStringGetLength(route); return (len > 0); //   -  ,     ""  }
      
      







ただし、これはiOS 5では機胜したせん。新しいAPIkAudioSessionProperty_AudioRouteDescriptionを䜿甚しおも、オヌディオ入力およびオヌディオ出力に関する拡匵情報が提䟛されるため、機胜したせんでした。 オヌディオルヌト



StackOverflowをさらに怜玢しお、 この投皿を芋぀けたした。 ラむブラリ関数AudioServicesAddSystemSoundCompletionに぀いお説明したす。この関数の非暙準的な動䜜は、開発者によっおバグず芋なされおいたした。



 #import <AudioToolbox/AudioToolbox.h> ... void playSound() { AudioServicesAddSystemSoundCompletion(MySoundId, NULL, NULL, MyAudioServicesSystemSoundCompletionProc, AudioServicesPlaySystemSound(MySoundId); } void MyAudioServicesSystemSoundCompletionProc (SystemSoundID ssID, void *clientData) { //    NSLog(@"Playback has been finished"); }
      
      







非暙準の動䜜では、MyAudioServicesSystemSoundCompletionProcコヌルバックは、通垞モヌドでのサりンド再生の最埌に呌び出されたすが、「サむレント」モヌドでAudioServicesPlaySystemSoundを呌び出した盎埌に呌び出されたす。 これにより、スむッチの珟圚の状態を刀断するための抜け穎が䜜成されたす。 たずえば、再生するオヌディオファむルの長さが1秒の堎合、サむレントモヌドずラりドモヌドでMyAudioServicesSystemSoundCompletionProcを呌び出す間の時間差は1秒です。 これに基づいお、サむドスむッチの䜍眮を決定するための2番目の非同期゜リュヌションを構築したした。 ここにありたす



 #import <AudioToolbox/AudioToolbox.h> #import "MuteSwitchTet.h" ... enum MuteSwitchStates { kMuteSwitchUndefined = -1, kSoundless = 0, kSound = 1 }; @implementation MuteSwitchTest ... void MyAudioServicesSystemSoundCompletionProc (SystemSoundID ssID, void *clientData) { // ""  MuteSwitchTest *self = (MuteSwitchTest*)clientData; [NSObject cancelPreviousPerformRequestsWithTarget:self]; self.muteSwitchState = kSoundless; } - (void) cancelSystemSoundCompletion { // ""  AudioServicesRemoveSystemSoundCompletion(SoundID); self.muteSwitchState = kSound; } - (void) startPlayback { AudioServicesAddSystemSoundCompletion(SoundID, NULL, NULL, MyAudioServicesSystemSoundCompletionProc, self); AudioServicesPlaySystemSound(SoundID); [self performSelector:@selector(cancelSystemSoundCompletion) withObject:nil afterDelay:0.1]; } ... @end
      
      







この新しい゜リュヌションは機胜しおいたしたが、いく぀かの理由で私には向いおいたせんでした。 たず、非同期であり、顕著な遅延玄1/10秒で動䜜したした。 遅延を枛らすず、誀怜知が発生したした。 第二に、副䜜甚がありたした-再生された音自䜓が、ナヌザヌを混乱させるほど倧きな音でした。 その埌、オヌディオ゚ディタで人為的に音量をれロに倉えたした。 第䞉に、それはすでに汚いハックのようにあたりにも倚かったが、これは、䟋えば、 VSSilentSwitchの䜜成者が゜リュヌションを販売するこずを劚げなかったが、明らかに同じ効果に基づいおいる。



箄1か月埌、この問題に戻りたした。 nmコマンドを䜿甚しおオブゞェクトファむル内の文字を怜玢し始め、それに基づいお単玔なシェルスクリプトを䜜成したした。そのリストは、以䞋の「ツヌル」セクションにありたす。 スクリプトは、それぞれがキヌワヌドを衚す1぀、2぀、たたは3぀のパラメヌタヌで実行されたす。



$ sh〜/ドキュメント/ LookSDKForSymbol.sh RingerSwitch

結果の䞀郚が省略されおいたす

0000d738 S _kGSRingerSwitchCapability

./System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServicesにありたす

000038cc T _SBGetRingerSwitchState

0000370c T _SBGetRingerSwitchState

./System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServicesにありたす





SBGetRingerSwitchState



ず呌ばれるSBGetRingerSwitchState



は有望に芋えたした。



目的のポヌトを取埗するために、関数が䜿甚されたした

 mach_port_t SBSSpringBoardServerPort();
      
      





同じフレヌムワヌクから。



結果は次のずおりです。

 @implementation MuteSwitchTest ... - (int) switchState { //  SBSSpringBoardServerPort  SBGetRingerSwitchState //     MuteSwitchTest mach_port_t port = SBSSpringBoardServerPort(); SInt32 state; SBGetRingerSwitchState(port, &state); return (int)state; }
      
      





䟋2
IMEI定矩



IMEIInternational Mobile Equipment Identity-䞀意の識別

各電話機に割り圓おられたコヌドは、電話機の䞀皮のMACアドレスですただし、電話機にはMACアドレスもありたす



Erica Sadunのuidevice-extensionプロゞェクトからどのように出おきたか芚えおいたせんが、それを扱っおいるうちに、ある皮のプログラマヌの「金鉱」のように思えたした。



カテゎリの1぀であるUIDevieIOKit_Extensionsには、IMEIを定矩するための関数が含たれおいたす。 iOS 5.1を搭茉したiPhone 4ずiOS 4.3を搭茉したiPadでこれらの機胜をテストしたしたが、すべお機胜し、他のタスクに移りたした。 しかし、ベヌタテストでは、IMEIを決定する機胜が新しいデバむスiPad 2、新しいiPad、iPhone 4Sで機胜しないこずが刀明したした。 理由を芋぀けるために、私はStackOverflowに行きたした。そこで、私の懞念が確認されたした。 怜玢により、CoreTelephonyず呌ばれるフレヌムワヌクに導かれたした。



$ nm -g ./CoreTelephony | grep -i imei

U _kCFAbsoluteTimeIntervalSince1970

00053b28 S _kCTMobileEquipmentInfoIMEI

00053ad4 S _kCTPostponementInfoInfoIMEI

00053ac4 S _kCTPostponementStatusErrorDefaultIMEI

$ nm -g ./CoreTelephony | grep MobileEquipment

000260e4 T __CTServerConnectionCopyMobileEquipmentInfo

00053b34 S _kCTMobileEquipmentInfo1xIMSI

00053b20 S _kCTMobileEquipmentInfoCurrentMobileId

00053b24 S _kCTMobileEquipmentInfoCurrentSubscriberId

00053b40 S _kCTMobileEquipmentInfoERIVersion

00053b2c S _kCTMobileEquipmentInfoICCID

00053b28 S _kCTMobileEquipmentInfoIMEI

00053b30 S _kCTMobileEquipmentInfoIMSI

00053b38 S _kCTMobileEquipmentInfoMEID

00053b44 S _kCTMobileEquipmentInfoMIN

00053b3c S _kCTMobileEquipmentInfoPRLVersion



関数_CTServerConnectionCopyMobileEquipmentInfo...は、kCTMobileEquipmentInfo *ずいう圢匏のキヌずそれに察応する倀を持぀蟞曞CFDictionaryRefを返すず想定できたす。 幞いなこずに、今回は眲名を埩元する必芁はありたせんでした。 Googleで_CTServerConnectionCopyMobileEquipmentInfoを怜玢するず、 このペヌゞが衚瀺され 、すぐにIMEIを決定する機胜の準備が敎いたした。



 //         #include "CoreTelephony.h" ... NSString* CTGetIMEI { struct CTResult it; NSMutableDictionary *dict; CTServerConnectionRef conn; conn = _CTServerConnectionCreate(kCFAllocatorDefault, ConnectionCallback, NULL); _CTServerConnectionCopyMobileEquipmentInfo(&it, conn, &(CFMutableDictionaryRef)dict); CFRelease(conn); [dict autorelease]; return [dict objectForKey: kCTMobileEquipmentInfoIMEI]; }
      
      





このIMEI怜出方法は、すべおのデバむスで機胜したす。

その埌、IMEIを決定する別の方法を芋぀けたしたlockdownd経由。



䟋3
文曞化されおいないアラヌトの䜿甚ボリュヌムボタン。



圓初、「Notification」で終わる文字定数はシステムアラヌトの名前であり、[NSNotificationCenter defaultCenter]を䜿甚しおオブザヌバヌを登録するだけで䜿甚できるず単玔に信じおいたした。

$ sh〜/ドキュメント/ LookSDKForSymbol.sh通知$ボリュヌムの倉曎

001dbe60 S _MPAVControllerVolumeDidChangeNotification

001dbe64 S _MPAVControllerVolumeMutedDidChangeNotification

001dc4f8 S _MPMusicPlayerControllerVolumeDidChangeNotification

001dc314 S _MPVolumeViewRouteButtonChangedNotification

001dc310 S _MPVolumeViewVisibilityChangedNotification

./System/Library/Frameworks/MediaPlayer.framework/MediaPlayerにありたす



000d6d24 D _AVController_EffectiveVolumeDidChangeNotification

000d6d60 D _AVController_VolumeDidChangeNotification

000d6fec D _AVSystemController_CurrentRouteHasVolumeControlDidChangeNotification

000d6ffc D _AVSystemController_EffectiveVolumeDidChangeNotification

000d6fdc D _AVSystemController_SystemVolumeDidChangeNotification

./System/Library/PrivateFrameworks/Celestial.framework/Celestialにありたす

...そしお、他のフレヌムワヌクからさらに十数個



テストプログラムを䜜成した埌、ボリュヌムキヌを抌したずきにどのアラヌトが発生したかを確認し始めたした。

私が線集した通知のかなり倧きなリストから、これらの2぀だけが来たした。



AVController_EffectiveVolumeDidChangeNotification

AVController_VolumeDidChangeNotification



これらのアラヌトの欠点は、

12぀のボタンのどちらが抌されたかを盎接刀断するこずはできたせん

2各ボタンが抌されたずきず、



私は他のキヌワヌドを探しおいたす

$ sh〜/ Documents / LookSDKForSymbol.shボリュヌムボタン

001b221c t-[UIApplication setWantsVolumeButtonEvents]

003cce5c t _SBSetWantsVolumeButtonEvents $ shim

0054478c S __UIApplicationVolumeDownButtonDownNotification

00544 790 S __UIApplicationVolumeDownButtonUpNotification

00544784 S __UIApplicationVolumeUpButtonDownNotification

00544788 S __UIApplicationVolumeUpButtonUpNotification

./System/Library/Frameworks/UIKit.framework/UIKitにありたす

...そしお、さたざたなフレヌムワヌクからさらに数十個



UIKitからの4぀のアラヌトはすぐには機胜したせんでした。それらに関連するコマンドを発行する必芁がありたした。

  [[UIApplication sharedApplication] setWantsVolumeButtonEvents: YES];
      
      





その埌、察応するボタンを抌すこずに関する通知が来始めたした。

副䜜甚この関数を呌び出すず、音量ボタンで音量を制埡できなくなりたす。そのため、ボタンの操䜜が終了したら、呌び出す必芁がありたす。

  [[UIApplication sharedApplication] setWantsVolumeButtonEvents: NO];
      
      





䟋4
文曞化されおいないアラヌトの䜿甚SIMステヌタスの远跡



実瞟のあるスキヌムに埓っお䜜業したす。

$ sh〜/ドキュメント/ LookSDKForSymbol.sh notification $ SIM

...

00052560 S _kCTSIMSupportSIMInsertionNotification

00052564 S _kCTSIMSupportSIMStatusChangeNotification

...

000525bc S _kCTSIMSupportSIMTrayStatusNotification

...

./System/Library/Frameworks/CoreTelephony.framework/CoreTelephonyにありたす

...

./System/Library/PrivateFrameworks/FTServices.framework/FTServicesにありたす

$





最も適切なアラヌトは、名前の䞋で私に思われたした

1kCTSIMSupportSIMInsertionNotification

2kCTSIMSupportSIMStatusChangeNotification

3kCTSIMSupportSIMTrayStatusNotification



最も簡単なテストプログラムでは、1ず呌ばれるアラヌトはSIMカヌドを挿入したずきにのみ発生する名前で以前に掚枬できた、2必芁なずきに正確に挿入および削陀するずきに、通知3 たったく来たせんでした。 その埌、アラヌト3がCTTelephonyCenterず呌ばれる特別なアラヌトセンタヌに属しおいるこずを知りたした。 CTTelephonyCenterの䜿甚に぀いおは、 こちらをご芧ください 。



SIMステヌタスアラヌト



 #include "CoreTelephony.h" - (void) notificationCallback:(NSNotification)notification { ... } - (void) startUpdateSIMStatus { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationCallback:) name:kCTSIMSupportSIMStatusChangeNotification object:nil ]; } - (void) stopUpdateSIMStatus { [[NSNotificationCenter defaultCenter] removeObserver:self name:kCTSIMSupportSIMStatusChangeNotification object:nil]; }
      
      









1.


www.iphonedevwiki.net/index.php/AudioServices — SystemSoundID (< 30) , . , 1000 .



:



 - (void) playDefaultRingTone { NSURL *defaultRingTone = [NSURL URLWithString:@"/System/Library/CoreServices/SpringBoard.app/ring.m4r"]; AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:defaultRingTone error:nil]; [player play]; }
      
      





2. UIView


, UIView (superview) (subviews). ( , ) () UIWindow. ? : , UIWindow.

____



  + [UIWindow allWindowsIncludingInternalWindows: onlyVisibleWindows:]
      
      







! (UIWindow)

1)

2) - ( — [UIApplication statusBarWindow] )

3) UIAlertView ( UIAlertView).

4) .



?



, , .

, :

— UIAlertView, , ..

— -, .

— : , , , .



, . .

 @interface UIStatusBarSignalStrengthItemView : UIStatusBarItemView { @private int _signalStrengthRaw; int _signalStrengthBars; BOOL _enableRSSI; BOOL _showRSSI; } -(id)_stringForRSSI; -(float)extraRightPadding; -(void)touchesEnded:(id)ended withEvent:(id)event; -(id)contentsImageForStyle:(int)style; -(BOOL)updateForNewData:(id)newData actions:(int)actions; @end
      
      





, , UIStatusBarSignalStrengthItemView RSSI ( ) , .



, . [UIView completeDescription]:

 @interface UIView (RecursiveDescription) - (void) recursiveDescription; + (void) completeDescription @end @implementation UIView (RecursiveDescription) - (void) recursiveDescription { NSLog(@"______________________________________"); NSLog(@"%@", self); NSArray *subviews_ = [self subviews]; if ([subviews_ count] > 0) { for (UIView *subview_ in subviews_) { [subview_ recursiveDescription]; } } } - (void)completeDescription { NSArray *windows = [UIWindow allWindowsIncludingInternalWindows:YES onlyVisibleWindows:NO]; for (UIView *view in windows) { [view recursiveDescription]; } } @end
      
      





3. iOS




MIG (MIG-subsystem, Mach Interface Generator) — ( «Mach kernel»). MIG-subsystem Mac OS X - : www.opensource.apple.com/source/xnu/xnu-1228.0.2/libsyscall/mach . : www.iphonedevwiki.net/index.php/MIG_subsystem .



IORegistry, I/O registry — -; , iPhone . IORegistry (. UIDevice-IOKitExtensions ).



ツヌル


nm — UNIX-, .

nm ( ) bash-, iOS SDK.



LookSDKForSymbol.sh:

  #!/bin/bash SDK=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk PrivateFrameworks=$SDK/System/Library/PrivateFrameworks Frameworks=$SDK/System/Library/Frameworks Lib=$SDK/usr/lib cd $SDK for i in $(find -f .); do test -f $i && nm $i | c++filt | grep -i "$1" | grep -i "$2" | grep -i "$3" && echo "Found in $i "; done
      
      





c++filt — ( demangling ) . ++; objective-C .

otool — .

hexdump — :-)

class-dump-z — . . , , , , , .

Google Code — .



Hex-Rays ARM Decompiler — HEX-Rays IDA, ARM . .

— , , .



,


Wiki


www.iphonedevwiki.net

wiki, jailbreak .

(iOS 3.x, iOS 4.x), .



人


1. (Jay Freeman, saurik)

www.saurik.com



2. (Erica Sadun) — «The iPhone Developer's CookBook» «The iOS 5 Developer's Cookbook: Core Concepts and Essential Recipes for iOS Programmers», . .

ericasadun.com



:

github.com/erica/iOS-5-Cookbook

github.com/erica/iphone-3.0-cookbook-



github.com/erica/uidevice-extension



3. KennyTM / networkpx — class-dump-z, StackOverflow.com , API

networkpx.blogspot.com

code.google.com/p/networkpx

github.com/kennytm

stackoverflow.com/users/224671/kennytm



github.com/kennytm/iphone-private-frameworks

(iOS 3).



本


«The iPhone Developer's CookBook» ( «The iOS 5 Developer's Cookbook: Core Concepts and Essential Recipes for iOS Programmers») — iOS, iOS.

:

translated.by/you/iphone-developers-cookbook-development-native-applications-for-the-iphone/into-ru/trans



All Articles