يوضح HTML البسيط التالي المشكلة:
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular-route.js"></script>
<script>
angular.module('fail', ['ngRoute'])
.config(function($routeProvider) {
$routeProvider
.when('/a', {
template: '<a ng-href="#/b">a</a>'
})
.when('/b', {
template: '<a ng-href="#/a">b</a>'
})
.otherwise({
redirectTo: '/a'
});
});
</script>
</head>
<body ng-app="fail">
<div ng-view></div>
</body>
</html>
يعمل هذا كما هو متوقع على معظم الأجهزة ، ولكنه يطرح استثناءً لانهائيًا لمضمون البيانات على نظام التشغيل iOS 9.
أنا قادر على إعادة الإنتاج على كل من iPad Air 2 و iPad من الجيل الرابع مع iOS 9 beta 2.
أدرك أنها ربما تكون مشكلة في نظام التشغيل iOS ، ولكن قد لا يزال الأمر يستحق التحقيق.
لقد واجهت مشكلة مماثلة ، والتي حدثت على ios 9 ، لكنها تعمل بشكل جيد على الأجهزة الأخرى.
لقد أعدت إنتاج هذه المشكلة بنفس الكود الذي قدمته santaslow على 1.4.1 / ios 9:
<!DOCTYPE html>
<html>
<head>
<script src="../static/js/angular/angular.1.4.1.js"></script>
<script src="../static/js/angular-route/angular-route.1.4.1.js"></script>
<script>
angular.module('fail', ['ngRoute'])
.config(function ($routeProvider) {
$routeProvider
.when('/a', {
template: '<a ng-href="#/b">a</a>'
})
.when('/b', {
template: '<a ng-href="#/a">b</a>'
})
.otherwise({
redirectTo: '/a'
});
}).factory('$exceptionHandler', ['$log', function($log) {
return function(exception, cause) {
var message = 'angularjs exception: '+exception.message+': caused by "' + cause+ '\njs stack:\n'+exception.stack;
$log.error(message);
};
}]);
</script>
</head>
<body ng-app="fail">
<div ng-view></div>
</body>
</html>
يعمل الكود أعلاه بشكل طبيعي على مستعرض سطح المكتب و android و ios 8 webview ، ولكن على ios 9 سوف يطرح استثناء عندما أنقر على الرابط:
2015-07-02 11:00:09 ... angularjs exception: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.4.1/$rootScope/infdig?p0=10&p1=%5B%5D: caused by "undefined
js stack:
file:///.../static/js/angular/angular.js:68:32
$digest<strong i="10">@file</strong>:///.../static/js/angular/angular.js:15705:35
$apply<strong i="11">@file</strong>:///.../static/js/angular/angular.js:15935:31
file:///.../static/js/angular/angular.js:12070:30
eventHandler<strong i="12">@file</strong>:///.../static/js/angular/angular.js:3264:25
لم يعد بإمكاني التكاثر في iOS 9 Beta 3.
أتلقى نفس الخطأ مع ios9 public beta (13A4293g)
لقد تحققت من الكود أعلاه على ios 9 beta 3 (13A4293g) ، ولم يعد هناك استثناء. لكن التطبيق الذي يستخدم ng-view لا يزال يطرح استثناءات infdig على iOS 9 beta 3.
أتلقى نفس الخطأ مع ios9 public beta (13A4293g)
خطأ: تم بلوغ عدد مرات التكرار [$
أطلق المراقبون في آخر 5 تكرارات: []
http://errors.angularjs.org/1.3.13/ $ rootScope / infdig؟ p0 = 10 & p1 =٪ 5B٪ 5D
ملف: ///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A0-4C99-807B-EAB24. /lib/ionic/js/ionic.bundle.js:8762:32
$ Digest
$ application
ملف: ///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A0-4C99-807B-EAB24. /lib/ionic/js/ionic.bundle.js:54879:24
eventHandler @ file : ///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A0-4C99-80724.app /www/lib/ionic/js/ionic.bundle.js:11713:25
dispatchEvent @ [الرمز الأصلي]
TriggerMouseEvent @ file : ///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A79-4C99B2458h /www/lib/ionic/js/ionic.bundle.js:2863:20
tapClick @ file : ///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A0-4C99-807BE-58EA /www/lib/ionic/js/ionic.bundle.js:2852:20
tapTouchEnd @ file : ///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A0-4C99-247B58 /www/lib/ionic/js/ionic.bundle.js:2975:13
نتلقى هذا الخطأ أيضًا في الإصدار التجريبي 3 العام من iOS 9 من خلال تطبيق Angular الخاص بنا. لا يحدث في نظام التشغيل iOS 8.
كحل بديل ، كتبت توجيهًا بسيطًا لاستبدال ng-view و angular-route.js. لقد نجح الحل في تطبيقنا الخاص ، واختفت جميع استثناءات infdig في نظام التشغيل ios 9 beta / beta 3. يوجد أدناه الكود المبسط ، وهو مخصص فقط لتطبيقنا ، ولا يتم النظر في حالات الاستخدام العامة. لا أوصي الآخرين باستخدام هذا:
(function (window) {
'use strict';
var myApp = angular.module("myApp");
var $route = {};
// replace $routeProvider.when with the function below:
window.routeWhen = function(path, route) {
$route[path] = route;
};
myApp.directive("myView", ['$compile', '$controller', '$http', '$rootScope', function ($compile, $controller, $http, $rootScope) {
return {
priority: -400,
link: function (scope, element) {
var parentScope = scope;
scope = null;
window.updateView = function (path) {
location.hash = '#'+url;
if (scope) scope.$destroy();
scope = parentScope.$new();
var route = $route[path];
var linkView = function(html) {
element.html(html);
var link = $compile(element.contents());
var controller = $controller(route.controller, {$scope: scope});
element.data('$ngControllerController', controller);
element.children().data('$ngControllerController', controller);
link(scope);
scope.$emit('$viewContentLoaded');
if (!$rootScope.$$phase && !scope.$$phase) scope.$apply();
};
if (route.templateCache) linkView(route.templateCache)
else if (route.template) {
route.templateCache = document.getElementById(route.template).innerHTML;
linkView(route.templateCache)
}
else $http.get(route.templateUrl;).success(function(html) {
route.templateCache = html;
linkView(html);
});
};
//updateView(initialPath);
// call updateView(path) to set location at other places of the app
}
};
}]);
})(window)
فقط قم بتثبيت iOS 9 Beta 4 وما زلت تواجه نفس المشكلة. اي شخص اخر؟
لقد رأيته في iOS 9 Beta 3 وما زلت أراه في iOS 9 Beta 4.
+1
نعم ، نشهد نفس المشكلة أيضًا حتى مع جهاز توجيه واجهة المستخدم الزاوي. هل لدى أي شخص عمل صالح حول هذه المشكلة في الوقت الحالي؟
رؤية نفس المشكلة في uiWebView على أحدث إصدار من iOS9.
هل لدى أي شخص أي تحديثات حول هذه المسألة؟
وما زالت هذه المسألة. إعادة الفتح
يبدو أنه مشكلة iOS. هل هذا تعقب على webkit في مكان ما؟
+1
+1
كذلك هنا. يعمل تطبيق كوردوفا بشكل جيد إذا كان يعمل كويب على iPad Safari ، ولكن الخلاصة اللانهائية تحدث إذا تم تشغيله كتطبيق كوردوفا (UIWebView)
بالضبط نفس المشكلات مثل borrull ! جربت بالفعل WKWebView ومن ثم فإن المشكلة غير موجودة. لكن لا يمكننا استخدام WKWebView لأننا نحتاج إلى خدمة الملفات المحلية (ولا نريد تشغيل خادم محلي في تطبيقنا) وملفات تعريف الارتباط. لذلك يجب أن تفعل شيئًا مع UIWebView بالاشتراك مع Cordova / Mobile Safari على نظام التشغيل iOS 9. أقوم حاليًا بتصحيح أخطاء $ locationWatch في Angular لأنني أرى أن تطبيقنا يريد الانتقال إلى موقع مختلف عدة مرات ثم (بعد 10 مرات ) تم طرح خطأ الملخص.
نفس المشكلة هنا على iOS9 béta4
حلقة هضم $ لانهائية زاويّة ؛ (
+1 ، فقط في UIWebView ، وليس في WKWebView ولكن يمكننا فقط استخدام UIWebView في تطبيق كوردوفا.
+1
إذا كانت هذه مشكلة خاصة بنظام iOS ، فالرجاء فتح مشكلة في أداة تعقب مشكلات webkit وتقديم عرض توضيحي! لن يغير زر 1+ هنا أي شيء على الأرجح ، لأنه يبدو حقًا خطأً في المتصفح.
هل أبلغ أحدهم شركة Apple عن هذا الخطأ للتحقيق فيه؟
لقد أبلغت شركة آبل عن هذا الخطأ. ولكن ربما يجب عليك جميعًا أن تفعل الشيء نفسه لجذب انتباههم إلى الخطأ.
هل يمكنك أن تعطينا رابطًا حتى نتمكن من إجراء 1+؟
إنه موجود في حسابنا الشخصي على Apple عبر مراسل الخطأ .. لذا لا يوجد رابط عام ؛ (
هل يمكنك نشره على openradar ومشاركة معرف rdar حتى نتمكن من خداعه!
نفس الشيء على iOS9 béta 5:
يعمل على الجوال سفاري
يعمل على WKWebview الذي لا يمكننا استخدامه لأنه لا يمكنه خدمة الملفات المحلية ولا يدعم NSProtocol
لا يعمل على UIWebView
نفس الشيء هنا على IOS 9 Beta 5
لقد قدمت خطأ مع Apple أيضًا. رابط Open Radar هو: https://openradar.appspot.com/22186109 (من المفترض أن يساعد ذلك الأشخاص الكسالى على الإبلاغ عن خطأ). يرجى ترك تعليقات إذا كان بإمكانك تحسين صياغة / شرح الخطأ ؛-) يمكنك تنزيل مشروع Xcode لإرفاقه مع ملف الخطأ على بطاقة Open Radar (بفضل santaslow لـ JS في OP)
لقد قمت بإنشاء نسخة من نفس مشروع Xcode (منborrull) ولكن باستخدام ui-router بدلاً من ng-route. بالضبط نفس المشكلة. للأشخاص المهتمين ، يمكنك العثور على المشروع هنا: http://s000.tinyupload.com/index.php؟file_id=87281871603760127355
نحن نرى أيضًا هذه المشكلة. لقد تمكنت من مطاردة المشكلة لكون هذا الموقع. * لا يتم تحديث الخصائص على الفور عندما تكون الزاوية في المزيج. إذا حاولت تعيين قيمة إلى location.hash (مثل ما يتم إجراؤه خلف خدمة الموقع) ، فقم بقراءتها على الفور مرة أخرى ، فلن تتغير القيمة. يبدو أن هناك بعض الآثار الجانبية التي تحدث نتيجة لمعالجات jqlite المرتبطة بأحداث popstate و hashchanged.
سأحاول وتحميل عينة عندما أكون على جهاز كمبيوتر.
+1
CleverCoder أي تحديثات على العينة؟
سيتعين علي إنهاء حالة repro في الصباح ، لأن الرمز كما كنت مقيّدًا طوال عطلة نهاية الأسبوع. شكرا على التنبيه! نظرًا لأن نظام التشغيل iOS 9 يعد تنازليًا ، فلدينا مصلحة في رؤية هذا الحل قد تم حله. سأقوم بتحميل شيء بأسرع ما يمكن.
+1
لقد أعدت إنتاج ما أعتقد أنه السبب الجذري ، حيث لا يتم "تطبيق" تعيين خصائص تجزئة الموقع أو خصائص href على الفور.
إليك رابط لمشروع XCode:
https://www.dropbox.com/s/2jkwv2thhm86nly/iOS٪209٪20Location٪20Bug.zip؟dl=0
يُرجى إعلامي إذا لم تتمكن من الوصول إلى الملف.
لاحظ القيمة الناتجة في location.hash ، بالإضافة إلى إرفاق Safari بالتصحيح. يبدو أن هناك شيئًا ما يؤجل التغيير نتيجة بعض السباكة في الأحداث بناءً على أحداث "popstate" و "hashchange".
آمل أن يكون هذا مفيدا.
نحن نستخدم window.location.href بدلاً من استخدام state.go ويبدو أنه يعمل حاليًا. عربات التي تجرها الدواب أقل.
ستكون قيمة location.hash صحيحة بعد دوران حلقة التشغيل. يمكن لـ Angular حل هذه المشكلة بسهولة عن طريق تأخير location.hash إلى setTimeout (... ، 0). أعتقد أن هذا سيكون حوالي 2 تغيير على angular.js / src / ng / location.js.
hober حاول المهلة بزاوية كالتالي:
// update $location when $browser url changes
$browser.onUrlChange(function(newUrl, newState) {
$rootScope.$evalAsync(function() {
var oldUrl = $location.absUrl();
var oldState = $location.$$state;
var defaultPrevented;
$location.$$parse(newUrl);
$location.$$state = newState;
defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
newState, oldState).defaultPrevented;
// if the location was changed by a `$locationChangeStart` handler then stop
// processing this location change
if ($location.absUrl() !== newUrl) return;
if (defaultPrevented) {
$location.$$parse(oldUrl);
$location.$$state = oldState;
setTimeout(function(){ setBrowserUrlWithFallback(oldUrl, false, oldState) }, 0);
} else {
initializing = false;
afterLocationChange(oldUrl, oldState);
}
});
if (!$rootScope.$$phase) $rootScope.$digest();
});
و
// update browser
$rootScope.$watch(function $locationWatch() {
var oldUrl = trimEmptyHash($browser.url());
var newUrl = trimEmptyHash($location.absUrl());
var oldState = $browser.state();
var currentReplace = $location.$$replace;
var urlOrStateChanged = oldUrl !== newUrl ||
($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
if (initializing || urlOrStateChanged) {
initializing = false;
$rootScope.$evalAsync(function() {
var newUrl = $location.absUrl();
var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
$location.$$state, oldState).defaultPrevented;
// if the location was changed by a `$locationChangeStart` handler then stop
// processing this location change
if ($location.absUrl() !== newUrl) return;
if (defaultPrevented) {
$location.$$parse(oldUrl);
$location.$$state = oldState;
} else {
if (urlOrStateChanged) {
setTimeout(function(){ setBrowserUrlWithFallback(newUrl, currentReplace,
oldState === $location.$$state ? null : $location.$$state) }, 0);
}
afterLocationChange(oldUrl, oldState);
}
});
}
$location.$$replace = false;
// we don't need to return anything because $evalAsync will make the digest loop dirty when
// there is a change
});
لذلك أضفت setTimout حول طريقة setBrowserUrlWithFallback لكنها لم تحل المشكلة.
إليك حالة اختبار مخفضة لا تعتمد على Angular ، وهذا يوضح الحل البديل. كيفية تنفيذ الحل في Angular غير واضح بالنسبة لي. https://gist.github.com/hober/a29b6c28ac1744c800dd
حصلت على مزيد من المعلومات حول هذا الأمر. لقد أجريت تغييرًا في Angular فيما يتعلق بالموقع.
في جزء "تحديث المتصفح" ، قمت بتغيير $ rootScope. $ EvalAsync إلى $ rootScope. $ applyAsync.
يبدو أن الطريقتين تفعلان الشيء نفسه تمامًا. لا يصبح الاختلاف واضحًا حتى تنظر إلى التنفيذ الفعلي لـ $ Digger. عندما ينفذ AngularJS ملخصًا ، فإنه يمشي في شجرة النطاق وينفذ روابط $ watch () حتى لا يتم إنتاج المزيد من البيانات المتسخة. أثناء دورة الحياة هذه ، يتم مسح كل من قائمة انتظار $ applyAsync () وقائمة انتظار $ EvalAsync () ؛ لكن هذا يحدث في مكانين مختلفين للغاية.
يتم مسح قائمة انتظار $ applyAsync () فقط في الجزء العلوي من ملخص $ قبل أن يبدأ AngularJS في التحقق من البيانات المتسخة. على هذا النحو ، سيتم مسح قائمة انتظار $ applyAsync () ، على الأكثر ، مرة واحدة خلال ملخص $ ولن يتم مسحها إلا إذا تم ملء قائمة الانتظار بالفعل قبل بدء الملخص $.
من ناحية أخرى ، يتم مسح قائمة انتظار $ EvalAsync () في الجزء العلوي من حلقة while-loop التي تنفذ "الاختيار القذر" داخل ملخص $. هذا يعني أن أي تعبير يضاف إلى قائمة انتظار $ EvalAsync () أثناء الملخص سيتم تنفيذه في وقت لاحق ضمن نفس الملخص.
لجعل هذا الاختلاف أكثر واقعية ، فهذا يعني أن التعبيرات غير المتزامنة المضافة بواسطة $ EvalAsync () من داخل ربط $ watch () سيتم تنفيذها في نفس الملخص. سيتم تنفيذ التعبيرات غير المتزامنة المضافة بواسطة $ applyAsync () من داخل ربط $ watch () في وقت لاحق (حوالي 10 مللي ثانية).
آمل أن يساعد هذا بالفعل بعضًا منكم :-).
// update browser
$rootScope.$watch(function $locationWatch() {
var oldUrl = trimEmptyHash($browser.url());
var newUrl = trimEmptyHash($location.absUrl());
var oldState = $browser.state();
var currentReplace = $location.$$replace;
var urlOrStateChanged = oldUrl !== newUrl ||
($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
if (initializing || urlOrStateChanged) {
initializing = false;
$rootScope.$applyAsync(function() {
var newUrl = $location.absUrl();
var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
$location.$$state, oldState).defaultPrevented;
// if the location was changed by a `$locationChangeStart` handler then stop
// processing this location change
if ($location.absUrl() !== newUrl) return;
if (defaultPrevented) {
$location.$$parse(oldUrl);
$location.$$state = oldState;
} else {
if (urlOrStateChanged) {
setBrowserUrlWithFallback(newUrl, currentReplace,
oldState === $location.$$state ? null : $location.$$state);
}
afterLocationChange(oldUrl, oldState);
}
});
}
$location.$$replace = false;
// we don't need to return anything because $evalAsync will make the digest loop dirty when
// there is a change
});
إليك طريقة أخرى. لست على دراية بقاعدة الكود الزاوي ، لكن المنطق يبدو منطقيًا. تعتمد وظيفة عنوان url (...) في المتصفح حاليًا على الموقع. href يعيد عنوان URL الصحيح على الفور. نظرًا لاستدعاء هذه الطريقة في نفس حلقة التشغيل ، ضمن دورة تثبيت $ Digest ، فإنها تستمر في الحصول على عنوان URL القديم. يعمل هذا التصحيح على الاستفادة من "waitingHref" لتتبع المهمة وإرجاع تلك القيمة بدلاً من ذلك ، إذا تم تعيينها. بمجرد محاذاة القيمة مع location.href ، يتم مسح القيمة المعلقة. أثناء مجموعة عنوان url ، يتم تعيين عداد الوقت بـ 0 مللي ثانية للقبض على الحالة التي لا يتم فيها استدعاء عنوان url (). إنه ليس مثاليًا ، لكن المنطق يبدو أنه يعمل. هذا بشكل أساسي للنظر في نهج بديل لا يؤدي إلى تأخير في الأداء. هذا مبني على Angular tag v1.4.3.
diff --git a/src/ng/browser.js b/src/ng/browser.js
index 928de95..3b9957e 100644
--- a/src/ng/browser.js
+++ b/src/ng/browser.js
@@ -87,7 +87,9 @@ function Browser(window, document, $log, $sniffer) {
var cachedState, lastHistoryState,
lastBrowserUrl = location.href,
baseElement = document.find('base'),
- reloadLocation = null;
+ reloadLocation = null,
+ pendingHref = null,
+ pendingHrefTimer = null;
cacheState();
lastHistoryState = cachedState;
@@ -124,6 +126,18 @@ function Browser(window, document, $log, $sniffer) {
if (location !== window.location) location = window.location;
if (history !== window.history) history = window.history;
+ // Schedule cleaning up pendingHref on the next run loop for setting URL. This is to handle
+ // the case where the browser doesn't update the location.* properties immediately
+ if (!pendingHrefTimer && pendingHref && url) {
+ pendingHrefTimer = setTimeout(function () {
+ if (location.href == pendingHref) {
+ console.log('Actual href updated... setting pendingHref to null from setTimeout');
+ pendingHref = null;
+ }
+ pendingHrefTimer = null;
+ }, 0);
+ }
+
// setter
if (url) {
var sameState = lastHistoryState === state;
@@ -147,6 +161,7 @@ function Browser(window, document, $log, $sniffer) {
// Do the assignment again so that those two variables are referentially identical.
lastHistoryState = cachedState;
} else {
+ pendingHref = url;
if (!sameBase || reloadLocation) {
reloadLocation = url;
}
@@ -161,10 +176,22 @@ function Browser(window, document, $log, $sniffer) {
return self;
// getter
} else {
+ var href = location.href.replace(/%27/g, "'");
+ if (pendingHref) {
+ //console.log('.. using pendingHref for url() return value');
+ href = pendingHref;
+ }
+
+ if (location.href == pendingHref) {
+ console.log('Actual href updated... setting pendingHref to null in getter');
+ pendingHref = null;
+ }
+
+ //var href = location.href.replace(/%27/g,"'");
// - reloadLocation is needed as browsers don't allow to read out
// the new location.href if a reload happened.
// - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
- return reloadLocation || location.href.replace(/%27/g,"'");
+ return reloadLocation || href;
}
};
شكرا CleverCoder على الحل! يبدو أنه يعمل مثل السحر! : +1:
تضمين التغريدة
سيكون رائعًا إذا قمت بإجراء طلب سحب مع هذا الفريق الزاوي.
viattik سأفاجئني نوعًا ما إذا اعتمد الفريق الزاوي حلاً بديلاً لـ UIWebView على iOS9 نظرًا لأن الخطأ موجود في UIWebView (Apple) نفسها. لكن يمكنك دائمًا المحاولة ...
Raftheunis87
هناك الكثير من الأخطاء في المتصفحات المختلفة والكثير من الحلول لتلك الأخطاء في الكود الزاوي.
على الرغم من أنها لا تدعم UIWebView رسميًا ، إلا أنه سيتم كسر الكثير من التطبيقات المختلطة وسيكون استخدام الزاوية مستحيلًا في التطبيقات المختلطة في أحدث نظام تشغيل iOS حتى تقوم Apple بإصلاح هذا الخطأ. وهذه مشكلة كبيرة جدًا أود أن أقول.
لذلك سأجربها.
viattik أتفق تماما. راجع للشغل: أبلغتنا Apple أنه من غير المحتمل أن يصلحوا خطأ UIWebView. لذا بالفعل: جربها ؛-)
أيها الناس ، إذا كان بإمكانك نشر هذا على أنه خطأ في webkit ، بشكل مثالي مع حالة repro ، فسأتابع مع بعض جهات الاتصال الخاصة بنا على جانب WebKit. https://bugs.webkit.org/
تضمين التغريدة
لست متأكدًا مما إذا كان خطأ في webkit. لأنه يحدث فقط في UIWebView على iOS9. يعمل Safari على iOS9 بشكل جيد.
@ raftheunis87 شكرا لاقتراحات التعليمات البرمجية الخاصة بك ، عملت بشكل مثالي
@ raftheunis87CleverCoder هو عبتي وسيلة للعمل مع الأيونية-الزاوي؟ يمكنك أن تكون أكثر تحديدا؟
abrahamrkj ليس لدي أي خبرة مع الأيونات. لكن هل تخصيصاتهم في الزاوية عند استخدام الأيونية؟ وإلا سأقول أن نفس الإصلاح سيعمل مع الزاوية الأيونية ...
@ raftheunis87 https://github.com/driftyco/ionic/tree/master/js هذه هي الزاوية التي يستخدمونها.
CleverCoder +1 لطلب السحب. أتفق مع viattik على أن هذه مشكلة مهمة لأنها ستؤدي إلى كسر الكثير من التطبيقات المختلطة.
قد يكون طلب السحب في المستقبل القريب ، على الرغم من أنني متردد لأنني لست قريبًا من قاعدة الكود الزاوي مثل الآخرين. سأعيد النظر في الحل قريبًا وسأحاول جعله مضادًا للرصاص. يبدو من الغريب ألا تتغير خاصية على الكائن window.location "على الفور". في الاختبارات التي أجريتها ، لاحظت أن التغيير ظل ثابتًا طالما لم تكن خطافات حدث "popstate" و "hashchange" في مكانها ، مما دفعني إلى الاعتقاد بأن سبب التغيير المؤجل قد يكون فعلًا شيء آخر .. ربما تغير توقيت تلك الأحداث (أعتقد أن هذا ما كنت ألاحظه).
سأشاهد هذا خلال الأيام القليلة القادمة ، وإذا لم يظهر شيء أفضل ، فسأحفر أعمق قليلاً لتأكيد ما أعرفه حتى الآن ، وأنه لا يوجد مكان أفضل لمعالجة التغيير في السلوك. اسف اذا كان هذا مربك. هناك الكثير من الأمور التي ما زلت لا أفهمها تمامًا فيما يتعلق بتلك الأحداث.
هتافات!
... ونعم ، borrull ، أوافق. إذا لم تقم Apple بإجراء المزيد من التغييرات ، فهذه قنبلة موقوتة خطيرة ستؤدي حقًا إلى الضغط السيئ وتوجيه الإصبع. لست معجبًا بالمؤقتات كحل بديل (أفضل تحسين التدفق المنطقي حول هذه الخصائص المضمنة) ، ولكن إذا لم نستطع الاعتماد على تغيير القيمة بمجرد تعيينها ، فأين نرسم خط؟ ما هي الخصائص الأخرى التي لا يمكننا الوثوق بها؟ إنه أمر غريب.
CleverCoder أردت فقط أن أقول شكرًا ، لقد أنقذ التصحيح الخاص بك اليوم حقًا!
CleverCoder شكرًا على الحل البديل.
لقد اشتقت حلاً يستخدم ميزة الزخرفة من الزاوي ويأتي بدون تصحيح المصدر الزاوي.
باستخدام cssua ، يمكن تكوين هذا الإعداد لاستخدامه في بيئات محددة فقط.
app.config(['$provide', ($provide) => {
$provide.decorator('$browser', ['$delegate', ($delegate) => {
var origUrl = $delegate.url;
var pendingHref = null;
var pendingHrefTimer = null;
var newUrl = function (url, replace, state) {
if (url) {
// setter
var result = origUrl(url, replace, state);
if (window.location.href != url) {
if (pendingHref != url) {
pendingHref = url;
if (pendingHrefTimer) clearTimeout(pendingHrefTimer);
pendingHrefTimer = setTimeout(function () {
if (window.location.href == pendingHref) {
pendingHref = null;
}
pendingHrefTimer = null;
}, 0);
}
}
return result;
} else {
// getter
if (pendingHref == window.location.href) {
pendingHref = null;
}
return pendingHref || origUrl(url, replace, state);
}
};
$delegate.url = newUrl;
return $delegate;
}]);
}]);
CleverCoder انظر #
@ jd-carroll: هذا مثير للاهتمام حقًا. قد أعيد النظر في هذا لاحقًا اليوم عندما يكون لدي وقت. غارقة جدا مع الاشياء. هذا فقط يخلق المزيد من الغموض ، لأن ذلك يبدو وكأنه مشكلة منفصلة لا ينبغي أن تؤدي إلى تأخير في الموقع. * تحديث القيم.
realityfilter : من المضحك أن تذكر مصمم الديكور ... لقد انتهيت للتو من تنفيذ شيء ما باستخدام وظيفة Angular decorator. لطيف!
مرحبا جميعا،
أردت فقط أن أضيف أن هذا الإصلاح تسبب في وجود خطأ في التعليمات البرمجية الخاصة بنا كان من السهل إصلاحه.
تحتوي قوالبنا على علامات ربط تستخدم href = "#" و ng-click = "someCall ()". كان href يتسبب في انتقال الموقع إلى index.html باستخدام هذا الإصلاح. أدت إزالة href إلى إصلاح المشكلة.
ينكسر تطبيقنا أثناء التنقل عبر زر الرجوع في Ionic ، ثم ينتقل أولاً إلى العرض الجديد ثم يعود إلى العرض القديم جزئيًا ثم يعود مرة أخرى إلى العرض الجديد على IOS9 beta أي قرارات لـ Ionic
نفس المشكلة مع iOS 9 beta 5 13A4325c ، Angular 1.4.0 (مع cordova-ios 3.9.1). نأمل أن يتم إصلاح خطأ UIWebView الأساسي!
حدثت نفس المشكلة في Angular v1.2.27
لقد قمت بتتبعه وصولاً إلى الإصدار 1.2.27 ، الخطأ ليس في الإصدار السابق 1.2.26.
على وجه التحديد ، هذا الالتزام هو الجاني.
@ damrbaby يبدو أنه يمكن أن أفعل شيئًا به.
لكن حقيقة أنه يعمل مع أحدث إصدار من Angular في Mobile Safari توضح أنه يجب أن يفعل شيئًا ما باستخدام uiWebView على iOS 9. لذا فإن التغيير الذي أجروه في شفرة المصدر Angular ليس بالضرورة أمرًا سيئًا.
CleverCoderrealityfilter @ jyc66 أردت فقط أن أقول شكرا لكم، وحفظته للتو بلدي اليوم.
لا تزال المشكلة موجودة في iOS9 GM Seed لذا احصل على تطبيقاتك المحدثة!
أستطيع أن أؤكد أن المشكلة لا تزال موجودة في iOS9 GM (13A340)
هذا يعني أن Apple كسرت شيئًا ما وعلينا تحديث تطبيقاتنا مرة أخرى (بعضها لم يتغير منذ شهور أو حتى أكثر من عام) لمنعها من الانهيار. من المنطقي :(. أفضل أن أجعل Apple تصلحه لإطلاق iOS9. الانتقال إلى أحدث إصدار من Angular في تطبيق قديم لا بد أن يكسر بعض الأشياء الأخرى أيضًا.
أشك بشدة في أن Angular هو الإطار الوحيد الذي يواجه مشكلات مع iOS9؟
لذا ، فإن adamdbradley و perrygovier و
هذا هو الحل المجمّع الحالي الذي يزين ويصلح $browser
خلال تطبيق هذا التصحيح . ملاحظة: يعتمد هذا على Angular 1.4.3 وهو نوع من "استنساخ مع إصلاحات" browser.js
من Angular Proper: https://github.com/driftyco/ionic/blob/ios9-patch/js /angular/service/decorators/ios9-browser-fix.js
وضعنا الرقعة أيضًا على شبكة توصيل المحتوى الخاصة بنا. لا أوصي باستخدام ملف CDN للإنتاج ، فهو موجود فقط لذا من السهل اختباره الآن.
لاختبارها ، ضع علامة البرنامج النصي هذه أسفل ملف angular أو ionic.bundle.js:
<script src="https://code.ionicframework.com/patch/ios9-$browser-patch.js"></script>
أيضًا ، في الوقت الحالي ، يتم تطبيق التصحيح سواء كنت تعمل على iOS9 أم لا. سيتم إصلاح ذلك قريبًا بحيث يتم تشغيله فقط على iOS 9 UIWebView.
اتبع المشكلة الأيونية المقابلة هنا: https://github.com/driftyco/ionic/issues/4082#issuecomment -139079725
أهلا بكم،
يعمل UI-sref مثل السحر ولكن $ state.go يكسر حركة الزر الخلفي
وتومض الصفحة كثيرًا حتى بعد تطبيق هذا الإصلاح.
يعتبر،
اجاي سينغ
في الخميس ، 10 سبتمبر 2015 ، الساعة 6:23 صباحًا ، كتب Max Lynch [email protected] :
لذا ، adamdbradley https://github.com/adamdbradley،perrygovier
https://github.com/perrygovier وmhartington
https://github.com/mhartington من فريق Ionic يعمل
طوال اليوم على الإصلاح الذي سيعمل مع Ionic وتطبيقات Angular العادية مثل
نحن سوف. الهدف هو أن يكون إصلاحًا بدون انتظار ولا يتطلب تعديلًا
Angular ، وسوف يعمل (نأمل) عبر أكثر من 1.2+ إصدارات Angular.هذا هو الحل المجمع الحالي الذي يزين ويصلح متصفح $ بواسطة
تطبيق هذا التصحيح
https://github.com/angular/angular.js/issues/12241#issuecomment -130744518.
ملاحظة: هذا مبني على Angular 1.4.3 وهو نوع من "استنساخ مع إصلاحات"
browser.js من الزاوية المناسبة:
https://github.com/driftyco/ionic/blob/ios9-patch/js/angular/service/decorators/ios9-browser-fix.jsوضعنا الرقعة أيضًا على شبكة توصيل المحتوى الخاصة بنا. لا أوصي باستخدام ملف CDN
للإنتاج ، فهو موجود فقط ، لذا من السهل اختباره الآن.يرجى اختباره وإخبارنا كيف ستسير الامور ، شكرا.
لاختبارها ، ضع علامة البرنامج النصي هذه أسفل الزاوية أو
ملف ionic.bundle.js:Also, right now it applies the patch whether you're running on iOS9 or
not. That will soon be fixed such that it runs only on the iOS 9 UIWebView.—
Reply to this email directly or view it on GitHub
https://github.com/angular/angular.js/issues/12241#issuecomment-139082474
.
أستطيع أن أؤكد أن هذا الخطأ لا يزال موجودًا في iOS 9.1 Beta 1
نحن نستخدم $state.go
كثيرًا ولا يزال يتأرجح بين الدول / لا ينتقل بشكل صحيح.
نأسف لأن الإصلاح يعمل مع تطبيقنا الآن ، الشيء الوحيد الذي نحتاجه هو تضمين https
يبدو أن ارتباط CND بدلاً من http CDN يبدو أن ios9 يسمح فقط بـ https داخل ملف
التطبيق حتى بعد استخدام https عمل التطبيق لدينا.
https://code.ionicframework.com/patch/ios9- $ browser-patch.js
يوم الخميس ، 10 سبتمبر 2015 الساعة 3:22 مساءً ، Tyler Crammond notifications@github.com
كتب:
نحن نستخدم state.go كثيرًا ولا يزال يتأرجح بين الدول / لا
الانتقال بشكل صحيح.-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/angular/angular.js/issues/12241#issuecomment -139189216
.
ios9- $ browser-patch.js يعمل معي أيضًا. لكنه يولد بعض أخطاء jshint. هل هناك طريقة للمساهمة في التصحيح للمساعدة في إزالة الأخطاء؟
لا أعتقد أن هذا التصحيح سليم تمامًا لأنه لا يسمح لك بتحديث الموقع من خارج Angular. ربما لا تكون هذه مشكلة بالنسبة لمعظم التطبيقات ولكننا نعمل لمعرفة ما إذا كان هناك حل أفضل ...
ios9- $ browser-patch.js لم يعمل معي. عندما أنتقل من عرض القائمة إلى عرض التفاصيل ، استخدم $ state.go () للتنقل بين الصفحات. في المرة الأولى التي أفعل فيها هذا ، ينزلق عبره ثم يعود مباشرة ، ثم انقر مرة أخرى وهو يعمل. يعمل UI-sref كما هو مطلوب ، لكنه لن يسمح لي بالقيام بالمنطق الشرطي الذي أحتاج إلى القيام به.
لسوء الحظ ، لم يغير تنزيل التصحيح وتخزينه وتحميله من ./lib/ (تحققت من أنه تم تحميله) ، أي شيء بالنسبة لي:
Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.3.13/$rootScope/infdig?p0=10&p1=%5B%5D
iOS 9 GM ، أيوني 1.0.0.
جوريسو ، حاول تعطيل كود الكشف عن ios9 ومعرفة ما إذا كان يعمل:
var isIOS9 = (navigator.userAgent.indexOf ('الإصدار / 9.')! = -1) && (navigator.appVersion.indexOf ('9_0')! = -1) ؛
إذا (! isIOS9) {
// لا تقم بالتصحيح إن لم يكن iOS9 UIWebView
عودة متصفح $؛
}
@ jyc66 هذا يعمل ، شكرا. كيف يمكنني التأكد من أنه لا يكسر iOS <9؟
طريقة isIOS9
خاطئة. يجب أن تتحقق من:
> navigator.userAgent
< "Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340 (2065230368)" = $1
> navigator.appVersion
< "5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340 (2065230368)" = $2
نعم ، بدلاً من ذلك ، يمكنك اختبار نظام التشغيل الأقل من 9 وتعطيل الإصلاح في تلك الحالات. سيتوقف الفحص الحالي على iOS 9.1 والذي سيصدر قريبًا أيضًا.
أفعل هذا الآن ، حتى أتوصل أنا أو أحدهم إلى أفضل:
// only provide the patch for iOS9 on UIWebView
var isIOS9 = (navigator.userAgent.indexOf(' OS 9') != -1) && (navigator.appVersion.indexOf(' OS 9') != -1);
if (!isIOS9) {
// do not patch if not iOS9 UIWebView
return $browser;
}
ياه ، هذا مشابه لما أفعله.
هل يعرف أي شخص ما إذا كان تطبيق التصحيح على إصدارات iOS> = 9.0 سيتسبب في حدوث مشكلات إذا / عندما تقوم Apple بإصلاح المشكلة في إصدار لاحق من iOS؟
JeremyPlease أنا أقوم بتحميل 9.1 بيتا الآن وسوف أتحقق من ذلك
عملت من أجلي عندما قمت بتعطيل فحص وكيل المستخدم ، وتقديم التصحيح كجزء من الحزمة المصغرة. إنه تطبيق زاوي غير أيوني. سوف نحقق في وقت لاحق الليلة ونتأكد من أن كل شيء يعمل كما هو متوقع.
شكرا للفريق الأيوني لبذل الجهد!
لذا فإن 9.1beta واحد ليس لديه الإصلاح حتى الآن. لست متفاجئا.
قد يبدو هذا غريبًا - لكن أي شخص يرى وظيفة String.split () لا يعمل بشكل صحيح عند تطبيق التصحيح على iOS 9؟ (تم اختباره حتى الآن على جهاز محاكاة فقط). إليك لقطة شاشة من مصحح أخطاء Safari: https://www.dropbox.com/s/hxgct9y0f9z6yci/Screenshot٪202015-09-11٪2000.40.26.png؟
أنا في حيرة من أمري! يعمل بشكل جيد على iOS8.4 و Chrome بالطبع.
تحديث : String.split لا يبدو أنه يعمل في iOS 9 iPhone 6 و 6s simulator بالنسبة لي ، لا علاقة له بالتصحيح.
بالمناسبة - إليك ما استخدمته لفحص وكيل المستخدم:
var isIOS9WebView = (navigator.userAgent.indexOf('Safari') === -1) && (navigator.appVersion.indexOf('OS 9') !== -1);
if (!isIOS9WebView) {
// do not patch if not iOS9 UIWebView
return $browser;
}
أعتقد أن الحل الأفضل ربما يكون في طلب Igor ، لكن هذا يعمل بالنسبة لي أثناء عدم تطبيق التصحيح على iOS 9 Safari ، ولكن على UIWebView فقط.
@ dac09 أريد اختبار كوميت الخاص بك ، لكني لا أعرف أي ملف يجب تعديله ...
هل يمكن أن تخبرني أي ملف يجب تعديله؟
أنا أستخدم تصحيح
مرحبًا يا رفاق ، هل يمكنكم اختبار هذا التصحيح من فضلك: https://gist.github.com/IgorMinar/863acd413e3925bf282c
يجب أن يعمل مع Angular 1.2 - 1.4.5 ولا يتطلب أي تحديثات Angular. توجد تعليمات حول كيفية تطبيق هذا على تطبيقك في الجوهر.
سنحصل على إصلاح مناسب في الإصدار 1.4.6 ، ولكن في الوقت الحالي ، يهدف هذا التصحيح المستقل إلى تسهيل تنفيذ الإصلاح ونشره بحيث يمكنك طرحه بسرعة.
مرحبًا IgorMinar -
خطأ في النوع غير معروف: angular.module (...). decorator ليس وظيفة (وظيفة مجهولة) @ angular-ios9-uiwebview.patch.js: 33
rajatrocks اه .. نقطة جيدة. module.decorator هو 1.4 ميزة فقط. اسمحوا لي أن أغير التصحيح.
rajatrocks I تحديث جوهر
شكرًا IgorMinar ، "installs" جيد الآن. سأترك تعليقاتي على الخيط الأيوني لأنهم أكثر ارتباطًا بذلك.
IgorMinar لقد قمت بتضمين ملف js الخاص بك وأضف ما يلي في app.js. لا يصلح مشكلتي.
IgorMinar لم يصلح التصحيح الخاص بك mlynch فعلت.
لضمان تطبيقه فقط على نظام iOS الأساسي ، قمت بإنشاء خطاف كوردوفا بسيط:
https://gist.github.com/DURK/f2acd6bca4759e719801
تحديث : آه ، أرى أن التصحيح الآن يحتوي على فحص لذلك يتم تطبيقه فقط على iOS9.
IgorMinar متابعة ما أفاد به jprangenberg ، يبدو أن هناك مشكلة في وظيفة "isIOS9UIWebView" عند الاختبار على iPad Air 2. إذا فرضت تطبيق الرقاقة دائمًا ، فإن التصحيح يعمل.
من تعليقي على: https://github.com/driftyco/ionic/issues/4082#issuecomment -139567128
IgorMinar ، يعمل التصحيح الخاص بك بشكل رائع على iOS 9 iPhone UIWebView ، ولكن هناك بعض المشكلات في اكتشاف وكيل المستخدم لجهاز iPad.
وكيل مستخدم iOS 9 iPhone في UIWebView:
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340
وكيل مستخدم iOS 9 iPad في UIWebView:
Mozilla/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340
التعبير المعتاد الذي سيتطابق بشكل موثوق مع كل هذه العناصر هو:
function isIOS9UIWebView(userAgent) {
return /(iPhone|iPad|iPod);.*OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
}
لقد تفرع عن جوهر IgorMinar وقمت بإجراء التغييرات هنا: https://gist.github.com/JeremyPlease/72cb3bf98279fefed4e3
DURK كوردوفا هوك ليست ضرورية. التصحيح لا يفعل أي شيء على الأنظمة الأساسية التي لا تحتاج إليه.
JeremyPlease Safari على iOS9 لا يتأثر. نريد حقًا تطبيق التصحيح فقط عندما تكون في UIWebView.
JeremyPlease Safari iOS 9 ليس هو المشكلة ، لذا فإن فحص IgorMinar صحيح - لقصره على UIWebViews على وجه التحديد ، على ما أعتقد.
يعمل بشكل رائع بالنسبة لي.
لقد أدركت أن هذه مجرد مشكلة في UIWebView ، لذلك قمت بتحديث موجتي بحيث لا تنطبق عندما تكون في Safari:
function isIOS9UIWebView(userAgent) {
return /(iPhone|iPad|iPod);.*OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
}
لقد نشرت الإصدار 1.0.3 من التصحيح
IgorMinar هل هذا الإصلاح يعمل فقط ، إذا كنت تستخدم ngRoute؟ الإصلاح لا يعمل بالنسبة لي ... :-(
jprangenberg نعم. يعمل تطبيقي مع ngroute بشكل جيد على iphone / ipad. هل يمكنك أن تعطي معلومات إضافية؟ تأكد أيضًا من أنك تستخدم v1.0.3 + من التصحيح
IgorMinar الإصدار 1.0.3 من التصحيح يعمل بشكل صحيح في
index.html:
<script src="lib/ionic/js/ionic.bundle.js"></script>
<script src="lib/ngCordova/dist/ng-cordova.min.js"></script>
<script src="js/libs/angular-ios9-uiwebview.patch.js"></script>
app.js:
angular.module('starter', [
'ionic',
'ngCordova',
'ngIOS9UIWebViewPatch',
'ionic.service.core',
'ionic.service.push',
'angular-loading-bar',
'starter.services',
'starter.controllers'
])
app.js (الطريق):
$stateProvider.state('app.regions', {
cache: false,
url: "/states/:state_id/regions",
views: {
'menuContent': {
templateUrl: "templates/regions.html",
controller: 'RegionsCtrl'
}
}
})
لا يمكن التنقل عبر التطبيق. إذا قمت بالنقر فوق عنصر قائمة ترى العرض الحالي. يتغير زر المحفوظات. إذا قمت بالنقر فوق زر السجل ، يمكنك مشاهدة عرض النقر فوق عنصر القائمة.
<ion-list>
<ion-item ng-repeat="state in states" href="#/app/states/{{state.id}}/regions">
{{state.name}}
</ion-item>
</ion-list>
IgorMinar انها لا تعمل بالنسبة لي. هل لدى احد اي افكار؟
jprangenberg هل تستخدم الإصدار
perrygovier أنا أستخدم الإصدار 1.0.3 منIgorMinar
jprangenberg صحيح ، لكن الأيونية. ما هو اصدار هذا؟
نسخة من my ionic.bundle.js:
window.ionic.version = '1.0.0';
perrygovier شكرا لمساعدتكم!
بدافع الفضول ، هل يساعد استخدام الإصدار 1.1.0 من الحزمة؟
http://code.ionicframework.com/1.1.0/js/ionic.bundle.min.js
ستحتاج على الأرجح إلى CSS المحدث أيضًا
http://code.ionicframework.com/1.1.0/css/ionic.min.css
مرحبًا jprangenberg ، بينما نعمل جميعًا على هذا معًا ، دعنا نواصل هذه المناقشة الأيونية المتعلقة بالمسألة الأيونية حتى لا نرسل بريدًا عشوائيًا إلى المستخدمين الزاويون العاديون driftyco / ionic # 4082
إذن ، لا يؤثر هذا الخطأ على WKWEBVIEW عند استخدام https://github.com/Telerik-Verified-Plugins/WKWebView ؟
الخطأ موجود فقط في UIWebView لنظام التشغيل iOS 9. لا يوجد عند استخدام WKWebView.
شكرًا لعملكم على هؤلاء الرجال ، لكنه لا يعمل معي للأسف. أتلقى رسومًا متحركة معطلة ، والصفحات لا يتم تحميلها على الإطلاق ، والصفحات لا يتم تحميلها بشكل صحيح ، وجهاز التوجيه متزعزع تمامًا.
أنا أستخدم حزمة Ionic 1.1.0 و iOS 9.1 على iPhone 6 ، جنبًا إلى جنب مع ملف التصحيح على https://code.ionicframework.com/patch/ios9- $ browser-patch.js. أرى أخطاء مثل هذا:
خطأ: تم بلوغ عدد مرات التكرار [$
أطلق المراقبون في آخر 5 تكرارات: []
أي اقتراحات؟
شكرا!
scottopolis هل جربت رقعة إيغور: https://gist.github.com/IgorMinar/863acd413e3925bf282c
petebacondarwin شكرا يا ، التصحيح إيغور يعمل بالنسبة لي. الرسوم المتحركة للانتقال لصفحاتي متقطعة ، ولكن يبدو أن جهاز التوجيه قد تم إصلاحه. سأراقب هذه المسألة.
تتسبب بعض الاختبارات هنا والتصحيح من IgorMinar في حدوث مشكلات في الرسوم المتحركة للزر الخلفي ووحدات التحكم. أرى وحدة التحكم للشاشة التي أتراجع عن إنشائها مرة أخرى عندما أنقر مرة أخرى. يتسبب هذا في تشغيل الرسوم المتحركة في هذا العرض أثناء التنقل خارج الشاشة ، وجميع أنواع الرسوم المتحركة غريبة.
حتى الآن لا أرى أي مشاكل في استخدام الأيونية ليلا ولكن تحديث اكتشاف iOS9.
var userAgent = navigator.userAgent,
isIOS9 = /(iPhone|iPad|iPod).* OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
لقد قمت للتو بدفع الإصدار 1.1.0 من التصحيح: https://gist.github.com/IgorMinar/863acd413e3925bf282c
جنبًا إلى جنب مع الفريق الأيوني ، لم نعد قادرين على إعادة إنتاج أي وميض باستخدام هذا الإصدار من التصحيح.
يُرجى الترقية وإخبارنا إذا رأيت أي مشاكل أخرى. (تأكد أيضًا من عدم استخدام أي تصحيحات أخرى لهذه المشكلة بالإضافة إلى الإصدار 1.1.0 من التصحيح).
سنصلح الإصلاح في البرنامج الرئيسي الأسبوع المقبل ، بحيث لا يحتاج Angular v1.4.6 إلى التصحيح بعد الآن.
هذا الإصدار الجديد من التصحيح يعمل بشكل مثالي بالنسبة لي. شكرا IgorMinar!
هل الإصدار 1.4.6 يصلح هذه المشكلة إلى الأبد؟
@ alexislg2 - نعم يجب أن يصلح هذا الإصدار المشكلة حتى لا تحتاج إلى تطبيق التصحيح.
تم التأكيد ، يعمل من أجلي على جهاز المحاكاة والجهاز ، ما عليك سوى انتظار المستخدمين لمدة أسبوعين للحصول على موافقة Apple ؛-(
dbroadhurst سمعت أنك قد تتمكن من الاقتباس من https://openradar.appspot.com/22186109 تقرير الخطأ لتتبع التحديث السريع لتطبيقك.
يمكنك متابعة خطأ WebKit هذا للحصول على التحديثات.
مرحبًا ، يبدو أنك قد قمت بحل مشكلة iOS9 غير المتزامن على تغيير التجزئة على Angular.js.
لقد أجريت أبحاثًا ، ونشرتها أيضًا على stackoverflow ولكن الحل الوحيد الذي وجدته حتى الآن هو في ملف browser.js الزاوي.
لست على دراية بالزاوية حقًا وأود أن أفهم ما الذي جعلك تصلحه متاحًا فيه
كل تطبيق ويب يعتمد على توجيه التجزئة
هل تشرح كيف حددت المشكلة وأصلحتها؟
lchenneberg - الالتزام الذي يعمل على حل المشكلة في AngularJS موجود هنا https://github.com/angular/angular.js/commit/8d39”abf423517b5bff70137c2a29e32bff76d
تكمن المشكلة في أن هذا المستعرض المعين لا يقوم بتحديث قيمة window.location.href
حتى التشغيل التالي لحلقة حدث JavaScript. هذا يعني أنه إذا كتبت إلى هذه القيمة ، فعند قراءتها على الفور ستحصل على قيمة مختلفة:
console.log(window.location.href) // -> http://my.domain.com/path/to/page
window.location.href = 'http://my.domain.com/path/to/other/page';
console.log(window.location.href) // -> http://my.domain.com/path/to/page
// next tick of the event loop
console.log(window.location.href) // -> http://my.domain.com/path/to/other/page
لاحظ أن الثانية console.log
ترجع القيمة القديمة ، وليس القيمة الجديدة. بعد اكتمال حلقة الحدث الحالي ، يتم تحديث القيمة ، كما يتضح من console.log
الإصلاح الذي توصلنا إليه ، هو تخزين القيمة التي كتبناها مؤقتًا ، إذا كان المتصفح لا يتم تحديثه بشكل متزامن ، ثم استخدام هذه القيمة منذ ذلك الحين ، بدلاً من القيمة التي تم إرجاعها من window.location.href
، حتى هناك حدث hashchange
، والذي يخبرنا أن المتصفح قد قام أخيرًا بفرز نفسه.
امل ان يساعد.
نجح تصحيح
window.ionic.version "1.0.1"
angular.version
Object {full: "1.3.13", major: 1, minor: 3, dot: 13, codeName: "meticulous-riffleshuffle"}
لقد نجحنا تصحيح
لكن لدي سؤال آخر قد يستطيع أحدكم الإجابة عليه:
أو ، الأهم من ذلك ، هل الوصول إلى تطبيق ويب بهذه الطريقة يستفيد من محرك العرض Nitro؟
tpeiffer سيستخدمون wkwebview ، لأنه مجرد سفاري بدون شريط العنوان.
مرحبًا ، لدي نفس المشكلة بالضبط مع إصدار قديم من angular: 1.0.6
أرى أن جميع الإصلاحات للإصدارات الأحدث ، هل تعرف أين يجب أن أبحث لمعرفة ما إذا كان بإمكاني إصلاح هذه المشكلة؟ شكرا.
tzamora هل حاولت تطبيق رقعةIgorMinar ؟ ربما يكون الإصدار 1.0.6 سابقًا لأوانه لكي يعمل.
petebacondarwin يشير تصحيح IgorMinar إلى ملف يسمى browser.js. ليس لدي أي ملف يسمى browser.js
لمعلوماتك ، تم إصلاح المشكلة الأساسية في WebKit في اليوم الآخر:
http://trac.webkit.org/changeset/190092
http://trac.webkit.org/changeset/190100
حصلت على هذا العمل مع التصحيح js ، ولكن ليس على الفور. جديد في هذا (angularjs و Ionic) ، لذلك إذا كان بإمكان شخص ما التحقق من ذلك وإخباري إذا فاتني أي شيء رئيسي ، فسأقدر ذلك حقًا! (على سبيل المثال ، هل كائن النظام الأساسي غير فعال للغاية وما إلى ذلك)
ملحوظة:
function isIOS9UIWebView(userAgent) {
return (/9\.[0-9]\.[0-9]/.test(ionic.Platform.version()) && /iOS/.test(ionic.Platform.device() ));
//return true;
//return (navigator.userAgent.indexOf(' OS 9') != -1) && (navigator.appVersion.indexOf(' OS 9') != -1);
//return /(iPhone|iPad|iPod).* OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
// only provide the patch for iOS9 on UIWebView
}
واجهت هذه المشكلة في 8.4 على جهاز المحاكاة ؛ لذلك لا أعتقد أنه يقتصر على iOS 9. لقد قمت للتو بتحديث التحقق من سلسلة الوكيل لتضمين الإصدارين iOS 8 & 9. ها هي سلسلة الوكيل.
"Mozilla / 5.0 (iPhone؛ CPU iPhone OS 8_4 مثل Mac OS X) AppleWebKit / 600.1.4 (KHTML ، مثل Gecko) Mobile / 12H141 (140307121489296)"
+1
أهلا
هل يمكن لأي شخص تأكيد ما إذا كان هذا قد تم حله على نظام التشغيل iOS 9.2؟ (بيتا)
شكرا :)
لا يمكنني تكرار المشكلة اعتبارًا من هذا التحديث الصباحي إلى iOS 9.2 (13C75) على iPhone 6. تبدو جيدة حتى الآن. لا يزال هذا الخطأ مفتوحًا - https://openradar.appspot.com/22186109
إذا تم تطبيق هذا التصحيح ، فهل يمكن أن يكون له أي تأثير سلبي على iOS 9.2 والإصدارات الأحدث؟ سأختبر هذا من خلال تطبيقنا الخاص ، لكنني أريد التأكد من أنني لا أقدم مشكلات لا تظهر عند اختبار موقفنا الخاص.
بقدر ما أستطيع أن أرى ، جميع التصحيحات تستخدم regex الذي يقوم بتصفية iOS 9 والإصدارات الأحدث ، ولكن ليس على وجه التحديد 9.x حتى 9.1.
مرحبًا يا رفاق ، تحدث هذه المشكلة حاليًا في iPhone 6 مع iOS 9 ، هل يمكن لأي شخص إخباري بالسبب؟
https://forum.ionicframework.com/t/ios-9-beta-slide-menu-app-transition-issue/30768
هي رقعة أخرى أحتاج لتطبيقها؟ يرجى إعلامي ، فأنا بحاجة حقًا إلى إصلاح مشكلة تداخل الشاشة هذه.
يبدو أن التحديث إلى iOS 9.2 يحل المشكلة بالنسبة لي أيضًا.
@ bruno-serfe ، هذه مشكلة تتعلق بكيفية تعامل iOS مع window.location
الموجود فقط في iOS 9.0.x. إذا كان بإمكانك التحديث إلى Angular 1.4.6+ ، فلا يوجد شيء آخر عليك القيام به لأن هذا الإصدار يحتوي على الإصلاح. إذا لم تتمكن من الترقية ، فإن التصحيح الموجود على https://github.com/angular/angular.js/issues/12241#issuecomment -139446288 له نفس الإصلاح.
كما ذكرنا سابقًا ، هذه المشكلة موجودة فقط في iOS 9.0.x حيث تم إصلاح ذلك في iOS 9.1.0.
تبدو المشكلة المنشورة على الأيونية نفس المشكلة ، لذا يجب أن يعمل الإصلاح نفسه في كلا الاتجاهين.
lgalfaso شكرًا على الرد ، سأحاول إصلاح خطأ الملخص الذي وجدته ، إذا لم يحل ذلك المشكلة ، فسأحاول ترقية الزاوية ، شكرًا على الرد !.
شكرا lgalfaso : +1:
واجهت هذه المشكلة عندما أضفت تطبيق الويب إلى الشاشة الرئيسية واستخدمته كمستقل ، ولكن الترقية من AngularJS 1.4.5 إلى 1.5 حلت المشكلة تمامًا وسرعت التنقل كالجحيم!
volgwfang لا تتعلق المشكلة التي تواجهها بهذا الموضوع؟
التعليق الأكثر فائدة
حصلت على مزيد من المعلومات حول هذا الأمر. لقد أجريت تغييرًا في Angular فيما يتعلق بالموقع.
في جزء "تحديث المتصفح" ، قمت بتغيير $ rootScope. $ EvalAsync إلى $ rootScope. $ applyAsync.
يبدو أن الطريقتين تفعلان الشيء نفسه تمامًا. لا يصبح الاختلاف واضحًا حتى تنظر إلى التنفيذ الفعلي لـ $ Digger. عندما ينفذ AngularJS ملخصًا ، فإنه يمشي في شجرة النطاق وينفذ روابط $ watch () حتى لا يتم إنتاج المزيد من البيانات المتسخة. أثناء دورة الحياة هذه ، يتم مسح كل من قائمة انتظار $ applyAsync () وقائمة انتظار $ EvalAsync () ؛ لكن هذا يحدث في مكانين مختلفين للغاية.
يتم مسح قائمة انتظار $ applyAsync () فقط في الجزء العلوي من ملخص $ قبل أن يبدأ AngularJS في التحقق من البيانات المتسخة. على هذا النحو ، سيتم مسح قائمة انتظار $ applyAsync () ، على الأكثر ، مرة واحدة خلال ملخص $ ولن يتم مسحها إلا إذا تم ملء قائمة الانتظار بالفعل قبل بدء الملخص $.
من ناحية أخرى ، يتم مسح قائمة انتظار $ EvalAsync () في الجزء العلوي من حلقة while-loop التي تنفذ "الاختيار القذر" داخل ملخص $. هذا يعني أن أي تعبير يضاف إلى قائمة انتظار $ EvalAsync () أثناء الملخص سيتم تنفيذه في وقت لاحق ضمن نفس الملخص.
لجعل هذا الاختلاف أكثر واقعية ، فهذا يعني أن التعبيرات غير المتزامنة المضافة بواسطة $ EvalAsync () من داخل ربط $ watch () سيتم تنفيذها في نفس الملخص. سيتم تنفيذ التعبيرات غير المتزامنة المضافة بواسطة $ applyAsync () من داخل ربط $ watch () في وقت لاحق (حوالي 10 مللي ثانية).
آمل أن يساعد هذا بالفعل بعضًا منكم :-).