JavaScriptCoreで本当の問題を解決しましょう!
デモの url encodeURIComponent
@import JavaScriptCore;
NSString *scene = webUrl;
JSContext *context = [[JSContext alloc] init];
JSValue *encodeValue = [context evaluateScript:[NSString stringWithFormat:@"encodeURIComponent('%@');", scene]];
if (encodeValue.isString) {
scene = encodeValue.toString;
}
一般的にインターフェースはjson形式の文字列を返します。
しかし、--------はjsコードを返す特別なインターフェースを持っています。
json_parse({"code":200,"data":{"base64Str":"YmFzZTY0U3Ry"},"msg":"Request Success })
この場合、返すインターフェースを制御するパラメーターを追加できるかどうか、インターフェースと相談するのが一番です。
jsonを直接返すのがベスト インターフェイスを変更しない場合、問題を解決する方法は2つあります。
文字列のインターセプト
NSString *callback = @"json_parse";
NSString *json = [[res substringToIndex:res.length - 1] substringFromIndex:callback.length + 1];
この利便性はわかりやすく簡単で、比較的単純です。
次に、JavaScriptCoreを使用してjsコードを実行し、次のようにします。
インターフェイスが返すデータをシミュレートします。をエスケープする必要があることに注意してください。
NSString *res = @"json_parse({"code":200,"data":{"base64Str":"YmFzZTY0U3Ry"},"msg":"Request Success })";
JS実行環境の設定
JSContext *context = [[JSContext alloc] init];
例外捕捉メソッドの設定
context.exceptionHandler = ^(JSContext *context, JSValue *exception) {
NSLog(@"JS Error: %@", exception);
};
[context evaluateScript:@"function json_parse(jsonstring) {return JSON.stringify(jsonstring, null, 4);}"];
JSValue *value = [context evaluateScript:res];
同じ名前のjsメソッドをインジェクト_parse
if (value.isString) {
NSString *toStr = value.toString;
if (toStr) {
NSData *data = [toStr dataUsingEncoding:NSUTF8StringEncoding];
// json
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", dic);
}
}
要約
2つ目の方法は少し面倒ですが、アイデアを広げるのに役立ちます。