我正在尝试编写正则表达式来重写URL以指向代理服务器.
bodystring = Regex.Replace(bodystring, "(src='/+)", "$1" + proxyStr);
Run Code Online (Sandbox Code Playgroud)
这种表达的想法很简单,基本上找到"src ="/"或"SRC =" //"实例,并在该点插入一个代理URL.这通常有效但偶尔我会发现文字"$ 1"最终会出现在结果字符串中的情况.
这对我没有意义,因为如果没有匹配,那为什么它会取代任何东西呢?
不幸的是,我不能给出一个简单的例子,在它只有非常大的绳子,会发生,到目前为止,但我想从概念上知道什么可以让这样的事情发生.
顺便说一下,我尝试使用正面lookbehind重写此表达式,如下所示:
bodystring = Regex.Replace(bodystring, "(?<=src='/+)", proxyStr);
Run Code Online (Sandbox Code Playgroud)
但如果输入字符串包含"src ='//",则最终会在输出中使用proxyStr TWICE.这也没有多大意义,因为我认为"SRC ="必须是存在于输入为了得到proxyStr在两次输出最终的两倍.
我试图了解Mach-o文件是如何工作的,并且在可用的在线资源方面取得了很大进展(特别是Apple页面:http://developer.apple.com/library/mac/#documentation /developertools/conceptual/MachORuntime/Reference/reference.html),但我在理解符号存根如何工作方面遇到了障碍.
使用"otool -l"我看到以下部分:
Section
sectname __symbolstub1
segname __TEXT
addr 0x00005fc0
size 0x00000040
offset 20416
align 2^2 (4)
reloff 0
nreloc 0
flags 0x80000408
Run Code Online (Sandbox Code Playgroud)
但是,当我在十六进制编辑器中查看二进制文件中的数据时,我看到以下4个字节一次又一次地重复:
00005FC0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88
00005FD0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88
00005FE0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 …Run Code Online (Sandbox Code Playgroud) 我有一些逻辑可以通过创建Unix域套接字来工作,并且在普通应用程序中运行时没有任何问题.但是,当我为app扩展运行时,我从bind()获得了一个带有errno = 48("Address in in use")的-1.
NSArray *applicationSupportDirectoryPaths =
NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES);
int fd = socket(AF_UNIX, SOCK_STREAM, 0); // returns a non-zero value
NSString *loc = [applicationSupportDirectoryPaths[0] stringByAppendingPathComponent:@"usd"];
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX ;
strncpy(addr.sun_path, [loc UTF8String], sizeof(addr.sun_path)-1);
int bindres = bind(fd, (struct sockaddr*)&addr, sizeof(addr)); // returns -1, error is 48
Run Code Online (Sandbox Code Playgroud)
库目录返回的位置是:
/var/mobile/Containers/Data/PluginKitPlugin/A8110BA2-5AE7-42C1-84DA-2A9B303C7277/Library/
Run Code Online (Sandbox Code Playgroud)
我认为这是失败的原因是因为这是一个特殊的位置,与应用程序的库目录相比.
如果有人有任何想法为什么会发生这种情况或任何变通方法,我很感激.
更新:我尝试了缓存目录(NSCachesDirectory),但现在我得到了错误3(没有这样的过程).
每当我尝试将具有网络扩展(NEPacketTunnelProvider)的应用程序升级到新版本并且VPN处于"正在连接"或"已连接"状态时,升级将始终挂起,并在控制台日志中显示以下消息:
Oct 7 13:43:24 XXX-iPad SpringBoard(FrontBoard)[47] <Notice>: Error acquiring hold on plugins for com.example.apple-samplecode.SimpleTunnel.myapp2: Error Domain=PlugInKit Code=14 "plug-ins are busy" UserInfo={busyPlugInUUIDs=(
{
XPCExtensionBundleIdentifier = "com.example.apple-samplecode.SimpleTunnel.myapps.PacketTunnel.myapp2";
}
), NSLocalizedDescription=plug-ins are busy}
Run Code Online (Sandbox Code Playgroud)
即使我等了很长时间它也永远不会结束,有时显示大约55%完成,有时图标是黑色的.如果我点击图标并重新启动升级,有时它会工作,但我必须返回并再次设置VPN.有时我会看到一条错误消息,询问我是否要重试升级.
这对于客户来说将是一个严重的问题,因为它似乎每次都会发生,至少在iOS 10上.我无法找到任何合理的解决方法.
我已经向Apple写了一个错误,但他们所传达的内容是它与现有的Open问题(27872696)重复.他们尚未能提供任何解决方法.
在升级之前停止VPN确实允许升级无问题地工作,但这是一种非常糟糕的用户体验.
如果有人看到此问题或可以提供解决方法或其他信息,请告诉我.
顺便说一句,我已经用Apple最新的Simple Tunnel应用程序对其进行了重新编写,因此我的应用程序并没有做任何奇怪的事情.我可以通过使用XCode制作的IPA进行初始下载和Intunes升级来重现,但是当从应用程序商店升级时我也看到了这一点,这是最大的问题.
更新:此主题讨论Apple称其为已知问题的位置.如果此问题影响您,请考虑添加回复,因为该线程中有Apple人员.
我试图了解如何在ARM汇编语言中实现IOS Objective-C消息调用.查看IDA反汇编输出,我可以看到在调用__obj_msgsend之前将类和选择器引用推送到寄存器中.这很有道理,但奇怪的是这些值有一个奇怪的偏移.
selector ref = (selRef_arrayWithObject_ - 0x29B0)
class ref = (classRef_NSArray - 0x29BC)
Run Code Online (Sandbox Code Playgroud)
类ref中的0x29BC值似乎指向__obj_msgsend之后的指令,该指令具有某个逻辑,但0x29B0选择器ref指向随机MOVT指令.更糟糕的是,对于每个选择器调用,此偏移似乎是不同的.
有谁知道这些偏移来自哪里?为什么他们只是引用了指令+ 8的地址?
__text:00002998 E8 1F 01 E3 MOV R1, #(selRef_arrayWithObject_ - 0x29B0) ; selRef_arrayWithObject_
__text:0000299C 05 20 A0 E1 MOV R2, R5
__text:000029A0 00 10 40 E3 MOVT R1, #0
__text:000029A4 01 50 A0 E3 MOV R5, #1
__text:000029A8 01 10 9F E7 LDR R1, [PC,R1] ; selRef_arrayWithObject_ ; "arrayWithObject:"
__text:000029AC 74 00 02 E3 MOV R0, #(classRef_NSArray - 0x29BC) ; classRef_NSArray
__text:000029B0 00 00 …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建Apple发布的开源DYLD:
http://www.opensource.apple.com/source/dyld/dyld-97.1/
我复制了每个文件,并尝试构建XCode项目,但我被困在一个丢失的文件上.
i686-apple-darwin11-llvm-g ++ - 4.2:/usr/local/lib/system/libc.a:没有这样的文件或目录
我检查了XCode项目设置,这个标志是专门设置的,但我的文件系统上没有这样的文件.但是有一个libc.dylib.
从我看过的其他帖子看来,似乎Mac OS X通常不使用这个libc.a文件,但是这个项目引用了它.
有谁知道我在哪里可以得到这个文件或为什么使用它?
谢谢!
为了为我的程序构建安装程序,我添加了一个"安装程序"Xcode项目/目标,它将所有需要的二进制文件复制到一个临时位置,然后运行必要的逻辑来构建程序包.
我遇到的问题是我想直接映射这个安装程序项目依赖于其他一些项目,以便每次我尝试构建安装程序项目时都构建它们(如果需要).
我将所有目标添加到安装程序的构建目标列表(在架构中),并按如下顺序排列:
Project A
Project B
Project C
Installer (self)
Run Code Online (Sandbox Code Playgroud)
但是当我做一个干净的构建时,我看到一个构建顺序(在构建日志中),如下所示:
Project C
Installer
Project A
Project B
Run Code Online (Sandbox Code Playgroud)
我需要强制执行某个构建顺序,否则安装程序将无法使用这些文件.XCode允许您在UI中更改这些项目的顺序,但顺序似乎没有做任何事情.有没有办法强制依赖的构建顺序?
我需要延迟一段时间,但允许同一个runloop上的其他东西继续运行.我一直在使用以下代码来执行此操作:
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
Run Code Online (Sandbox Code Playgroud)
这似乎正是我想要的,除了有时函数立即返回而不等待所需的时间(1秒).
任何人都可以告诉我这可能导致什么?在允许运行循环运行的同时等待的正确方法是什么?
注意:我想以类似于sleep()的方式延迟,这样在延迟之后我回到与之前相同的执行流中.
我在iOS的XCode项目中包含了unordered_map.最初当我尝试链接时,我遇到了新操作和删除操作的错误,但当我将"-lstdc ++"添加到"其他链接器标志"时,这些消失了,但我留下了以下缺少的符号.
"std::__1::__next_prime(unsigned long)", referenced from:
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的C++标准语言/方言组合,但不能让它消失.
知道什么库包含这个吗?
谢谢!
我正在尝试通过从 TunnelProvider 的 XCode 模板开始,然后将代码添加到主机应用程序来配置并启动它来制作自定义 TunnelProvider 网络扩展。
我正在使用 NETunnelProviderManager 的实例来配置它,当我调用 saveToPreferencesWithCompletionHandler: 时,我获得成功(错误 = 0)。但是,当我在(非零)连接上调用 startVPNTunnelAndReturnError: 时,我总是收到以下错误:
错误域=NEVPNErrorDomain代码=1“(空)”
我已经阅读了所有相关的Apple文档,并尝试使我的程序看起来尽可能接近SimpleTunnel测试程序,但是我无法确定为什么我得到这个“1”(这似乎表明配置问题) 。
我在网上的帖子中看到其他一些人也遇到了同样的问题,但没有解决方案。
我有所需的特殊权利,我知道这不是问题,因为使用正确的配置文件后,我能够看到弹出窗口,确认我要在运行应用程序时添加 VPN,然后将其添加到 VPN 下的“设置”中。
这是我的代码,以防相关:
NETunnelProviderManager * man = [[NETunnelProviderManager alloc] init];
NETunnelProviderProtocol *protocol = [[NETunnelProviderProtocol alloc] init];
[protocol setServerAddress:@"aaa.bbb.ccc.ddd"]; // not actual value
[protocol setUsername:@"testuser"];
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
NSData *data = [[NSData alloc] init];
[dictionary setObject:@"UUID" forKey:(id)kSecAttrService];
[dictionary setObject:data forKey:(id)kSecValueData];
[dictionary setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(id)kSecAttrAccessible];
[dictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(id)kSecClass];
[dictionary setObject:(__bridge id)kCFBooleanTrue forKey:(id)kSecReturnPersistentRef];
CFTypeRef passwordRef = nil; …Run Code Online (Sandbox Code Playgroud)