我有一个应用程序,它有一个派生自Application类的类,并注意到它的onCreate()方法被多次调用.除此之外,每次调用onCreate()时,都会重置其静态变量的值.
此行为仅发生在男,它不属我想如果要找出M或错误在并购预期的变化发生,或有与应用程序体系结构的一些基本固有的问题已沉睡,只有现在表现为M.
只要调用广播接收器的onReceive(),就会调用Application派生类的onCreate().未创建Application类的多个实例 - 在同一对象实例上调用onCreate(),并且始终存在相同的应用程序上下文.
以下是一些代码片段,展示了这一观察结果:
public class MyApplication extends Application
{
public static int debugVal = 5;
public MyApplication ()
{
theApp = this;
}
public void onCreate ()
{
Log.v(TAG, "++++++++++++ onCreate() debugVal: " + debugVal);
debugVal = 10;
....
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive (Context context, Intent intent)
{
Log.v(TAG, "onReceive. debugVal: " + MyApplication.debugVal);
...
Run Code Online (Sandbox Code Playgroud)
在Marshmallow上运行时,logcat输出为:
831-1412/? I/ActivityManager Start proc 2244:com.company.redacted/u0a86 for broadcast com.company.redacted/com.company.redacted2.MyBroadcastReceiver
2244-2244/? V/MyApplication: ++++++++++ onCreate() debugVal: 5
2244-2244/? …Run Code Online (Sandbox Code Playgroud) 我正在创建一个通用应用程序,它将为不同的客户提供不同的构建.该应用程序对于每个客户是99.5%相同,每个客户的差异都标有客户自己的特定图像和文本和应用程序图标等.
显然,这可以使用以下标志来完成:
#if defined (CUSTOMER_A)
NSString* text = @"Text for customer A";
UIImage *image = [UIImage imageNamed:@"customerAImage"];
#elseif defined (CUSTOMER_B)
NSString* text = @"Text for customer B";
UIImage *image = [UIImage imageNamed:@"customerBImage"];
Run Code Online (Sandbox Code Playgroud)
但显然我想避免这种情况,只需:
NSString* text = @"Text";
UIImage *image = [UIImage imageNamed:@"image"];
Run Code Online (Sandbox Code Playgroud)
(该文本可以本地化,因此它将在最终版本中使用NSLocalizedString).
我想知道一种可能的方法是将项目放入工作空间以及一些静态库,每个静态库包含每个客户的特定文本和图像,然后使用不同的方案来创建不同的构建.因此,方案A将创建一个使用主项目和静态库A构建的目标.
我从一个小概念证明开始,但在走得太远之前,我首先要检查这是一种可行且合理的方法,或者是否有更好的选择.如果可行,那么我会想到几个问题:
如何从主项目中的代码访问静态库中的图像?是否必须创建一个包来访问库的内容,这是如何完成的?
是否可以根据使用的方案更改应用程序桌面和市场图标?
是否可以为每个方案指定一组不同的分发证书等?
静态库是否真的不能包含本地化变体?
这适用于iOS,因此无法使用此框架.
感谢您的任何反馈.
(PS使用Jenkins自动构建系统).
如果用户尝试在Mobile Safari中加载https网页并且服务器的证书验证检查失败(其过期,已撤销,自签名等),则会向用户显示一条警告消息并询问他们是否要继续或不.
类似地,NSURLConnection为实现者提供了首先决定如何检查证书然后决定如何失败的能力的能力,因此在这种情况下也可以向用户显示警告并为他们提供继续加载的机会页面与否.
但是,似乎在UIWebView中加载https页面时,证书检查失败,行为只是无法加载页面 - didFailLoadWithError:使用kCFURLErrorServerCertificateUntrusted调用,但是没有任何内容显示给用户.
这是不一致的 - 当然,UIWebView的行为应该与Safari的行为类似,以便在iPhone本身内保持一致吗?它也是一个愚蠢的NSURLConnection允许NSURLRequest具有完全的灵活性:setAllowsAnyHTTPSCertificate是私有的.
无论如何都要实现与Safari一致的行为,是否可以通过与NSURLConnection允许的类似方式自定义此默认行为?
干杯
PS请不要进入有关为什么有人想要这样做的旁观讨论,非常感谢你.
我有一个Objective-C单身如下:
@interface MyModel : NSObject
+ (MyModel*) model;
...
+ (MyModel*) model
{
static MyModel *singlton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^ {
singlton = [[MyModel alloc] initSharedInstance];
});
return singlton;
}
- (MyModel*) initSharedInstance
{
self = [super init];
if (self)
etc.
}
Run Code Online (Sandbox Code Playgroud)
在GUI代码中的多个位置调用它:
[[MyModel model] someMethod];
Run Code Online (Sandbox Code Playgroud)
因此,模型将由于GUI的任何一部分首先引用它而被创建.
我不确定如何通过Swift中的[[MyModel model] someMethod]实现相应的访问类,因为使用Swift的所有示例都涉及使用初始化器创建对象以及当Objective C类方法代码转换为Swift初始化代码时当方法没有参数时,它有问题.
我有一个广播接收器定义如下:
<receiver android:name="stuff.BroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
当应用程序在M上运行时,即使该应用程序已被授予电话组权限,我偶尔也会在有来电或设备启动时在日志中看到这一点.
W/BroadcastQueue? Permission Denial: receiving Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } to stuff/stuff.BroadcastReceiver requires android.permission.READ_PRIVILEGED_PHONE_STATE due to sender android (uid 1000)
10-20 12:59:28.014 10946-10946/stuff V/BroadcastReceiver? onReceive()
Run Code Online (Sandbox Code Playgroud)
虽然接收器确实执行.
我正在尝试从build.gradle android扩展程序在AndroidManifest.xml文件中执行替换,但是收到此错误:
AndroidManifest.xml:89:16 Error:
Attribute uses-library#com.company.platform.${encoding}@name at AndroidManifest.xml:89:16 requires a placeholder substitution but no value for <encoding> is provided.
/Users/Company/Desktop/Checkout/android/Project/app/src/main/AndroidManifest.xml:0:0 Error:
Validation failed, exiting
:app:processDebugManifest FAILED
Run Code Online (Sandbox Code Playgroud)
这是清单文件的片段:
...
</receiver>
<uses-library android:name="com.company.platform.${encoding}" />
</application>
...
Run Code Online (Sandbox Code Playgroud)
这是一个剪辑build.gradle:
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.company.app"
minSdkVersion 23
targetSdkVersion 23
versionName cityVersion
setProperty("archivesBaseName", "City_$versionName")
manifestPlaceholders = [encoding: "some value"]
manifestPlaceholders = [version: cityVersion]
}
Run Code Online (Sandbox Code Playgroud)
我也尝试在buildTypes中添加manifestPlaceholders,即
buildTypes {
release {
minifyEnabled true
shrinkResources true
manifestPlaceholders = [encoding: deviceEncoding]
manifestPlaceholders = [version: cityIDVersion] …Run Code Online (Sandbox Code Playgroud) 几个星期前,通过Apple指南,它说应用程序应该在尝试建立连接之前检查可访问性状态,并且我已经阅读了应用程序商店拒绝的应用程序,因为没有这样做.
但是,可访问性API最多可能需要30秒(根据Apple文档,我有时也会看到这种情况),以确定是否可以访问.在这种情况下,API返回不可访问.
因此,你可以遇到实际上具有可达性的情况,但是API说你没有,而且你不会发现你做了30秒左右.
等待30秒是不可接受的长 - 特别是如果连接已由用户启动.考虑这种情况:
通过遵循Apple的指导方针来首先检查可达性,很可能会产生绝对糟糕的用户体验,并且应用程序无法联系服务器.
这看起来很荒谬,我肯定错过了什么?
如何在提供响应式应用程序的同时遵循Apple的指导原则?
我在Reacability API中经历了这些延迟,并且想要放弃它 - 因为我已经看到它说没有可达性的情况但是如果你尝试那样,那么我希望我的应用程序无论如何都要尝试连接API说.但如果我这样做,那么应用程序有可能被拒绝?
有这种困境的解决方案吗?
假设这个字符串是英文的,并且要求对文本字符串的特定部分加粗或颜色等:
"word1 word2 WORD3 word4"
这可以通过设置适当范围的属性来完成.
该范围可以硬编码为(13,5),但当然不会是可本地化的.
因此,可以通过知道其必须具有应用粗体的第三个单词来动态地确定范围.
但这也不是本地化的.假设一旦该句子被翻译成语言N,它只包含2个单词,或者包含M语言中的5个单词?
所以我的问题是如何在没有大量硬编码的情况下将属性字符串与本地化结合使用?
即使应用程序在后台,Uber驱动程序应用程序如何接收乘车请求?
它不能是推送通知,因为:
a)如果应用程序被用户终止,则不会向应用程序发送后台推送通知
b)背景推送通知在递送到应用程序的时间方面太不可靠,以便可以立即收到驱动器请求的应用程序是非常重要的(如果设备正在睡觉,后台推送可能无法传递给应用程序几个小时)
c)如果Uber应用程序的通知被禁用,那么它仍然可以收到乘车请求.因此,无法使用背景或前景推送通知来实现乘坐请求.
Voip推送通知将唤醒已终止的应用程序,并且没有与常规推送通知相同的延迟,因此它们非常适合用于乘车请求,但据我所知,优步应用程序不提供任何voip功能用户,因此如果优步驱动程序应用程序正在使用voip后台模式,那么应用商店应该永远不会接受应用程序,因为它会滥用voip后台模式.
那么Uber Driver应用程序如何实现可靠和及时的乘车请求接收?
我正在尝试使用DOMContentLoaded检测DOM何时就绪.
我将以下JavaScript代码注入页面:
var script = document.createElement('script');
script.type = 'text/javascript';
script.text = function addListener() {
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", DOMReady, false);
}
};
function DOMReady() {
document.location.href = "mydomain://anything.stuff";
}
function inject() {
document.getElementsByTagName('head')[0].appendChild(script);
addListener();
}
Run Code Online (Sandbox Code Playgroud)
它被添加:
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
static BOOL injected = NO;
if (!injected)
{
NSBundle *bundle = [NSBundle mainBundle];
NSURL *jsURL = [bundle URLForResource:@"DetectDOMLoaded" withExtension:@"js"];
NSData *jsData = [NSData dataWithContentsOfURL:jsURL];
NSString *jsScriptAsString = [[NSMutableString alloc] initWithData:jsData encoding:NSUTF8StringEncoding];
[self.webView stringByEvaluatingJavaScriptFromString:jsScriptAsString];
[self.webView stringByEvaluatingJavaScriptFromString:@"inject();"];
injected = YES;
}
Run Code Online (Sandbox Code Playgroud)
如果我添加警报调用,我可以看到正在成功调用addEventListener.但是从不调用函数DOMReady().任何想法为什么不呢?
谢谢