2

ロゴを使用して MobileSubstrate の微調整を作成しています。また、デバイス上のすべてのアプリケーションにデバイスをロックする新しいメソッドを追加しようとしています。これは、近接変更通知の後に実行されます。これまでのところ、私のコードは

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <SpringBoard/SpringBoard.h>
#import <SpringBoard/UIApplicationDelegate.h>
#import <GraphicsServices/GSEvent.h>
#include <notify.h>

@interface suspendresume : NSObject 

@property(nonatomic, readonly) BOOL proximityState;

@end

@implementation suspendresume

BOOL tweakOn;

@end

static NSString *settingsFile = @"/var/mobile/Library/Preferences/com.matchstick.suspendresume.plist";

%hook SpringBoard

-(void)applicationDidFinishLaunching:(id)application {
    // Allow SpringBoard to initialise
    %orig;

    // Set up proximity monitoring
    [[UIDevice currentDevice] setProximityMonitoringEnabled:YES];
    [[UIDevice currentDevice] proximityState];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityChange:) name:@"UIDeviceProximityStateDidChangeNotification" object:nil];
}

%new

// Add new code into SpringBoard
-(void)proximityChange:(NSNotification*)notification {
    [[UIDevice currentDevice] setProximityMonitoringEnabled:YES];

    // Check if tweak is on
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:settingsFile];
    tweakOn = [[dict objectForKey:@"enabled"] boolValue];

    // Only run if tweak is on
    if (tweakOn) {

        // Get first proximity value
        if ([[UIDevice currentDevice] proximityState] == YES) {

            // Wait a few seconds TODO allow changing of wait interval from prefrences FIXME causes a lockup of interface whilst sleeping
            [self performSelector:@selector(lockDeviceAfterDelay) withObject:nil afterDelay:1.0];
        }
    }
}

%new

-(void)lockDeviceAfterDelay {

    // Second proximity value
    if ([[UIDevice currentDevice] proximityState] == YES) {

        // Lock device
        GSEventLockDevice();
    }
}

%end

これは SpringBoard では必要に応じて機能しますが、デバイスにインストールされている他のアプリケーションでは機能しません。テスト時に発生するのは、近接センサーがトリガーされたときにディスプレイがオフになり、デバイスがロックされないことだけです。

UIApplicationDelegate を利用して、SpringBoard と同じようにアプリケーションで実現することを考え -(void)applicationDidFinishLaunching:(id)applicationUIApplicationいますが、これを行う方法がわかりません。

このアプローチのアイデアは、このプロジェクトから生まれました

SpringBoard で実行しているのと同じコードを の下の新しいメソッドに追加する必要がありUIApplicationますか?

アプリケーションごとに近接監視を再設定する必要がありますか? また、近接変更通知を受信した後にこれらの新しいメソッドを呼び出して実行するにはどうすればよいですか?

また、これの完全なソースは私のGitHubにあります

4

1 に答える 1

2

これはこれを行う正しい方法ではなかったことがわかりました。その代わり、

// Get the topmost application
SBApplication *runningApp = [(SpringBoard *)self _accessibilityFrontMostApplication];
// We're in application, resign app
[runningApp notifyResignActiveForReason:1];

トリックをしました。

于 2013-03-29T20:56:22.460 に答える