为iOS应用程序创建远程终止开关

时间:2014-05-22 19:37:00

标签: ios

我希望能够远程阻止其他设备上安装的应用打开。 这背后的原因是我做远程自由职业工作,当我向客户发送演示应用程序时,我想知道如果他们停止通信或没有付费运行我可以禁用应用程序,以便他们不能再使用它了。

2 个答案:

答案 0 :(得分:2)

通过简单地对远程服务器进行API调用并验证应用程序,您可以做一些事情,但说实话,您可以采取其他更好的步骤,以避免陷入这些情况。首先,您应该避免在履行合同义务之前发送代码。您可以使用xcode存档分发应用程序。这将允许他们使用自己的证书进行签名,而无需使用实际代码。第二件事是你可以保留所有的对话记录,以便在法庭上使用(或使用paypal,因为他们在国外)。此外,不要害怕使用自由网站联系人。他们将允许您执行纠纷并与您合作。尝试解决代码中的问题会让您容易受到攻击,因为他们无论如何都可以更改代码。

答案 1 :(得分:0)

我将遵循@ J2theC的建议。如果有人对如何更恶意地做这件事感到好奇,我就让它在发布时运行

NSURL *url = [NSURL URLWithString:@"http://www.website.com/test.txt"];

NSString *string = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

if ([string isEqualToString:@"1"]) {
    exit(1);
}

有效。但这只是一点乐趣。就像我说的,我将使用@ J2TheC的方法。

= 修改 =

我已回到此代码并将其完成到可接受的水平。         看一下这个:

所以所有的检查都是异步地在AppDelegate中进行的。希望@Taum会同意这一点。

@interface AppDelegate ()
{
    int trialOK;
}
@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

[self trialCheck:@"http://yourwebsite.com/appID.txt" completionBlock:^(BOOL succeeded, NSString *string){
    if (succeeded) {

        if ([string isEqualToString:@""]) {
            NSLog(@"Trial test connected - all is ok!");
            trialOK = 1;
            [[NSUserDefaults standardUserDefaults] setInteger:trialOK forKey:@"TRIAL"];

        }else{

            NSLog(@"Text file found. It is telling me to quit. Remembering this until dev says otherwise.");

            // Will now show an alert with the contents of your .txt file before closing. Something like "Your trial has
            // expired. Please contact the dev to resume usability of this app. This app will now close" would be appropriate

            [self showAlert:string];
            trialOK = 2;
            [[NSUserDefaults standardUserDefaults] setInteger:trialOK forKey:@"TRIAL"]; //Saves to device that app is not allowed to open
        }
    }
    else{

        // If no connection to .txt file, app checks if it is already banned

        NSInteger trialInt = [[NSUserDefaults standardUserDefaults] integerForKey:@"TRIAL"];
        NSLog(@"failed online check. Trial int is: %d (0 = quit. 1 = ok)",trialInt);

        if (trialInt == 2) {
            [self showAlert:@"Your trial has expired. Disconnecting from the internet won't help. Please contact the dev to resume usability of this app. This app will now close"];
        }
    }
}];

return YES;
}

-(void)showAlert:(NSString *)alertString{

   UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"Trial Expired" message:alertString delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
   [alert show];
}

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
    exit(1);
}

- (void)trialCheck:(NSString *)urlString completionBlock:(void (^)(BOOL succeeded, NSString *string))completionBlock
{
    NSURL *url = [[NSURL alloc]initWithString:urlString];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                               if ( !error )
                               {
                                   NSString *tString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                   completionBlock(YES,tString);
                               } else{
                                   completionBlock(NO,nil);
                               }
                           }];
}

如您所见,此代码检查服务器上的.txt文件。只要该.txt文件完全为空,一切都会正常运行。 如果互联网连接不可用,那么您的应用程序将不会崩溃并仍然运行。

如果您在文本文件中添加任何内容,则下次启动应用时,它会显示一条警报,其中包含.txt文件的正文,然后在UIAlertView被解除后退出该应用。您已完成此操作的事实现已保存到设备中,因此它会记住您已禁止该应用程序打开。

如果用户随后断开互联网连接并且该应用无法连接到.txt文件,则会检查您之前是否已禁止该应用。如果这是真的,它将再次显示警告然后退出应用程序。

再次清空.txt文件后,它将再次重新启用该应用,恢复功能。

请务必在完成整个工作之前删除此代码,除非您希望保证可以在客户撤销付款时将其关闭,以试图扯掉您。

仅供参考 - 我现在使用网站进行自由职业,可以提出纠纷,但这是一个“只是在案件中”而不是赎金工具。