ইউআইউইউভিউ ভিউ দিয়ে আইফোন / আইপ্যাড অ্যাপ্লিকেশন লেখার সময়, কনসোলটি দৃশ্যমান নয়। এই দুর্দান্ত উত্তরটি দেখায় যে কীভাবে ত্রুটিগুলি ফাঁদ করা যায় তবে আমি কনসোল.লগ () পাশাপাশি ব্যবহার করতে চাই।
ইউআইউইউভিউ ভিউ দিয়ে আইফোন / আইপ্যাড অ্যাপ্লিকেশন লেখার সময়, কনসোলটি দৃশ্যমান নয়। এই দুর্দান্ত উত্তরটি দেখায় যে কীভাবে ত্রুটিগুলি ফাঁদ করা যায় তবে আমি কনসোল.লগ () পাশাপাশি ব্যবহার করতে চাই।
উত্তর:
একজন সম্মানিত সহকর্মীর সাথে পরামর্শের পরে আজ তিনি আমাকে সাফারি বিকাশকারী সরঞ্জামদণ্ডে সতর্ক করেছিলেন এবং এটি কীভাবে কনসোল আউটপুট (এবং ডিবাগিং!) এর জন্য আইওএস সিমুলেটারে ইউআইউইউবভিউসের সাথে সংযুক্ত হতে পারে।
পদক্ষেপ:
[the name of your UIWebView file]
আপনি এখন জটিল (আমার ক্ষেত্রে, ফ্লোট ) জাভাস্ক্রিপ্ট এবং অন্যান্য স্টাফগুলিকে ইউআইউইউভিউভিউতে ফেলে দিতে পারেন এবং ইচ্ছামত ডিবাগ করতে পারেন।
সম্পাদনা: @ জোশুয়া জে ম্যাককিনন উল্লেখ করেছেন যে কোনও ডিভাইসে ইউআইওউবভিউগুলি ডিবাগ করার সময় এই কৌশলটিও কার্যকর হয়। কেবলমাত্র আপনার ডিভাইস সেটিংসে ওয়েব পরিদর্শককে সক্ষম করুন: সেটিংস-> সাফারি-> অ্যাডভান্সড-> ওয়েব ইন্সপেক্টর (চিয়ার্স @ জেরেমি উইবে)
আপডেট: ডাব্লুউইউব ভিউও সমর্থিত
অ্যাপ্লিকেশন ডিবাগ কনসোলটিতে জাভাস্ক্রিপ্ট ব্যবহার করে লগ করার আমার একটি সমাধান রয়েছে। এটি কিছুটা অশোধিত, তবে এটি কার্যকর।
প্রথমত, আমরা জাভাস্ক্রিপ্টে কনসোল.লগ () ফাংশনটি সংজ্ঞায়িত করি, যা আইওস-লগ: ইউআরএল সহ একটি আইফ্রেমে খোলে এবং তত্ক্ষণাত সরিয়ে দেয়।
// Debug
console = new Object();
console.log = function(log) {
var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", "ios-log:#iOS#" + log);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
};
console.debug = console.log;
console.info = console.log;
console.warn = console.log;
console.error = console.log;
এখন আমাদের এই ইউআরএলটি আইওএস অ্যাপ্লিকেশন UIWebViewDelegate- এ shouldstartLoadWithRequest ফাংশনটি ব্যবহার করতে হবে।
- (BOOL)webView:(UIWebView *)webView2
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestString = [[[request URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
//NSLog(requestString);
if ([requestString hasPrefix:@"ios-log:"]) {
NSString* logString = [[requestString componentsSeparatedByString:@":#iOS#"] objectAtIndex:1];
NSLog(@"UIWebView console: %@", logString);
return NO;
}
return YES;
}
এই সুইফট সমাধানটি: (প্রসঙ্গটি পেতে এটি হ্যাকের কিছুটা)
আপনি ইউআইবিউবভিউ তৈরি করেন।
অভ্যন্তরীণ প্রসঙ্গটি পান এবং কনসোল.লগ () জাভাস্ক্রিপ্ট ফাংশন ওভাররাইড করুন ।
self.webView = UIWebView()
self.webView.delegate = self
let context = self.webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as! JSContext
let logFunction : @convention(block) (String) -> Void =
{
(msg: String) in
NSLog("Console: %@", msg)
}
context.objectForKeyedSubscript("console").setObject(unsafeBitCast(logFunction, AnyObject.self),
forKeyedSubscript: "log")
JavaScriptCore
আপনার প্রকল্পের ফ্রেমওয়ার্ক এবং import
এটি আপনার ওয়েবভিউ সুইচ ফাইলটিতে লিঙ্ক করতে ভুলবেন না ।
IOS7 থেকে শুরু করে আপনি নেটিভ জাভাস্ক্রিপ্ট ব্রিজ ব্যবহার করতে পারেন। নিম্নলিখিত হিসাবে সহজ কিছু
#import <JavaScriptCore/JavaScriptCore.h>
JSContext *ctx = [webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ctx[@"console"][@"log"] = ^(JSValue * msg) {
NSLog(@"JavaScript %@ log message: %@", [JSContext currentContext], msg);
};
UIWebview
কোনও JSContext
স্টাফ সেটআপ করতে পারবেন ।
JSContext
এখনও সঙ্গে আইওএস কাজ 8+ WKWebView
?
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
এবং এটি পুরোপুরি কাজ করে!
ইউটিউইভভিউ থেকে উদ্দেশ্য-সি তে যোগাযোগের জন্য নেটিভব্রিজ খুব সহায়ক। আপনি এটি কনসোল লগগুলি পাস করতে এবং উদ্দেশ্য-সি ফাংশনগুলিতে কল করতে পারেন।
https://github.com/ochameau/NativeBridge
console = new Object();
console.log = function(log) {
NativeBridge.call("logToConsole", [log]);
};
console.debug = console.log;
console.info = console.log;
console.warn = console.log;
console.error = console.log;
window.onerror = function(error, url, line) {
console.log('ERROR: '+error+' URL:'+url+' L:'+line);
};
এই কৌশলটির সুবিধা হ'ল লগ বার্তায় নতুন লাইনের মতো জিনিসগুলি সংরক্ষণ করা হয়।
console.log
তবে window.onerror
এই উত্তরের কাজটি খুব কার্যকর!
লেসলি গডউইনের ফিক্স চেষ্টা করেও এই ত্রুটিটি পেয়ে যাচ্ছিল:
'objectForKeyedSubscript' is unavailable: use subscripting
সুইফট ২.২-এর জন্য, এখানে আমার জন্য কী কাজ করেছে:
এই কোডটি সংকলনের জন্য আপনাকে জাভাস্ক্রিপ্ট কোর আমদানি করতে হবে:
import JavaScriptCore
if let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") {
context.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
let consoleLog: @convention(block) String -> Void = { message in
print("javascript_log: " + message)
}
context.setObject(unsafeBitCast(consoleLog, AnyObject.self), forKeyedSubscript: "_consoleLog")
}
তারপরে আপনার জাভাস্ক্রিপ্ট কোডে, কনসোল.লগকে কল করা ("_ আপনার_লগ_") এক্সকোড কনসোলে মুদ্রণ করবে।
আরও ভাল, এই কোডটি ইউআইবিউবভিউতে এক্সটেনশন হিসাবে যুক্ত করুন:
import JavaScriptCore
extension UIWebView {
public func hijackConsoleLog() {
if let context = valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") {
context.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
let consoleLog: @convention(block) String -> Void = { message in
print("javascript_log: " + message)
}
context.setObject(unsafeBitCast(consoleLog, AnyObject.self), forKeyedSubscript: "_consoleLog")
}
}
}
এবং তারপরে আপনার ইউআইবিউবিভিউ সূচনা পর্বের সময় এই পদ্ধতিটি কল করুন:
let webView = UIWebView(frame: CGRectZero)
webView.hijackConsoleLog()