如何隐藏或删除 Apple Watch 状态栏中的时间?

Posted

技术标签:

【中文标题】如何隐藏或删除 Apple Watch 状态栏中的时间?【英文标题】:How to hide or remove the time from the Apple Watch status bar? 【发布时间】:2016-06-28 05:45:50 【问题描述】:

如何在我的应用程序的 Apple Watch 状态栏屏幕上隐藏或移除小时钟?

我在网上搜索了这个但一无所获!

我刚刚发现,如果你删除那个时钟,Apple 会拒绝你的应用,但我的应用本身就是一个表盘,不需要显示那个时间。

【问题讨论】:

相关:Possible to create watch face for Apple Watch? 这能回答你的问题吗? Is it possible to hide the time in the Apple Watch header? 【参考方案1】:

正如您所指出的,尝试从状态栏中隐藏或删除时间会导致您的应用被拒绝。

目前还没有办法完成您想做的事情,因为 Apple 不允许开发人员创建自定义表盘(即使在 watchOS 3 中)。

更新:

请注意,状态栏上没有显示时间的唯一情况是模态演示同时具有左右栏按钮标题。这通常不会发生,但会在听写过程中发生——文本输入控制器在左侧显示一个 Cancel 按钮,在状态栏右侧显示一个 Done 按钮。

虽然破解栏标题(或使用私有 API)不会让您的应用获得批准,但您可能会寻找一种“隐藏”状态栏的方法本身,或任何其他没有显示时间的模态视图的正确标题。

我只是指出这些事情,以防您只是想制作一个特定的应用程序供自己使用。由于 Apple 会拒绝违反其要求的应用程序,因此我不鼓励您浪费时间尝试制作您知道会被拒绝的应用程序。

【讨论】:

那么如何将时钟颜色更改为黑色?我怎样才能做到这一点 ? (我知道我的应用不会是 WatchFace,但会是一个可以作为 WatchFace 工作的酷时钟应用) Apple 不允许您更改状态栏上显示的时间颜色。 所以没有办法!谢谢! 请不要尝试,Apple 不希望我们这样做是有原因的。【参考方案2】:

@Jesús A. Álvarez 的回答在 watchOS 6 上对我不起作用。我改为使用:

@interface PUICApplication : NSObject
+ (instancetype)sharedPUICApplication;
- (void)_setStatusBarTimeHidden:(_Bool)arg1 animated:(_Bool)arg2 completion:(void (^)(void))arg3;
@end

@implementation TSWatchKitExtension

+(void)hideClockTime 
    PUICApplication * application = [NSClassFromString(@"PUICApplication") sharedPUICApplication];
    [application _setStatusBarTimeHidden:YES
                                animated:NO
                              completion: nil];

@end

Ofc 不要尝试在生产中使用它。

【讨论】:

谢谢,这也适用于 watchOS 7 - watchOS 6 的先前方法还取决于接口控制器的配置方式 iirc【参考方案3】:

这是 GaétanZ's answer 使用 Swift 和 Dynamic。 (watchOS 7+)

let app = Dynamic.PUICApplication.sharedPUICApplication()
app._setStatusBarTimeHidden(true, animated: false, completion: nil)

这是使用私有 API,请避免在用于 App Store 的应用中使用它。不过,有个窍门……

我知道的唯一一个隐藏时钟的 App Store 应用是 Clockology。它使用可从外部来源获得的 .clock 文件,并且该 .clock 文件使角落中的时钟不可见(可能通过调用应用程序中已经存在的函数,包含与上述类似的代码)。

【讨论】:

这很有趣…….clock 文件是什么? “从外部来源获得”是什么意思? @freyaariel 这是由 Clockology 处理的任意文件格式。该文件可从 FB 组下载。 感谢@Tamás 的详细说明。他们太狡猾了。【参考方案4】:

实际上找到了一种方法来隐藏Github open-source project 上的时间覆盖。

这是如何完成的(在 Objc 中):

#import "InterfaceController.h"
#import "FaceScene.h"

@import ObjectiveC.runtime;
@import SpriteKit;

@interface NSObject (fs_override)
+(id)sharedApplication;
-(id)keyWindow;
-(id)rootViewController;
-(NSArray *)viewControllers;
-(id)view;
-(NSArray *)subviews;
-(id)timeLabel;
-(id)layer;
@end

@implementation InterfaceController

- (void)didAppear

    /* Hack to make the digital time overlay disappear */

    NSArray *views = [[[[[[[NSClassFromString(@"UIApplication") sharedApplication] keyWindow] rootViewController] viewControllers] firstObject] view] subviews];

    for (NSObject *view in views)
    
        if ([view isKindOfClass:NSClassFromString(@"SPFullScreenView")])
            [[[view timeLabel] layer] setOpacity:0];
    


@end

【讨论】:

这不再适用于 Watch OS 6。有没有人有更新的黑客来隐藏时间?【参考方案5】:

在 watchOS 6 上,可以通过覆盖 CLKTimeFormatertimeText 方法来实现。 与其他方法一样,这是私有 API,因此您不应在打算发布的应用上使用它。

+ (void)hideTime 
    Class CLKTimeFormatter = NSClassFromString(@"CLKTimeFormatter");
    if ([CLKTimeFormatter instancesRespondToSelector:@selector(timeText)]) 
        Method m = class_getInstanceMethod(CLKTimeFormatter, @selector(timeText));
        method_setImplementation(m, imp_implementationWithBlock(^NSString*(id self, SEL _cmd)  return @" "; ));
    

【讨论】:

以上是关于如何隐藏或删除 Apple Watch 状态栏中的时间?的主要内容,如果未能解决你的问题,请参考以下文章

当 Apple Watch 处于后台状态或睡眠模式时,我们如何从 iphone 向 Apple Watch 发送消息?

Apple Watch:删除接口控制器的状态栏

onCreateOptionsMenu中的expandActionView永久删除或隐藏操作栏中的其他菜单项

了解隐藏在状态栏中的幻数

如何在 Xcode 中创建 Apple Watch 应用或配置 Apple Watch 应用

Xcode 不部署或启动 Apple Watch 模拟器