c++ - 如何在 iOS 应用程序中锁定代码执行

标签 c++ ios cocoa-touch locking nslock

问题描述

我有一个函数 StdString ShowLockScreen()在这个函数中我调用activateViewController在调用 activateViewController 后显示一些用户必须输入 PIN 的 UI 函数功能我想锁定所有进程,直到用户输入他的 PIN 并在打开的 UI 上按 OK 按钮。下面你可以看到我尝试的代码

iOS 中的源代码

StdString ShowLockScreen() 
{
    // Create a lock.
    NSLock* theLock = [[NSLock alloc] init];
    // Create a UI in which user must enter his PIN.
    PinLockController* controller = [[PinLockController alloc] initWithStyle:PinLockTypeSet];
    // Set delegate. 
    controller.delegate = m_Context;

    // !!! Here I show a UI and just after that I lock my lock in order code stop executing there.
    [controller activateViewController:nil];

    @synchronized(theLock) {
        [theLock lock];
    }

    NSLog(@"User in UI unlock the lock");
}

我希望我的代码停止,然后调用 [theLock lock];然后我会调用 [theLock unlock];从我的用户界面和代码将继续执行。但这对我不起作用。

Android 中的源代码

我已经在 Android 中编写了类似的应用程序,这里是代码。我想在 iOS 中写同样的东西,但我找不到解决方案

Intent intent = new Intent(mCtx, SoftPinActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

SharedObject lock = new SharedObject("");
int lockId = SharedObject.acquireLockId(lock);
Logger.i(TAG, "lockId = " + lockId);
intent.putExtra(SharedObject.LOCK_ID, lockId);
intent.putExtra(SoftPinActivity.UI_ID, style);

synchronized (lock) {
   mCtx.startActivity(intent);
   try {
          Logger.i(TAG, "lock.wait()...");
          lock.wait();
   } catch (InterruptedException e) {
          e.printStackTrace();
          Logger.i(TAG, "InterruptedException");
   }
}
Logger.i(TAG, "lock.wait()...done");
SharedObject.releaseLockId(lockId);

String pin = lock.object();

研究

我想我必须使用

NSCondition* condLock = [[NSCondition alloc] init];
[condLock wait];

[condLock signal];

但是如何在我的代码中使用它呢?

最佳答案

问题的答案

您可以使用 NSLock 锁定线程,但在您的情况下,这似乎不适用。原因是当从多个线程访问数据时,锁定主要用于提供线程安全。您要求的是域级锁定,它可以防止用户使用该应用程序,除非他们输入了 PIN。这两个概念共享“锁”这个词,但它们在实现上完全不同。如果您要使用 NSLock 及其相关对应项,您就是在将您的实现强制到单独的线程中,纯粹是为了阻止用户交互,并冒着使您的项目复杂化和调试痛苦的风险(死锁很多?)。

建议的解决方案

由于这个概念是域级别的锁定机制,我建议我们在实现时保持这种方式。如果您希望它类似于 Android,那么您需要创建自己的“SharedObject”概念,其他所有内容都会查询。如果此对象表示“用户尚未解锁应用程序”,则不会进行任何处理。这使您远离手动管理线程,并在您真正需要它们时释放线程(例如异步处理)。

要实现此对象,我们将其称为 UserContext,它可作为单例使用。如何实现此 sharedInstance can be seen here .

一旦你有了它,你就可以向它添加各种属性,这些属性在整个应用程序中都是全局的(并且根据名称的建议,具有属于特定用户的所有全局属性)。这些属性之一是用户是否锁定了应用程序:

[[UserContext sharedInstance] isLocked] // Returns BOOL

在整个应用程序中使用它,然后您可以(在领域概念级别)控制方法是否可以计算某些东西(自然地,您需要使 UserContext 线程安全,因为随时随地查询)。阅读代码的开发人员会清楚地知道,除非用户解锁应用程序,否则某个方法无法执行任何操作。停止

旁注

I want that my code stops then I call [theLock lock]; and after I will call [theLock unlock]; from my UI and code will continue executing.

在任何情况下都不要锁定 UI 线程。在已发布的应用程序中,看门狗会杀死您的应用程序,它实际上会崩溃。

关于c++ - 如何在 iOS 应用程序中锁定代码执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564118/

相关文章:

objective-c - 使用 SQLite3 将实时收到的许多值写入 iPhone 上的数据库

ios 11 - UIBarButtonItem 内的 UIButton 导致自动布局错误

ios - 如何在不跳过的情况下在特定 anchor 旋转图层?

c++ - 这种使用模板有什么问题?

c++ - 重载显式构造函数的不直观行为

ios - 快速从 UIImage 中找到独特的颜色?

ios - 调整 UIPickerView 中 UILabel 的大小以适合

objective-c - Objective C - 将字符串拆分为数组

c++ - 在 Windows 上创建和编译 C++ 项目

c++ - bool 和它的 not 值怎么可能都是 false 呢?