Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
language: objective-c
xcode_project: BeeHive.xcodeproj
xcode_scheme: BeeHive
xcode_sdk: iphonesimulator
xcode_destination: platform=iOS Simulator,OS=9.3,name=iPhone 5s
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
135 changes: 71 additions & 64 deletions BeeHive/BHRouter.m
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ + (id)bh_getReturnFromInv:(NSInvocation *)inv withSig:(NSMethodSignature *)sig {
};

case '@': { // id
id ret = nil;
__unsafe_unretained id ret = nil;
[inv getReturnValue:&ret];
return ret;
};
Expand Down Expand Up @@ -247,69 +247,76 @@ + (BOOL)canOpenURL:(NSURL *)URL
__block BOOL flag = YES;

[pathComponents enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSArray<NSString *> * subPaths = [obj componentsSeparatedByString:BHRURLSubPathSplitPattern];
if (!subPaths.count) {
flag = NO;
*stop = NO;
return;
}
NSString *pathComponentKey = subPaths.firstObject;
if (router.pathComponentByKey[pathComponentKey]) {
return;
}
Class mClass = NSClassFromString(pathComponentKey);
if (!mClass) {
flag = NO;
*stop = NO;
return;
}
switch (usage) {
case BHRUsageCallService: {
if (subPaths.count < 3) {
flag = NO;
*stop = NO;
return;
}
NSString *protocolStr = subPaths[1];
NSString *selectorStr = subPaths[2];
Protocol *protocol = NSProtocolFromString(protocolStr);
SEL selector = NSSelectorFromString(selectorStr);
if (!protocol ||
!selector ||
![mClass conformsToProtocol:@protocol(BHServiceProtocol)] ||
![mClass conformsToProtocol:protocol] ||
![mClass instancesRespondToSelector:selector]) {
flag = NO;
*stop = NO;
return;
}
} break;
case BHRUsageJumpViewControler: {
if (![mClass isSubclassOfClass:[UIViewController class]]) {
flag = NO;
*stop = NO;
return;
}
} break;
case BHRUsageRegister: {
if (![mClass conformsToProtocol:@protocol(BHServiceProtocol)]) {
return;
}
if (subPaths.count < 2) {
flag = NO;
*stop = NO;
return;
}
NSString *protocolStr = subPaths[1];
Protocol *protocol = NSProtocolFromString(protocolStr);
if (!protocol || ![mClass conformsToProtocol:protocol]) {
flag = NO;
*stop = NO;
}
} break;

default:
break;

if (![obj isEqualToString:@"/"]) {

NSArray<NSString *> * subPaths = [obj componentsSeparatedByString:BHRURLSubPathSplitPattern];
if (!subPaths.count) {
flag = NO;
*stop = NO;
return;
}

NSString *pathComponentKey = subPaths.firstObject;
if (router.pathComponentByKey[pathComponentKey]) {
return;
}

Class mClass = NSClassFromString(pathComponentKey);
if (!mClass) {
flag = NO;
*stop = NO;
return;
}

switch (usage) {
case BHRUsageCallService: {
if (subPaths.count < 3) {
flag = NO;
*stop = NO;
return;
}
NSString *protocolStr = subPaths[1];
NSString *selectorStr = subPaths[2];
Protocol *protocol = NSProtocolFromString(protocolStr);
SEL selector = NSSelectorFromString(selectorStr);
if (!protocol ||
!selector ||
![mClass conformsToProtocol:@protocol(BHServiceProtocol)] ||
![mClass conformsToProtocol:protocol] ||
![mClass instancesRespondToSelector:selector]) {
flag = NO;
*stop = NO;
return;
}
} break;
case BHRUsageJumpViewControler: {
if (![mClass isSubclassOfClass:[UIViewController class]]) {
flag = NO;
*stop = NO;
return;
}
} break;
case BHRUsageRegister: {
if (![mClass conformsToProtocol:@protocol(BHServiceProtocol)]) {
return;
}
if (subPaths.count < 2) {
flag = NO;
*stop = NO;
return;
}
NSString *protocolStr = subPaths[1];
Protocol *protocol = NSProtocolFromString(protocolStr);
if (!protocol || ![mClass conformsToProtocol:protocol]) {
flag = NO;
*stop = NO;
}
} break;

default:
break;
}
}
}];

Expand Down