Как скрыть или удалить время из строки состояния Apple Watch?

Как мне спрятать или убрать маленькие часы с экрана строки состояния Apple Watch в моем приложении?

Я искал в Интернете это, но ничего не нашел!

Я только что обнаружил, что Apple отклонит ваше приложение, если вы удалите эти часы, но мое приложение само по себе является часовым механизмом и не должно отображать это время.

5 ответов

Решение

Как вы указали, попытка скрыть или удалить время из строки состояния приведет к отклонению вашего приложения.

Пока нет способа выполнить то, что вы хотите, поскольку Apple не позволяет разработчикам создавать собственные циферблаты (даже в watchOS 3).

Обновить:

К вашему сведению, единственная ситуация, когда время не отображается в строке состояния, - это когда модальная презентация имеет заголовок кнопки слева и справа. Обычно это не происходит, но происходит во время диктовки - контроллер ввода текста показывает кнопку " Отмена" слева и кнопку " Готово" справа от строки состояния.

Хотя взлом заголовков панели (или использование частного API) не одобрит ваше приложение, вы можете найти способ "скрыть" саму строку состояния или правильный заголовок любого другого модального представления, которое не происходит с покажи время

Я лишь указываю на это, если вы просто хотите создать конкретное приложение для своего собственного использования. Так как Apple будет отклонять приложения, которые нарушают их требования, я бы не советовал вам тратить время на создание приложения, которое, как вы знаете, будет отклонено.

Это ответ GaétanZ с использованием Swift и Dynamic. (watchOS 7+)

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

Здесь используется частный API, избегайте его использования в приложениях, предназначенных для App Store. Однако есть хитрость ...

Единственное известное мне приложение из App Store, которое скрывает часы, - Clockology. Он использует файл .clock, доступный из внешнего источника, и этот файл .clock делает часы в углу невидимыми (возможно, путем вызова функции, уже существующей в приложении, содержащей код, аналогичный приведенному выше).

Ответ @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 не пытайтесь использовать его в продакшене.

На самом деле нашел способ скрыть наложение времени в проекте с открытым исходным кодом Github.

Вот как это делается (в 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

В watchOS 6 этого можно добиться, переопределив CLKTimeFormaterс timeTextметод. Как и в случае с другими методами, это частный 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 @" "; }));
    }
}
Другие вопросы по тегам