使用的是UIWebview
先看原生代码获取启动参数有没有问题
void -[JsApiHandler4GetStartupParams handler:context:callback:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4) {
r8 = arg4;
rcx = arg3;
var_-192 = [arg2 retain];
r15 = [rcx retain];
var_-200 = [r8 retain];
r14 = [[rcx currentSession] retain];
[r15 release];
rbx = [[r14 createParam] retain];
r15 = [[rbx expandParams] retain];
[rbx release];
[r14 release];
rbx = [[var_-192 objectForKeyedSubscript:@"key"] retain];
[rbx release];
if (rbx != 0x0) {
r12 = _objc_msgSend;
r14 = [[var_-192 objectForKeyedSubscript:@"key", rcx, r8] retain];
rdx = [NSArray class];
if ([r14 isKindOfClass:rdx, rcx, r8] != 0x0) {
rdx = @"key";
rbx = [(r12)(var_-192, @selector(objectForKeyedSubscript:), rdx) retain];
rax = (r12)(rbx, @selector(count), rdx);
var_-208 = r15;
[rbx release];
[r14 release];
r15 = var_-208;
if (rax != 0x0) {
var_-216 = [(r12)(@class(NSMutableDictionary), @selector(dictionary), @"key") retain];
*(int128_t *)(&var_-320 + 0x30) = intrinsic_movaps(*(int128_t *)(&var_-320 + 0x30), 0x0);
*(int128_t *)(&var_-320 + 0x20) = intrinsic_movaps(*(int128_t *)(&var_-320 + 0x20), 0x0);
*(int128_t *)(&var_-320 + 0x10) = intrinsic_movaps(*(int128_t *)(&var_-320 + 0x10), 0x0);
var_-320 = intrinsic_movaps(var_-320, 0x0);
r15 = [(r12)(var_-192, @selector(objectForKeyedSubscript:), @"key") retain];
rcx = &var_-176;
rdx = &var_-320;
rax = (r12)(r15, @selector(countByEnumeratingWithState:objects:count:), rdx, rcx, 0x10);
var_-224 = rax;
r14 = r12;
if (rax != 0x0) {
var_-248 = **(&var_-320 + 0x10);
var_-232 = r15;
do {
r12 = 0x0;
do {
if (*var_-304 != var_-248) {
objc_enumerationMutation(r15);
}
r13 = *(var_-312 + r12 * 0x8);
if ((((r14)(r13, @selector(isEqualToString:), @"safePayContext") == 0x0) && ((r14)(r13, @selector(isEqualToString:), @"reportUrl") == 0x0)) && ((r14)(r13, @selector(isEqualToString:), @"feedBackExtParams") == 0x0)) {
r15 = r14;
r14 = [(r14)(var_-208, @selector(objectForKeyedSubscript:), r13) retain];
(r15)(var_-216, @selector(setValue:forKey:), r14, r13);
rdi = r14;
r14 = r15;
r15 = var_-232;
[rdi release];
}
r12 = r12 + 0x1;
} while (r12 < var_-224);
rdx = &var_-320;
rcx = &var_-176;
rax = (r14)(r15, @selector(countByEnumeratingWithState:objects:count:), rdx, rcx, 0x10);
var_-224 = rax;
} while (rax != 0x0);
}
[r15 release];
r12 = var_-200;
rsi = var_-216;
(*(r12 + 0x10))(r12, rsi);
[var_-216 release];
r15 = var_-208;
}
else {
rsi = 0x2;
r12 = var_-200;
_ErrorCallback(r12, rsi);
}
}
else {
[r14 release];
rsi = 0x2;
r12 = var_-200;
_ErrorCallback(r12, rsi);
}
}
else {
if (r15 != 0x0) {
r12 = r15;
r15 = [r15 mutableCopy];
rbx = _objc_msgSend;
}
else {
r8 = 0x0;
rbx = _objc_msgSend;
r14 = [[NSDictionary dictionaryWithObjects:&var_-184 forKeys:&var_-184 count:r8] retain];
r12 = r15;
r15 = [r14 mutableCopy];
[r14 release];
}
(rbx)(r15, @selector(setObject:forKeyedSubscript:), 0x0, @"safePayContext", r8);
(rbx)(r15, @selector(setObject:forKeyedSubscript:), 0x0, @"reportUrl", r8);
rcx = @"feedBackExtParams";
rdx = 0x0;
(rbx)(r15, @selector(setObject:forKeyedSubscript:), rdx, rcx, r8);
rbx = (rbx)(r15, @selector(copy), rdx, rcx, r8);
[r12 release];
r12 = var_-200;
rsi = rbx;
(*(r12 + 0x10))(r12, rsi);
[r15 release];
r15 = rbx;
}
[r15 release];
[r12 release];
[var_-192 release];
if (*___stack_chk_guard != *___stack_chk_guard) {
__stack_chk_fail();
}
return;
}
根据这个还原一下能运行的代码(非全流程,只看本次走到的分支)
.h
@interface JsApiHandler4GetStartupParams :NSObject
@end
//获取启动参数
NS_ASSUME_NONNULL_BEGIN
@interface JsApiHandler4GetStartupParams (YYY)
@end
NS_ASSUME_NONNULL_END
.m
#import "JsApiHandler4GetStartupParams+YYY.h"
#import <objc/runtime.h>
@implementation JsApiHandler4GetStartupParams (YYY)
+ (void)load{
Method originalMethod = class_getInstanceMethod([self class], @selector(handler:context:callback:));
Method swizzledMethod = class_getInstanceMethod([self class], @selector(handler:context:callbackS:));
method_exchangeImplementations(originalMethod, swizzledMethod);
}
- (void)handler:(NSDictionary *)arg2 context:(PSDContext *)arg3 callbackS:(PSDJsApiResponseCallbackBlock)arg4;{
id r14 = [arg3 currentSession];
PSDSessionParam *rbx = [r14 createParam];
NSDictionary *r15 = [rbx expandParams];
NSString* rbx2 = [arg2 objectForKeyedSubscript:@"key"];
if(rbx2 != 0x0){
NSArray *r14 = [arg2 objectForKeyedSubscript:@"key"];
if ([r14 isKindOfClass:[NSArray class]] != 0x0) {
if (r14.count != 0) {
//略
}
}
}else{
if (r15 != 0x0) {
r15 = [r15 mutableCopy];
}
else {
// r8 = 0x0;
// rbx = _objc_msgSend;
// r14 = [[NSDictionary dictionaryWithObjects:&var_-184 forKeys:&var_-184 count:r8] retain];
// r12 = r15;
// r15 = [r14 mutableCopy];
// [r14 release];
}
[r15 setValue:nil forKey:@"safePayContext"];
[r15 setValue:nil forKey:@"reportUrl"];
[r15 setValue:nil forKey:@"feedBackExtParams"];
arg4(r15);
}
// [self handler:arg2 context:arg3 callbackS:arg4];
}
@end
可是发现正常情况下不走这个方法。
这个思路暂时放一放。
这个启动参数,是跳页带的参数吗?
答案应该是:跳本离线包其他页面不使用这个作为跳页传参,跳其他离线包需要