iPhone如何通过程序重新启动

10

我有一个代码

system("reboot") 

reboot 命令可以在终端中使用,但即使我以 root 用户身份运行应用程序,该操作仍然被拒绝。有人发现了有效的解决方法吗?或者能否简要解释一下 SBSetting 的重启方式,这让我很好奇?

reboot 命令可以在终端中使用,但是即使我以 root 用户身份运行应用程序,该操作仍然被拒绝。有人找到了可行的解决方法吗?或者能否简要解释一下 SBSetting 的重启方式,这让我很好奇?


我们在讨论越狱的iPhone开发吗?如果是的话,请通过标签指示。 - Deepak Danduprolu
5个回答

26

我终于找到了一种在不越狱iOS设备的情况下以编程方式重新启动iOS设备的方法!!! 用于重新启动iOS设备的命令行工具称为libimobiledevice:

http://krypted.com/mac-os-x/use-libimobiledevice-to-view-ios-logs/

这真是太棒了。在安装过程中,我遇到了一个问题,就是尝试安装以下行:

brew install -v --devel --fresh automake autoconf libtool wget libimobiledevice

然而,我通过运行以下代码解决了安装问题:
brew install -v --fresh automake autoconf libtool wget libimobiledevice

在那个问题之后,我按照剩下的指示操作,然后就完成了!大部分命令可以在这个页面找到:http://krypted.com/uncategorized/command-line-ios-device-management/。重启iOS设备的魔法命令是:
idevicediagnostics restart

这个工具真正令人惊奇的不仅是可以重新启动iOS设备,还可以使用以下命令将iOS设备日志输出到Mac的终端应用程序:
idevicesyslog

1
伙计,这救了我的命!不错。 - bnussey
请注意,如果您已经安装了appium,那么它会同时安装idevicediagnostics(尽管不一定是最新版本)。 - Ohad Schneider
“--fresh”已被移除,只需执行“brew install -v automake autoconf libtool wget libimobiledevice”即可。 - xxi

9
我找到了一种方法,虽然有点复杂。问题在于即使你将应用程序设置为以root身份运行,当你进行system()调用时,你显然仍然受限于用户mobile的权限。由于mobile无法成功调用重启, 这样做不起作用。
我绕过了这个问题的方法是利用一个新功能,该功能由SBSettings支持。SBSettings拥有一个特权守护进程,它允许您插入自己的命令,只需编写脚本(或其他可执行文件)并将其转储到适当的目录(/var/mobile/Library/SBSettings/Commands)。然后重新启动sbsettingsd进程,通过发布通知来运行您的脚本。如果您的脚本命名为
com.mycompany.reboot

然后在您的应用程序中,您可以执行以下代码:

#import <notify.h>

notify_post("com.mycompany.reboot");

然后,您可以将 com.mycompany.reboot 制作成一个简单的 shell 脚本,示例如下:
#!/bin/sh
reboot

请确保在您的com.mycompany.reboot脚本上执行chmod 755操作。完整的SBSettings命令功能详情可以在此处找到:http://thebigboss.org/guides/sbsettings-toggle-spec(请参见调用外部函数和脚本...)。无论如何,它确实需要您的应用程序依赖于SBSettings,但它是一个免费的应用程序,大多数用户可能都想要拥有它。目前,通过notify_post()以编程方式实现了重新启动(或任何其他需要root访问权限的操作)。

太好了!只要我将文件的权限设置为chmod 755,它就立即起作用了。但是我仍然很好奇,当您使用sudo“make package”制作一个调整时,如何让.deb在正确的目录中安装脚本,以便我不必手动安装。 - FreeAppl3
1
@FreeAppl3,你可以查看这个关于构建Debian软件包的链接。基本上,你只需要构建你的软件包,其中包含一个./var/mobile/Library/SBSettings/Commands/com.mycompany.reboot文件和目录结构。或者,你可以将com.mycompany.reboot脚本放置在你的应用程序根目录下(包括Info.plist、Default.png等文件),并使用DEBIAN/postinst脚本将/Applications/MyAppName.app/com.mycompany.reboot复制到/var/mobile/Library/SBSettings/Commands。两种方法都可以。 - Nate
如果在iPhone上未安装SBSettings,那么如何为用户应用程序以root权限运行命令? - moligaloo

4

对于一些人来说,这个答案可能有点取巧,但我没有找到更好的解决办法,可以重启未越狱的iOS设备,所以我在这里回答:

为了从命令行重新启动设备,我需要做一些准备工作:

  • 将设备连接到电脑上
  • 将iTunes快捷方式添加到您的Dock中
  • 选择聚光灯并搜索名为Automator的应用程序 [必须安装Xcode才能启动Automator!]
  • 启动Automator后,选择应用程序选项
  • 选择记录按钮以开始录制以下操作
  • 选择iTunes快捷方式
  • 从设备选项中选择您的设备
  • 选择恢复备份...按钮
  • 选择还原按钮
  • 选择Automator应用程序上的停止按钮停止录制。
  • 从Automator应用程序中,选择顶部栏中的文件,并将新记录的应用程序保存到您选择的位置

此时,您已经拥有一个可执行上述步骤的应用程序文件。我倾向于让iTunes保持打开状态,因为它始终会连接iOS设备并准备好被访问。当iTunes关闭并重新启动时,设备需要时间与iTunes完全连接,这往往会破坏Automator应用程序的流畅性。

此时,我可以进入终端,转到应用程序文件的位置,并运行以下命令[示例]:

open automator.app (将'automator.app'替换为您的文件名)

如果您和我一样,在jenkins中运行此命令,您需要运行以下命令:

  1. open [location]/[your_app_name.app]
  2. sleep 30

由于某种原因,Automator应用程序需要休眠时间才能完成所有记录的操作。

另外,我相信您也可以编写一个AppleScript来完成所有这些操作,但我不喜欢AppleScript,所以选择了简单的方式!


2
这是stackoverflow的伟大讽刺,一些最有价值的评论往往是最难得到赞同的,而那些人们可以轻松通过谷歌获得答案的问题却有着300个赞。 - Blaze
这确实会重新启动设备,但是最近iOS和iTunes的更新使得用户必须在设备上点击指令和设置屏幕。这使得真正的自动化变得困难。 - stepheaw

2

NSTask *task = [[NSTask alloc]init]; NSArray *arr = [[NSArray alloc]initWithObjects:@"reboot",nil]; [task setArguments:arr]; [task launch];这段代码正确吗?我已经root了应用,但是收到了“无法执行二进制文件”的消息。 - philions
将文件夹更改为/sbin/reboot。 - philions
@NoahWitherspoon,NSTask是可用的,但它是私有的。你只需要在项目中自己包含头文件(生成的或从其他地方复制的)。我知道OP当时没有指定这是为越狱手机而言的,但我留下我的评论是为了其他可能从NSTask中受益的人们。 - Nate
我尝试了NSTask的解决方案,但是我收到了“重启:操作不允许”的错误信息,我该如何修复呢?请帮忙。 - Dhekra Zaied

2

如果应用程序在其沙盒中运行,则不可能实现此操作。在越狱手机上,您可能能够执行重新启动shell命令。


然后你需要找到一种切换到用户根的方法,因为只有这样才允许执行重新启动 shell 命令。但这是另一个问题了。 - Cocoanetics
仅仅让越狱应用以root身份运行是不够的。即使是以root身份运行的应用程序,在控制台日志中也会出现以下错误:Mon Jun 27 21:19:01 iPhone-3G UIKitApplication:com.companyname.AppName [0xaf3d] [438] <Notice>:reboot:操作未允许。 - Nate
1
不行。iOS中没有“shutdown”命令。有/sbin/reboot,它可以从命令行执行你所期望的操作。但是,如果你在应用程序内部使用系统调用(即使以root身份运行),你会收到“操作不允许”的错误提示。 - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接